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>