SpringMVC注释(个人学习版)
来源:互联网 发布:linux sort k 编辑:程序博客网 时间:2024/06/10 00:26
1.@Controller
从注解的名字就可以看出,它是用来定义控制器的。首先控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。在传统的MVC中,我们要创建相应的Servlet类,通过HttpServletRequest 和HttpServletResponse等HttpServlet对象,对页面中的值进行获取和处理,并且需要在XML文件中进行相应的配置。这个过程极其的麻烦。
而我们使用@Controller就变的很简单。首先通过注解@Controller可以告诉sping这个类是一个Controller。然而我们要通过在配置文件中写出配置信息来告诉spring去哪里找控制器类。
如下:
<context:component-scan base-package="com.sping.springmvc"></context:component-scan>
这种写法,是自动扫描所有包含com.sping.springmvc前缀的包。
然后更加精确的写法就是:
<context:component-scan base-package="com.sping.springmvc.controller"></context:component-scan>
我们直接所有的控制器文件放在这个包下就可以了。
2.@RequestMapping
当我们已经给一个类变成了Controller,但是spring怎么知道这个控制器要处理哪个请求呢?这就需要@RequestMapping注解(分发处理器将会扫描使用了@Controller的类的方法,并检测该方法是否使用了@RequestMapping 注解)。
@Controller@RequestMapping("book") // 设置那些URL可以访问这个类@RequestMapping("/book") //两种写法一样public class BookController { @RequestMapping("select") // 修饰方法,设置哪个URL可以访问当前方法 public String select() { System.out.println("所有图书"); return "success"; }}
3.URI模板
有这样一个场景,我们要在看小说的时候,我们可能会点击一本书中的不同章节,然而在同一本的链接目录下,如何区分我们点击的是那一章呢?这时候就用到了URI模板。比如我们访问http://localhost/sping/book/{variable},我们可以给variable传不同的值,然后通过映射来访问不能的页面。
@Controller@RequestMapping("book/{value1}") public class BookController { @RequestMapping("select/{bookid}") public String select(@PathVariable String value1,@PathVariable("bookid") Integer bookId) { System.out.println("在书" + value1 + "中查看章节号为" + bookId + "的章节"); return "success"; }}
URI模板可以再类和方法中使用。比如访问http://localhost/spring/book1/10,控制台就会输出“在书book1中查看章节号为10的章节”。
这俩面要注意@PathVariable括号中的内容,如果变量名和参数名相同,则直接在注解后接参数就可以;如果变量名和参数名不同,需要在括号中指定变量名和哪个参数对应。
@RequestMapping还支持通配符“*”:
@Controller@RequestMapping("/book") public class BookController { @RequestMapping("*/select") public String select() { System.out.println("return success"); return "success"; }}
这样我们可以访问/book/anyone/select页面中的内容。
4.用@RequestParam绑定请求参数到控制器方法参数
和@PathVariable相类似,@RequestParam也是用来绑定参数的注解。用法也是相似的。
@RequestMapping("login") public String login(@RequestParam(required=false) Integer userId,@RequestParam("password") String password){ System.out.println(userId); System.out.println(password); return "success"; }
这里我们也同样要指定请求参数和方法参数的对应关系。
属性required ,它表示所指定的参数是否必须在request 属性中存在,默认是true ,表示必须存在,当不存在时就会报错。我们可以在请求参数中不传入usreId,但是不能缺少password。
虽然我们运用了@RequestParam和@RequestVariable等“高级”的用法,但是不代表我们不可以使用HttpServletRequest,HttpServletResponse,HttpServletSession等原生方法。
@RequestMapping("insert") public String insert(EmpEntity entity,HttpServletRequest req){ entity.setEmpId(Integer.valueOf(req.getParameter("empID"))); System.out.println(entity); return "success"; }
正如上面的代码所示,我们仍然可以利用HttpServletRequest 来获取请求参数。
而在传入的第一个参数我们看到是一个实例变量。这也是springmvc的一个特殊的用法。比如我们在注册用户信息的时候,会在页面中所有的用户信息,而这些信息也会在实体类中进行封装。所以我们直接传入一个实体类实例,就可以完成所有请求参数的接受。
5.使用 @ModelAttribute 和 @SessionAttributes 传递和保存数据
在传统的mvc中,我们通常利用req.setAttribute()和req.getSession().setAttribute()两种方法来存储和传递数据。
而在springmvc中,可以使用ModelAttribute 和 @SessionAttributes 传递和保存数据。而@ModelAttribute可以放在方法上面,也可以放在方法的参数里。
class User{ private String userName; public User(String user){ setUserName(user); } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; }}@Controller@RequestMapping("Modeltest")public class ModelAttributeTest { @ModelAttribute ( "world" ) public String getModel() { System. out .println( "-------------world---------" ); return "world" ;//此处会将返回值保存在模型模型中(world) } @RequestMapping ( "sayHello" ) public void sayHello( @ModelAttribute ( "world" ) String world,@ModelAttribute ( "user2" ) User user, Writer writer, HttpSession session) throws IOException { writer.write( "Hello " + world + " , Hello " + user.getUserName()); writer.write( "\r" ); } @ModelAttribute ( "user2" ) public User getUser() { System. out .println( "---------getUser-------------" ); return new User("user2" );//将一个对象保存在模型中(user2) }}
当我们访问Modeltest/sayHello时,程序会自动将@ModelAttribute()中的值传入方法形参中。
@SessionAttributes 的使用请查看链接:SessionAttribute
6.使用Model 保存和向前台页面传递数据
后台代码:
@RequestMapping("user")public class UserController { @RequestMapping("convert") public String convert(UserEntity user, Model model) { model.addAttribute("userEntity", user);// return "success"; }}
jsp页面:
<%@ 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></head><body>${requestScope.userEntity.userId }<br>${requestScope.userEntity.userName }<br>${requestScope.userEntity.userSalary }<br>${requestScope.userEntity.userBirthday }</body></html>
这里我们可以通过传一个model参数,通过model.addAttribute(key,value)的方式将要保存的值放在模型中,这样就可以将值传到jsp页面中,这种做法类似与req.setAttibute和session.setAttibute,所以更容易理解。
7.@RequestMapping高级用法
1.params属性
@RequestMapping(value = ” path ” , params = { param1 [ , … ] } )
@RequestMapping (value= "testParams" , params={ "param1=value1" , "param2" , "!param3" }) public String testParams() { System. out .println( "test Params..........." ); return "testParams" ; }
我们用@RequestMapping 的params 属性指定了三个参数,这些参数都是针对请求参数而言的,它们分别表示参数param1 的值必须等于value1 ,参数param2 必须存在,值无所谓,参数param3 必须不存在,只有当请求/testParams.do 并且满足指定的三个参数条件的时候才能访问到该方法。
2.method属性
这个属性一般我们在使用REST Ful风格 的时候会用到它。
REST Ful风格:
关于REST Ful风格的介绍可以参照REST Ful及相关用法
简单来讲,REST Ful中包含使用HTTP协议的四个动词表示程序中四个基本操作:
GET:查询
POST:添加
PUT:修改
DELETE:删除
我们在编写表单的时候,可能会使用特定的提交方法,尤其是PUT,DELETE,如何让服务器识别并且正确的跳转的相应的处理方法呢?这里就要使用method属性。这里注意的是,Tomcat1.8版本之后是默人不支持PUT和DELETE的,如果需要修改相应服务器配置。
jsp页面:
<form action="test/user/100"> <button type="submit">查询</button> </form> <form action="test/user" method="POST"> <button type="submit">添加</button> </form> <!-- HiddenHttpMethodFilter类中的doFilterInternal()方法,会先判断请求是get还是post模式 --> <!-- 如果是get模式,则doFilterInterval()不进行处理,如果是post模式,则查看请求红是否有_method的值,如果有,则改成相应模式 --> <form action="test/user" method="POST"> <input type="hidden" name="_method" value="PUT" /> <button type="submit">修改</button> </form> <form action="test/user" method="POST"> <input type="hidden" name="_method" value="DELETE" /> <button type="submit">删除</button> </form>
后台代码:
@RequestMapping("user/{userId}") public String select(@PathVariable Integer userId) { System.out.println(1); return "success"; } @RequestMapping(value = "user", method = RequestMethod.POST) public String insert() { System.out.println(2); return "success"; } @RequestMapping(value = "user", method = RequestMethod.PUT) public String update() { System.out.println(3); return "success"; } @RequestMapping(value = "user", method = RequestMethod.DELETE) public String delete() { System.out.println(4); return "success"; }
当我们一次点击这四个提交按钮时,控制台就会顺次打印1,2,3,4。
虽然我们做到了让服务器执行不同提交类型的方法,但是PUT,DELETE说到底还是POST类型。
我们也需要在配置文件中做相应配置:
web.xml
<filter> <filter-name>HiddenHttpMethodFilter</filter-name> <!-- HiddenHttpMethodFilter类将post模式转换put或delete模式 --> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
HiddenHttpMethodFilter类中的doFilterInternal()方法,会先判断请求是get还是post模式
如果是get模式,则doFilterInterval()不进行处理,如果是post模式,则查看请求红是否有_method的值,如果有,则改成相应模式。
3.headers属性
@RequestMapping (value= "testHeaders" , headers={ "host=localhost" , "Accept" }) public String testHeaders() { return "headers" ; }
headers 属性的用法和功能与params 属性相似。在上面的代码中当请求/testHeaders.do 的时候只有当请求头包含Accept 信息,且请求的host 为localhost 的时候才能正确的访问到testHeaders 方法。
关于更多@RequestMapping可以参照刚才的链接。
[部分内容转自链接] http://www.cnblogs.com/xiepeixing/p/4243288.html
- SpringMVC注释(个人学习版)
- 个人学习-java-springmvc
- java个人学习笔记02(注释+数据类型+算术逻辑运算)
- 个人学习-java-springmvc-转换器
- Java学习个人备忘录之文档注释
- springMVC学习,个人入门学习小结。
- 学习springmvc的注释搭建框架
- 7.26--SSH学习之SpringMVC控制器注释
- (个人开源)nginx源码注释
- SpringMvc中的开启注释(整理)
- SpringMVC专题——SpringMVC的流程(个人理解)
- SpringMVC 常用注解(个人笔记)
- 一个简单的个人通讯录(基于二叉排序树)(加注释版~~~~)
- do_bootm()函数个人注释
- IoConnectInterrupt个人注释
- 个人C++注释规范
- myeclipse个人注释模板
- SpringMvc 注释详解
- PPT九大提高效率实用技巧分享(要收藏哟!)
- MYSQL知识点(一)
- HashMap的底层原理及源码分析
- 外网访问局域网中的web服务器
- Java中对Number型对象进行格式化以及解析字符串成Number型
- SpringMVC注释(个人学习版)
- Leetcode之Longest Consecutive Sequence 问题
- UltraEdit 激活方法
- 435. Non-overlapping Intervals(贪心)
- oracle中to_number字符串转数字、max取最大值、dbms_random.value生成随机数及对小数做截取,四舍五入操作的函数
- 343. Integer Break
- MongoDB-创建索引
- java 继承的隐藏与覆盖典例
- 一些C文件函数fseek(),ftell(),rewind()