springMvc常用注解

使用springMvc注解的提前是需要在springMvc的配置文件中加入注解的bean

 

<mvc:annotation-driven />  <!-- 支持spring3.0新的mvc注解 -->
<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 ,使用ajax请求时用到-->
	<bean
		class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		<property name="cacheSeconds" value="0" />
		<property name="messageConverters">
			<list>
				<bean
					class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
			</list>
		</property>
	</bean>

1,@Controller 使用Controller注解将对应的java类定义成控制器,用来处理url中的请求,在springMvc的配置文件中加入:

<!-- 对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
<context:component-scan base-package="edu.hue.jk.action" />     能够完成控制器的自动注入

2,@RequestMapping    如果定义在类上,则将url映射到类上;如果定义在方法上,则将对应的url映射到具体的方法上,通过params来指定具体映射到哪个方法

应用一个小例子,说明其用法:

bean的定义:

@Entity
public class User {
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private int userId;
	@Column(name="user_name")
	private String userName;
	@Column(name="user_pass")
	private String userPass;
	
注册页面的form:
<form action="register.do" method="post">
		<input type="hidden" name="method" value="1">
		<table>
			<tr>
				<td>userName:</td>
				<td><input type="text" name="userName"></td>
			</tr>
			<tr>
				<td>passWord:</td>
				<td><input type="password" name="userPass"></td>
			</tr>
			<tr>
				<td colspan="2"> <input type="submit" value="submit"></td>
			</tr>
		</table>
	</form>

结果显示页面:

<body>
	

	<p>userName:${requestScope.user.userName}</p>
	<p>passWord:${user.userPass}</p>
	<p>register successful</p>
</body>

控制器定义:
@Controller   // 使用Controller注解将对应的java类定义成控制器,用来处理url中的请求
@RequestMapping("/register.do")        // 如果定义在类上,则将url映射到类上
public class UserController {
	@Autowired
	private UserDao userDao;
	@RequestMapping(params="method=1") // 如果定义在方法上,则将对应的url映射到具体的方法上,通过params来指定具体映射到哪个方法
	public String addUser(User u,ModelMap map){
		userDao.addUser(u);
		map.put("user", u);  //将对象放入到ModelMap中,作用范围为request
		return "home";
	}
运行:
结果:

3,@RequestParam  用在页面上的属性名与形参名不一致的时候:

上面的例子,当form中的页面的用户属性名和bean中定义的属性名不同时,则需要使用到该注解 ,例如form改成:

<form action="register.do" method="post">
		<input type="hidden" name="method" value="2">
		<table>
			<tr>
				<td>userName:</td>
				<td><input type="text" name="name"></td>
			</tr>
			<tr>
				<td>passWord:</td>
				<td><input type="password" name="passWord"></td>
			</tr>
			<tr>
				<td colspan="2"> <input type="submit" value="submit"></td>
			</tr>
		</table>
	</form>
对应的控制器应该修改成:

@RequestMapping(params="method=2")
	public String addUser(@RequestParam("name") String userName,@RequestParam("passWord") String userPass,ModelMap map){
		User u=new User();  //用来将页面上的name属性赋给参数userName,用在页面中的属性名与形参名不对应的时候
		u.setUserName(userName);
		u.setUserPass(userPass);
		userDao.addUser(u);
		map.put("user", u);  //将对象放入到ModelMap中,作用范围为request
		return "home2";
	}

需要注意的是:此时若访问的URL中没有name和passWord参数时,会报404错误,这是因为@RequestParam()方法中默认的required属性为true

其中的属性值:

value:传入的请求参数的名字例如(name,passWord)

required:请求的参数是否为必须,默认为True

defaultValue  :参数的默认值

属性写全:

public String addUser(@RequestParam(value="name",defaultValue="123",required=false) String userName,@RequestParam("passWord") String userPass,ModelMap map)

4,@ModelAttribute   既可以用在方法上,也可以用在参数上

如果用在参数上,可以用来将请求参数(一般将form表单postt提交的数据)绑定到对象上;

如果用在方法上,可以向ModelMap中添加属性,需要注意的是,当@ModelAttribute使用在方法上时,映射到controller时会首先调用@ModelAttribute注解的方法向ModelMap中添加属性,之后如果再次调用有@ModelAttribute注解的参数的函数时候,如果使用了@ModelAttribute中同名的属性,则会覆盖原有的数据,看下面的例子:

controller中的部分方法:

	
	@ModelAttribute("user")
	public User getUser(){
		User result=new User();
		System.out.println("*****************************************");
		result.setUserId(345);
		result.setUserName("userName");
		result.setUserPass("passWord");
		System.out.println("userId:"+result.getUserId());
		System.out.println("userName:"+result.getUserName());
		System.out.println("userPass:"+result.getUserPass());
		return result;
	}
	@RequestMapping(params="method=4")
	public String addUser4(@ModelAttribute("user")User u,ModelMap map){  //将容器中的属性赋给形参
	  //用来将页面上的name属性赋给参数userName,用在页面中的属性名与形参名不对应的时候
		System.out.println("userId:"+u.getUserId());
		System.out.println("userName:"+u.getUserName());
		System.out.println("userPass:"+u.getUserPass());
		
		map.addAttribute("user", u);
		return "home3";
	}

访问的URL为:  xxx/register.do?userName=aaa&passWord=bbb&method=4

首先会调用getUser()方法向ModelMap中存放名为‘user’的实体,ID:345,userName:“userName”,passWord:“passWord”

然后会调用addUser4方法,该方法的参数(@ModelAttribute("user")User u,使用了ModelMap中已经存在的数据,所以会跟新原有的数据

使得“user”实体的ID:345userName=aaa,passWord=bbb运行结果:

 *****************************************
userId:456
userName:userName1
userPass:passWord1
userId:456
userName:aaa
userPass:bbb

5,@SessionAttributes  用来将ModelMap中的属性放入到Session中,由于ModelMap默认是放入到Request中,所以当使用了SessionAttributes之后,对应的属性既在Request中,也在Session中。

当使用@SessionContributes注解controller之后,首先会调用@ModelAttribute注解的方法,如果ModelMap中的数据已经存在则不执行该方法;然后执行@RequestMapping映射的方法,如果该方法的参数包含有使用@ModelAttribute注解同名数据的参数,则会跟新ModelMap中的数据;需要注意的是,使用@SessionAttributes注解控制器类之后一定是从ModelMap中取得同名的命令对象放到Session中,如果模型数据中不存在将抛出HttpSessionRequiredException Expected session attribute ‘user’(Spring3.1)

或HttpSessionRequiredException Session attribute ‘user’ required - not found in session(Spring3.0)异常。看下面的例子:

	@ModelAttribute("user")
	public User getUser(){
		User result=new User();
		System.out.println("*****************************************");
		result.setUserId(345);
		result.setUserName("userName");
		result.setUserPass("passWord");
		System.out.println("userId:"+result.getUserId());
		System.out.println("userName:"+result.getUserName());
		System.out.println("userPass:"+result.getUserPass());
		return result;
	}
	
	@ModelAttribute("user")
	public User getUser1(){
		User result=new User();
		System.out.println("*****************************************");
		result.setUserId(456);
		result.setUserName("userName1");
		result.setUserPass("passWord1");
		System.out.println("userId:"+result.getUserId());
		System.out.println("userName:"+result.getUserName());
		System.out.println("userPass:"+result.getUserPass());
		return result;
	}
	@RequestMapping(params="method=4")
	public String addUser4(@ModelAttribute("user")User u,ModelMap map){  //将容器中的属性赋给形参
	  //用来将页面上的name属性赋给参数userName,用在页面中的属性名与形参名不对应的时候
		System.out.println("userId:"+u.getUserId());
		System.out.println("userName:"+u.getUserName());
		System.out.println("userPass:"+u.getUserPass());
		
		map.addAttribute("user", u);
		return "home3";
	}

访问的URL为: xxx/register.do?userName=aaa&passWord=bbb&method=4结果:

*****************************************
userId:345
userName:userName
userPass:passWord
userId:345
userName:aaa
userPass:bbb

说明首先调用getUser()方法将“user”放入到ModelMap中,再次调用getUser1()的时候,由于“user”已经存在,所以不执行该方法,最后执行addUser4()方法由于使用了(@ModelAttribute("user"),所以会将ModelMap中的数据更新

最后将getUser和getUser1两个方法位置调换,则结果为:

*****************************************
userId:456
userName:userName1
userPass:passWord1
userId:456
userName:aaa
userPass:bbb

 6.@PathVariable  

@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上(这个看了好多连接和资料都还没有测试出来demo例子,待研究)。

 

7,@Value    springMvc3.0之后提供的注解,可以用来将properties文件中的属性值注入到controller类中,使用的时候需要在applicationContext.xml文件中配置名称空间:

xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/util 
http://www.springframework.org/schema/util/spring-util-3.1.xsd
"

然后需要配置properties文件的id和位置:

<util:properties id="testFile" location="WEB-INF/test.properties" />  

在WEB-INF目录下新建test.properties文件 并配置  aaa=111

@Controller
@RequestMapping("test.do")
public class ValueController {
	String path;

	public String getPath() {
		return path;
	}
	 @Value("#{testFile['aaa']}")     //取出配置文件中id为testFile的properties文件中的abc的值给path,可以用来设置文件路径
	public void setPath(String path) {
		this.path = path;
	}
	@RequestMapping(params="method=1")
	String show(){
		System.out.println("path:"+path);
		return "home";
	}

8,@ResponseBody    用在ajax请求的时候,使用在任何对象上SpringMvc都会完成对象到json的转换,注册的例子:

controller定义:

@Controller
@RequestMapping("tt.do")
public class PathController {
	@RequestMapping(params="method=2")
	public @ResponseBody User test2(User u){  //返回User对象
		return u;
	}
}
使用jquery提供的ajax方法请求控制器的代码:
<pre name="code" class="html"><%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="Scripts/jquery-2.1.1.js"></script>
<script type="text/javascript">
	
$(function(){
	$("#bt").click(function(){
		var name=$("#name").val();
		var pass=$("#pass").val();
		$.ajax({
  			type: "post",
              dataType:'json', //接受数据格式 
              cache:false,
              data:{"userName":name,"userPass":pass,"method":"2"},  //传递的数据
              url: "tt.do",         //访问的地址
              beforeSend: function(XMLHttpRequest){
              },
              success: function(data){
            	  //先清除原有的子标签:
            	  $("#result").empty();
            	  //使用jquery创建元素标签
               		var name=$("<p></p>").text(data.userName);
               		var pass=$("<p></p>").text(data.userPass);
               	// 在结果显示区的后面添加标签
               		$("#result").append("结果信息显示:");
               		$("#result").append(name,pass);
               },
              error: function(){
              //请求出错处理
                  alert("Error!");
              }
           });
	});
});
</script>
</head>
<body>
	<table>
			<tr>
				<td>userName:</td>
				<td><input type="text" name="userName" id="name"></td>
			</tr>
			<tr>
				<td>passWord:</td>
				<td><input type="password" name="userPass" id="pass"></td>
			</tr>
		</table>
	<input type="button" id="bt" value="提交">
	<div id="result">
	</div>
</body>
</html>



结果演示:




 

 

 


 

发布了47 篇原创文章 · 获赞 4 · 访问量 5万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章