关于注解的汇总

1.@Component  将一个类作为实体类放入Spring容器中,

之后在spring 配置文件里面写一句这个

<context:component-scan base-package="com.hanqi.dao" />

 2.@Repository  将一个类作为业务逻辑处理层放入Spring

3.@Controller   注释定义该类作为一个 Spring MVC 控制器   ,@RequestMapping 注释用于映射 URL 到整个类或一个特定的处理方法。

    testController

/*DispatcherServlet 发送请求到控制器中执行特定的功能*/

@Controller  /* @Controller 注释定义该类作为一个 Spring MVC 控制器*/
public class TestController {
     @RequestMapping("/helloworld2") 
     /*第一次使用的 @RequestMapping 表明在该控制器中处理的所有方法都是相对于 /helloworld2 路径的*/
     public String hello() {
    	 return "success";
     }
}

 springMvc.xml配置文件

<context:component-scan base-package="com.hanqi.controller.TestController"></context:component-scan>
 		
 		<!-- 视图解析器 -->
 		<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
 			<property name="suffix" value=".jsp"></property>  <!-- 后缀名 -->
 			<property name="prefix" value="WEB-INF/page"></property> <!--  前缀名 -->
 		</bean>

 4.@Autowired 注释对在哪里和如何完成自动连接提供了更多的细微的控制。

@Autowired 注释可以在 setter 方法中被用于自动连接 bean,就像 @Autowired 注释,容器,一个属性或者任意命名的可能带有多个参数的方法。

属性中的 @Autowired

你可以在属性中使用 @Autowired 注释来除去 setter 方法。当时使用 为自动连接属性传递的时候,Spring 会将这些传递过来的值或者引用自动分配给那些属性。

TextEditor.java

public class TextEditor {
   @Autowired
   private SpellChecker spellChecker;
   public TextEditor() {
      System.out.println("Inside TextEditor constructor." );
   }  
   public SpellChecker getSpellChecker( ){
      return spellChecker;
   }  
   public void spellCheck(){
      spellChecker.checkSpelling();
   }
}

 Beans.xml

<context:annotation-config/>

   <!-- Definition for textEditor bean -->
   <bean id="textEditor" class="com.tutorialspoint.TextEditor">
   </bean>

   <!-- Definition for spellChecker bean -->
   <bean id="spellChecker" class="com.tutorialspoint.SpellChecker">
   </bean>

 5.@RequestParam  如果前台传来的参数,后台接收不一致的话,在你自己写的名字前面加一个注解

@RequestMapping("/helloworld2")
	public ModelAndView helloWorld(  
			ModelAndView mav, //自动填充的参数,而不是手动输入的,返回一个视图层对象
			@RequestParam("aabbcc")String username) {  
				//如果前台传来的参数,后台接收不一致的话,在你自己写的名字前面加一个注解@RequestParam
		// ModelAndView mav = new ModelAndView();  暂且不用了
	System.out.println(username);
		AppUser user = new AppUser();
		user.setRealname("超级管理员2");
		mav.addObject("currentUser", user); // 相当于request.setAttribute();
		mav.setViewName("success"); // request.getServletDispatcher........  请求转发
		return mav;
	}

 6.@PathVariable  动态跳转的解析器

   //有好几个页面,只要在地址栏里面输入不同的地址,就可以实现不同页面的跳转
	@RequestMapping("test/{cpath}") //test定义的是请求,{}里面是传进去的一个参数,给path
	public String testDynaicParam(@PathVariable("cpath")String path) {//动态跳转的解析器
		System.out.println(path);
		return path;
	}

 7.@SessionAttributes sessionAttribute注解只能写在类上
 代表的是将当前controller类中某一个Model类中的属性添加到session对象中

1.默认情况下Spring MVC将模型中的数据存储到request域中。当一个请求结束后,数据就失效了。如果要跨页面使用。那么需要使用到session。而@SessionAttributes注解就可以使得模型中的数据存储一份到session域中。

2.@SessionAttributes  参数类型

  1、names:这是一个字符串数组。里面应写需要存储到session中数据的名称。

  2、types:根据指定参数的类型,将模型中对应类型的参数存储到session中

    3、value:其实和names是一样的。

@SessionAttributes(value={"names"},types={Integer.class})

 controller 页面

@SessionAttributes(value={"names"},types={Integer.class})
 2 @Controller
 3 public class Test {
 4 
 5     @RequestMapping("/test")
 6     public String test(Map<String,Object> map){
 7         map.put("names", Arrays.asList("caoyc","zhh","cjx"));
 8         map.put("age", 18);
 9         return "hello";
10     }
11 }

 JSP页面

、request中names:${requestScope.names}<br/>
2 2、request中age:${requestScope.age}<br/>
3 <hr/>
4 3、session中names:${sessionScope.names }<br/>
5 4、session中age:${sessionScope.age }<br/>

 打印出来

 ModelAndView作用:

 1)ModelAndView 用于后台与前端页面交互;

  2)可以用于重定向与转发到指定页面,

  3)可以保存数据然后渲染到页面

@Controller
@SessionAttributes("user1")
@RequestMapping(value="/testController")  //默认的前面有一个value
public class TestController {

            @RequestMapping("/test7")
	public ModelAndView test7(ModelAndView mav) {
		mav.addObject("user1", "aaaa");  //相当于request.setAttribute();
		mav.setViewName("page/success");  // request.getServletDispatcher........  请求转发
		return mav;
	}

}

 8.@ResponseBody   将方法的返回值直接作为结果返回回去,通常用来做ajax参数的传递

@Controller
@RequestMapping(value="/testController")
public class TestController {

        @ResponseBody
	@RequestMapping("/test8")    //@ResponseBody   将方法的返回值直接作为结果返回回去,通常用来做ajax参数的传递
	public String test8(String username, String password) {
		StringBuffer buffer = new StringBuffer("{"success":");
		if("admin".equals(username) && "123".equals(password)) {
			buffer.append("true}");
		} else {
			buffer.append("false}");
		}
		return buffer.toString();
	}
}
<script type="text/javascript" src="js/jquery-3.2.1.min.js"></script>
<script type="text/javascript">
$(function() {
	$("#btn").click(function() {
		var f = $("#formData").serializeArray();
		$.ajax({
			type:"post",
			url:"testController/test8.form",
			data:f,
			dataType:"json",
			success:function(data) {
				console.log(data);
			},
			error:function(msg) {
				alert(msg.responseText);
			}
		});
	});
	
});
</script>




<body>

       <a id="btn" href="#">测试链接8</a><br>
</body>

9.@ModelAttribute   注解只支持一个属性

@Controller
@RequestMapping("/modelAttr")
public class TestModelAttribute {

	/*
	 * 1, 单独修饰方法 含有@ModelAttribute注解的方法会优先于其他方法执行
	 */
	@ModelAttribute("uname")
	public String getUsername(String username) {
		System.out.println(1);
		/**
		 * 相当于request.setAttribute("uname", username);
		 */
		return username;
	}

	@RequestMapping("/test1")
	public String test1(String username) {
		System.out.println(2);
		return "page/success";
	}

	/*
	 * 2, 与@RequestMapping同时修饰一个方法 
	 * 当@ModelAttribute和@RequestMapping同时修饰一个方法的时候
	 * 返回值不再作为视图层的地址, 这个方法执行完毕之后, 
	 * 相当于运行了一行 request.setAttribute("param1","page/success"); 
	 * 同时, RequestMapping中的url作为视图层
	 */
	@ModelAttribute("param1")
	@RequestMapping("/test2")
	public String test2() {
		return "page/success";
	}

	/*
	 * 3, 修饰方法中的参数,只能修改为空的成员变量
	 */
	@ModelAttribute("param2")
	public Dept getDept(Dept dept) {
		System.out.println("------------" + dept.getDname());
		dept.setDname("修改后的值");
		dept.setLoc("地址");
		System.out.println("+++" + dept);
		return dept;
	}

	@RequestMapping("/test3")
	public String test3(@ModelAttribute("param2") Dept dept) {
		System.out.println("==============" + dept);
		return "page/success";
	}


	//参数是必须要有的,如果前台没有传来数据的话,就采用默认值
	@RequestMapping("/test4")
	public String test3(
			@RequestParam(
					value="str2", 
					 defaultValue="jahsgdfjhsagdjsa", 
					required=false)   
			String str) {
		System.out.println(str);
		return "page/success";
	}
}

10.request.getContextPath()

   <%=request.getContextPath()%>是为了解决相对路径的问题,可返回站点的根路径。

request.getContextPath()应该是得到项目的名字,如果项目为根目录,则得到一个"",即空的字条串。如果项目为abc, <%=request.getContextPath()% > 将得到abc,服务器端的路径则会自动加上

    1.request.getScheme()可以返回当前页面使用的协议;默认返回http,SSL时返回https;

    2. request.getServerName()可以返回当前页面所在的服务器的名字;

    3.equest.getServerPort()可以返回当前页面所在的服务器使用的端口,就是项目在服务器上发布的 端口,或者在本地tomcat容器运行时发布的端口

    4.request.getContextPath()可以返回当前页面所在的应用的名字;

 11.@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML

  数据,需要注意的呢,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

   其他知识点

testcontrller.java

@Controller
@SessionAttributes("user1")
@RequestMapping(value="/testController")  //默认的前面有一个value
public class TestController {

	// 现在表示这个方法只接收POST方式发送的请求
	@RequestMapping(value="/test1", method=RequestMethod.POST)  /*传多个参数时,用逗号隔开,requestmethod是枚举类型
	不去定义的话,post方式,get方式默认的都是可以的,超链接都是get方式*/
	public String test1() {
		return "page/success";
	}
	
	@RequestMapping("/test2")
	public String test2(AppUser user) {   // 自动封装一个实体类
		// System.out.println(username+": "+password);
		System.out.println(user);
		return "page/success";
	}
	
	@RequestMapping("/test3")
	public String test3(String username, int password) {  //如果password在前台传来的是数字,但他是字符串型的,依然可以接收
		// System.out.println(username+": "+password);
		System.out.println(password);
		return "page/success";
	}
	
	@RequestMapping("/test4")
	public String test4(@DateTimeFormat(pattern="yyyy-MM-dd") //日期的处理
						Date birthday) {
		System.out.println(birthday);
		return "page/success";
	}
	
	@RequestMapping("/test5")
	public String test5(AppUser user) {  //前台传进来的日期格式化,在类里面进行注解来处理
		System.out.println(user);
		return "page/success";
	}
	
	@RequestMapping("/test6")
	public String test6(AppUser user) { //想要实现的就是同时接收到两个类里面的内容
		System.out.println(user);
		return "page/success";
	}

            }    

 index.jsp

<body>
<a href="modelAttr/test1.form">测试链接1</a><br>
<a href="modelAttr/test2.form">测试链接2</a><br>
<a href="modelAttr/test3.form?dname=SAIL">测试链接3</a><br>
<a href="modelAttr/test4.form">测试链接4</a><br>
<hr>
<a href="testController/test1.form">测试链接</a><br>
<a href="testController/test2.form?username=admin&password=222">测试链接2</a><br>
<a href="testController/test3.form?password=222">测试链接3</a><br>
<a href="testController/test4.form?birthday=2017-12-12">测试链接4</a><br>
<form action="testController/test5.form" method="post">
	username: <input name="username" /><br>
	password: <input name="password" /><br>
	hiredate: <input type="date" name="hiredate" /><br>
	提交: <input type="submit" value="Submit" /><br>
</form>
<br>
<form action="testController/test6.form" method="post"> <--!想要实现的就是同时接收到两个类里面的内容-->
	username: <input name="username" /><br>
	password: <input name="password" /><br>
	hiredate: <input type="date" name="hiredate" /><br>
	dname: <input name="dept.dname" /><br>   <!--APPuser类里面的dept变量,直接可以点出来那个Dept类里面的变量-->
	提交: <input type="submit" value="Submit" /><br>
</form>
<br>
<a href="testController/test7.form">测试链接7</a><br>
<a id="btn" href="#">测试链接8</a><br>
<form id="formData">
	username: <input name="username" /><br>
	password: <input name="password" /><br>
</form>
</body>

 Appuser.java

private String username;
	private String password;
	@DateTimeFormat(pattern="yyyy-MM-dd")
	private Date hiredate;  //如果用表单方式提交的话,又是传进去的实体类,就需要进行一下日期的格式转换了
	private Dept dept;  //还有一个部门类

	public Dept getDept() {
		return dept;
	}

	public void setDept(Dept dept) {
		this.dept = dept;
	}

	public AppUser(String username, String password) {
		super();
		this.username = username;
		this.password = password;
	}

 Dept.java

private String dname;
	private String loc;
	public Dept() {
		super();
	}

	public Dept(String dname) {
		super();
		this.dname = dname;
	}

 success.jsp  访问成功页面

<body>
${uname }
<hr>
<h1>访问成功的页面 !</h1>
${requestScope.user1 }<br>  <!--作用域 @SessionAttributes  -->
${sessionScope.user1 }<br>
</body>
原文地址:https://www.cnblogs.com/zuo72/p/8401582.html