Spring MVC框架——基本应用全解

缺乏、安全感 2022-05-18 07:40 316阅读 0赞

打个广告,帮朋友卖点东西,东西超便宜的哟,厂家直接出货,绝对低于市场价!!! **一般都比市场价便宜3—7折【都是牌子货】,如果您感兴趣,可以扫描屏幕下方的二维码,感谢关注!!!**

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIyMTcyMTMz_size_16_color_FFFFFF_t_70 微信


一、入门内容

1、运行原理图

70

对比:Struts2执行流程

 strutsPrepareAndExcuteFilter拦截请求(控制层),拦截请求,转发请求

 寻找Action执行

 ActionProxy:strutsActionProxy extends defaultActionProxy

 ActionMapping去寻找执行类Action

2、与struts2的对比

  • 实现机制:Springmvc基于servlet实现。Servlet比过滤器快。Struts2是基于过滤器实现的。
  • 运行速度:Struts2是多例,请求来了以后,struts2创建多少个对象;Springmvc是单例。
  • 参数封装来分析:Struts基于属性进行封装。Springmvc基于方法封装。

3、入门案例

1.需要的jar包

  1. 因为springmvcspring的一部分,故jar包和之前的相同,只是要加一个jarspring-webmvc-3.2.0.RELEASE.jar

2.程序编写

  1. 首先要在在web.xml中配置前端控制器:DispatcherServlet
  2. <servlet>
  3. <servlet-name>springmvc</servlet-name>
  4. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  5. </servlet>
  6. <servlet-mapping>
  7. <servlet-name>springmvc</servlet-name>
  8. <url-pattern>*.do</url-pattern>
  9. </servlet-mapping>

然后编写一个controller(类似struts2中的action):

  1. public class MyController implements Controller{
  2. public ModelAndView handleRequest(HttpServletRequest arg0,
  3. HttpServletResponse arg1) throws Exception {
  4. // 接受请求,接受参数,验证参数
  5. //封装参数,调用业务方法
  6. //返回视图
  7. ModelAndView mv = new ModelAndView();
  8. //设置页面回显数据,键值对
  9. mv.addObject("hello", "欢迎学习springmvc!");
  10. //指定跳转的视图
  11. //返回物理视图
  12. //mv.setViewName("/WEB-INF/jsps/index.jsp");
  13. //返回逻辑视图
  14. mv.setViewName("index");
  15. return mv;
  16. }
  17. }

之后在spring配置文件中(这里为springmvc.xml)首先要引入新的命名空间,如下:

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"<!--这里-->
  3. xsi:schemaLocation="http://www.springframework.org/schema/beans
  4. http://www.springframework.org/schema/mvc<!--这里-->
  5. http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd ><!--这里-->

然后就可以在spring配置文件中配置如下:

  1. <!-- 配置处理器映射器,springmvc默认的处理器映射器
  2. BeanNameUrlHandlerMapping:根据bean(自定义Controler)的name属性的url去寻找hanler(Action:Controller)
  3. -->
  4. <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
  5. <!-- 配置处理器适配器执行Controlelr ,springmvc默认的
  6. SimpleControllerHandlerAdapter:执行Controller
  7. -->
  8. <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
  9. <!-- 配置自定义Controler -->
  10. <bean name="/hello.do" class="cn.itcast.controller.MyController"></bean>

说明:即通过url为…/hello.do来访问该controller,如果在上面的controller类中返回的是物理视图,就可直接跳到index页面中,如果返回的是逻辑视图,还需要配置如下部分:

  1. <!-- 配置sprigmvc视图解析器:解析逻辑试图 后台返回逻辑试图:index
  2. 视图解析器解析出真正物理视图:前缀+逻辑试图+后缀====/WEB-INF/jsps/index.jsp
  3. -->
  4. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  5. <property name="prefix" value="/WEB-INF/jsps/"></property>
  6. <property name="suffix" value=".jsp"></property>
  7. </bean>

配置完如上部分后,还需要在web.xml文件中将该配置文件加载进去:

  1. <servlet>
  2. <servlet-name>springmvc</servlet-name>
  3. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  4. <!--加载-->
  5. <init-param>
  6. <param-name>contextConfigLocation</param-name>
  7. <param-value>classpath:springmvc.xml</param-value>
  8. </init-param>
  9. </servlet>

说明: 配置文件也可以默认加载,但必须满足如下规范:

  • 文件命名:servlet-name-servlet.xml,这里的(web.xml)名为springmvc,故配置文件名应为springmvc-servlet.xml
  • 路径规范:必须在WEB-INF目录下面

最后在index中便可通过${hello}来取值。

二、语法详情

1、处理器映射器

  1. 就是将从浏览器发送过来的url地址进行处理,将urlcontroller对应起来,但是还未执行controller

1.BeanNameUrlHandlerMapping

  1. 根据url请求去匹配beanname属性url,从而获取Controller,如下:
  2. <!-- 配置处理器映射器,springmvc默认的处理器映射器
  3. BeanNameUrlHandlerMapping:根据bean(自定义Controler)的name属性的url去寻找hanler(Action:Controller)
  4. -->
  5. <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
  6. <!-- 配置自定义Controler -->
  7. <bean name="/hello.do" class="cn.itcast.controller.MyController"></bean>

只需要访问http:…./hello.do即可。

2.SimpleUrlHandlerMaping

  1. 根据浏览器url匹配简单urlkeykey又通过Controllerid找到Controller,如下:
  2. <!-- 简单处理器映射器:把Url进行集中配置-->
  3. <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  4. <property name="mappings">
  5. <props>
  6. <prop key="/abc.do">myController</prop>
  7. <prop key="/ss.do">***</prop>
  8. <prop key="/mine.do">***</prop>
  9. </props>
  10. </property>
  11. </bean>
  12. <!-- 配置自定义Controler -->
  13. <bean id="myController" class="cn.itcast.controller.MyController"></bean>

在上述配置中,如果访问…/abc.do将会访问自定义的controller

3.ControllerClassNameHandlerMapping

  1. 根据类名(MyController)类名.do来访问,类名首字母小写,如下:
  2. <!-- 定义通过: 类名.do 形式来访问controller -->
  3. <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean>
  4. <!-- 配置自定义Controler -->
  5. <bean class="cn.itcast.controller.MyController"></bean>

在上述配置中只要访问…./myController(就是自定义的controller的类名的首字母小写),即可访问自定义的MyController

注意:3个处理器映射器是可以共存的

2、处理器适配器

  1. 用来执行相应的controller的。处理器适配器的类型与自定义controller时所实现的接口是对应的,每一种适配器处理一种实现特定接口的controller

1.SimpleControllerHandlerAdapter

controller需要实现的接口为Controller,返回modelAndView,如下:

controller中

  1. public class MyController implements Controller{
  2. public ModelAndView handleRequest(HttpServletRequest arg0,
  3. HttpServletResponse arg1) throws Exception {
  4. ModelAndView mv = new ModelAndView();
  5. mv.addObject("hello", "欢迎学习springmvc!");
  6. //指定跳转的视图
  7. //返回物理视图
  8. //mv.setViewName("/WEB-INF/jsps/index.jsp");
  9. //返回逻辑视图
  10. mv.setViewName("index");
  11. return mv;
  12. }
  13. }

配置中

  1. <!-- 配置处理器适配器执行Controlelr ,springmvc默认的-->
  2. <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>

2.HttpRequestHandlerAdapter

  1. controller需要实现的接口为HttpRequestHandler,无返回值,如下:

controller中

  1. public class HttpController implements HttpRequestHandler{
  2. public void handleRequest(HttpServletRequest request, HttpServletResponse response)
  3. throws ServletException, IOException {
  4. //给Request设置值,在页面进行回显
  5. request.setAttribute("hello", "这是HttpRequestHandler!");
  6. //跳转页面
  7. request.getRequestDispatcher("/WEB-INF/jsps/index.jsp").forward(request, response);
  8. }
  9. }

注意:因为无返回值,故在跳转页面时只能是物理视图,不能是逻辑视图。

配置中

  1. <!-- HttpRequestHandlerAdapter负责执行实现接口HttpRequestHandler的后端控制器。-->
  2. <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>

注意:2个处理器适配器可以共存

3、注解的使用

如果使用注解开发,那么再spring配置文件中要有如下配置:

  1. <context:component-scan base-package="cn.itcast"></context:component-scan>
  2. <!-- 配置注解处理器映射器 -->
  3. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
  4. <!-- 配置注解处理器适配器 -->
  5. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
  6. <!-- 配置sprigmvc视图解析器:解析逻辑试图 -->
  7. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  8. <property name="prefix" value="/WEB-INF/jsps/"></property>
  9. <property name="suffix" value=".jsp"></property>
  10. </bean>

注意:可以使用如下配置

  1. <mvc:annotation-driven/>

来替代注解处理器和适配器,并且还自动支持json格式数据。但是注意此时(使用json格式数据)在javaBean中不能添加@XmlRootElement(提供对xml视图支持)。

然后自定义的Controller类可以使用注解来开发,举例如下:

  1. @Controller//相对应<bean class="UserController"/>
  2. public class UserController {
  3. @RequestMapping("hello.do")//相对于<bean name="/hello.do" class="..."></bean>
  4. public String hello(){
  5. return "index";//跳转到index.jsp
  6. }
  7. }

注意:

1.requestMapping可以写为:

  • requestMapping(“hello”)
  • requestMapping(“/hello.do”)
  • requestMapping(value=”/hello.do”)
  • requestMapping(value=”/hello.do”,method=RequestMethod.GET)//指定只接受get请求
  • requestMapping(value=”/hello.do”,method={RequestMethod.POST, RequestMethod.GET})//get和post请求都可以

2.RequestMaping设置根路径:

  1. @Controller//相对应<bean class="UserController"/>
  2. @RequestMapping("/user")//这里
  3. public class UserController {
  4. @RequestMapping("hello.do")
  5. public String hello(){
  6. return "index";
  7. }
  8. }

之后再访问需要…/user/hello.do来访问hello方法

在接收参数时可以使用@RequestParam注解,如:

  1. //接受int类型参数
  2. @RequestMapping("recieveInt")
  3. public String recieveInt(@RequestParam(defaultValue="2",value="ss",required=true) Integer id){
  4. System.out.println(id);
  5. return "success";
  6. }

那么在表单中:

  1. <form action="${pageContext.request.contextPath }/user/recieveInt.do" method="post">
  2. ID:<input type="text" name="ss" id="id">
  3. <input type="submit" value="提交">
  4. </form>

注意:name的值与controller中的value对应,如果没有传递的值默认值为2,required设置为true表示必须传递值,否则报错。

三、参数的接收与封装

1、参数的接收

  1. Struts2的参数基于属性封装不同,Springmvc参数的封装是基于方法进行封装的。

1.接收int型参数

  1. 首先在页面中:
  2. <form action="${pageContext.request.contextPath }/user/recieveInt.do" method="post">
  3. ID:<input type="text" name="id" id="id">
  4. <input type="submit" value="提交">
  5. </form>

那么在controller中:

  1. //接受int类型参数
  2. @RequestMapping("recieveInt")
  3. public String recieveInt(Integer id){
  4. System.out.println(id);
  5. return "success";
  6. }

注意:在方法中的参数名要与表单中提交过来的方法名一致。

2.接收String型参数

  1. 首先在页面中:
  2. <form action="${pageContext.request.contextPath }/user/recieveStr.do" method="post">
  3. 姓名:<input type="text" name="username" id="username">
  4. <input type="submit" value="提交">
  5. </form>

那么在controller中:

  1. //接受字符类型参数
  2. @RequestMapping("recieveStr")
  3. public String recieveStr(String username)
  4. {
  5. System.out.println(username);
  6. return "success";
  7. }

3.接收数组型参数

  1. 首先在页面中:
  2. <form action="${pageContext.request.contextPath }/user/recieveArray.do" method="post">
  3. ID:<input type="checkbox" name="ids" value="1" id="ids">
  4. ID:<input type="checkbox" name="ids" value="2" id="ids">
  5. ID:<input type="checkbox" name="ids" value="3" id="ids">
  6. <input type="submit" value="提交">
  7. </form>

那么在controller中:

  1. //接受数组类型参数
  2. @RequestMapping("recieveArray")
  3. public String recieveArray(Integer[] ids){
  4. System.out.println(ids);
  5. return "success";
  6. }

4.接收bean型参数

  1. 首先在页面中:
  2. <form action="${pageContext.request.contextPath }/user/recieveUser.do" method="post">
  3. 姓名:<input type="text" name="username" id="username">
  4. 生日:<input type="text" name="birthday" id="birthday">
  5. 性别:<input type="text" name="sex" id="sex">
  6. 地址:<input type="text" name="address" id="address">
  7. <input type="submit" value="提交">
  8. </form>

那么在controller中:

  1. //接受参数封装User对象
  2. @RequestMapping("recieveUser")
  3. public String recieveUser(User user){
  4. System.out.println(user);
  5. return "success";
  6. }

注意:这里的表单中提交过来的数据的name要与user bean中属性名相同

5.接收包装型参数

首先包装类如下:

  1. public class UserCustom {
  2. private User user;
  3. //get set
  4. }

然后在页面中:

  1. <form action="${pageContext.request.contextPath }/user/recieveUserCustom.do" method="post">
  2. 姓名:<input type="text" name="user.username" id="username">
  3. 生日:<input type="text" name="user.birthday" id="birthday">
  4. 性别:<input type="text" name="user.sex" id="sex">
  5. 地址:<input type="text" name="user.address" id="address">
  6. <input type="submit" value="提交">
  7. </form>

那么在controller中:

  1. //接受包装类型参数
  2. @RequestMapping("recieveUserCustom")
  3. public String recieveUserCustom(UserCustom usercustom){
  4. System.out.println(userCustom);
  5. return "success";
  6. }

注意:表单数据的名称

6.接收集合型参数

  1. 因为在方法中参数不能是集合,故想要接收集合类型参数需要通过包装类来完成。

1.接收List类型参数

首先其包装类如下:

  1. public class UserCustom {
  2. private List<User> userList;
  3. //set get
  4. }

然后在页面中:

  1. <form action="${pageContext.request.contextPath }/user/recieveList.do" method="post">
  2. 姓名:<input type="text" name="userList[0].username" id="username">
  3. 地址:<input type="text" name="userList[0].address" id="address">
  4. 姓名:<input type="text" name="userList[1].username" id="username">
  5. 地址:<input type="text" name="userList[1].address" id="address">
  6. <input type="submit" value="提交">
  7. </form>

那么在controller中:

  1. //接受集合类型参数
  2. @RequestMapping("recieveList")
  3. public String recieveList(UserCustom userCustom){
  4. System.out.println(userCustom);
  5. return "success";
  6. }

2.接收Map类型参数

首先其包装类如下:

  1. public class UserCustom {
  2. private Map<String,Object> maps = new HashMap<String, Object>();
  3. //get set
  4. }

然后在页面中:

  1. <form action="${pageContext.request.contextPath }/user/recieveMap.do" method="post">
  2. 姓名:<input type="text" name="maps['username']" id="username">
  3. 地址:<input type="text" name="maps['address']" id="address">
  4. <input type="submit" value="提交">
  5. </form>

那么在controller中:

  1. //接受集合类型参数
  2. @RequestMapping("recieveMap")
  3. public String recieveMap(UserCustom userCustom){
  4. System.out.println(userCustom);
  5. return "success";
  6. }

2、参数的封装

  1. Springmvc通过命令设计模式接受页面参数。现在实现将from表单中的数据封装到bean中,首先先有一个user bean
  2. public class User {
  3. private Integer id;
  4. private String username;
  5. private Date birthday;
  6. private String sex;
  7. private String address;
  8. //get and set
  9. }

然后创建一个controller,通过它来跳转到form表单页面:

  1. public class ToAddController implements Controller{
  2. public ModelAndView handleRequest(HttpServletRequest request,
  3. HttpServletResponse response) throws Exception {
  4. ModelAndView mv = new ModelAndView();
  5. //调转到add添加页面视图
  6. mv.setViewName("add");
  7. return mv;
  8. }
  9. }

它在配置文件中的主要配置如下:

  1. <bean name="/toAdd.do" class="cn.itcast.controller.ToAddController"></bean>

那么这时访问…/toAdd.do将会执行该controller,然后通过它跳到下面的jsp中:

  1. <form action="${pageContext.request.contextPath }/command.do" method="post">
  2. 姓名:<input type="text" name="username" id="username">
  3. 生日:<input type="text" name="birthday" id="birthday">
  4. 性别:<input type="text" name="sex" id="sex">
  5. 地址:<input type="text" name="address" id="address">
  6. <input type="submit" value="提交">
  7. </form>

提交的url(…command.do)在spring配置中:

  1. <bean name="/command.do" class="cn.itcast.controller.CommandController"></bean>

即,将由CommandController来处理:

  1. public class CommandController extends AbstractCommandController{
  2. //指定参数绑定到那个javaBean
  3. public CommandController(){
  4. this.setCommandClass(User.class);
  5. }
  6. @Override
  7. protected ModelAndView handle(HttpServletRequest request,
  8. HttpServletResponse response, Object command, BindException errors)
  9. throws Exception {
  10. //把命令对象强转成User对象
  11. User user = (User) command;
  12. ModelAndView mv = new ModelAndView();
  13. mv.addObject("user", user);
  14. mv.setViewName("index");
  15. return mv;
  16. }
  17. }

这时将跳转到index 页面,来显示user的信息:

  1. <body>
  2. ${user.username } <br>
  3. ${user.birthday } <br>
  4. ${user.sex } <br>
  5. ${user.address } <br>
  6. </body>

注意:可能出现的问题

问题1:中文乱码

  • Get请求乱码

70 1

  • post请求乱码

通过配置Spring编码过滤器来解决,在web.xml中配置:

  1. <filter>
  2. <filter-name>characterEncoding</filter-name>
  3. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  4. <init-param>
  5. <param-name>encoding</param-name>
  6. <param-value>UTF-8</param-value>
  7. </init-param>
  8. </filter>
  9. <filter-mapping>
  10. <filter-name>characterEncoding</filter-name>
  11. <url-pattern>/*</url-pattern>
  12. </filter-mapping>

问题2:日期格式的转换

  1. 如上例子中如果在日期栏中添加的是:2016/10/4 这样的格式的话date是可以提交上去的(默认,与系统格式一致),但是如果是:2016-10-4等,提交上去的将会为null,在CommandController中再添加方法initBinder(自动执行),可以转换日期格式:
  2. public class CommandController extends AbstractCommandController{
  3. public CommandController(){
  4. }
  5. //。。。。。。
  6. @Override
  7. protected void initBinder(HttpServletRequest request,
  8. ServletRequestDataBinder binder) throws Exception {
  9. String str = request.getParameter("birthday");
  10. if(str.contains("/")){
  11. binder.registerCustomEditor(Date.class,
  12. new CustomDateEditor(new SimpleDateFormat("yyyy/MM/dd"), true));
  13. }else{
  14. binder.registerCustomEditor(Date.class,
  15. new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
  16. }
  17. }
  18. }

四、页面的回显

  1. spring mvc中通过model来实现页面中数据的回显,相当于application域对象。下面以显示集合对象中的数据为例说明:

首先在controller中添加要显示在页面中的数据:

  1. @RequestMapping("list")
  2. public String list(Model model){
  3. List<User> userList = new ArrayList<User>();
  4. User user1 = new User();
  5. user1.setId(1);
  6. user1.setSex("男");
  7. user1.setUsername("张山峰");
  8. user1.setAddress("武当山");
  9. user1.setBirthday(new Date());
  10. User user2 = new User();
  11. User user3 = new User();
  12. //。。。
  13. userList.add(user1);
  14. userList.add(user2);
  15. userList.add(user3);
  16. model.addAttribute("userList", userList);//将该对象放到model中
  17. return "list";
  18. }

之后在页面中取出:

  1. <table border="1" style="color: blue">
  2. <tr>
  3. <td>姓名</td>
  4. <td>生日</td>
  5. <td>性别</td>
  6. <td>地址</td>
  7. <td>操作</td>
  8. </tr>
  9. <c:forEach items="${userList}" var="user">
  10. <tr>
  11. <td>${user.username }</td>
  12. <td>${user.birthday }</td>
  13. <td>${user.sex }</td>
  14. <td>${user.address }</td>
  15. <td>
  16. <a href="${pageContext.request.contextPath }/rest/user/updateByID.do?id=${user.id }">修改</a>
  17. </td>
  18. </tr>
  19. </c:forEach>
  20. </table>

附加:如果点击修改后的实现:

  1. //修改
  2. @RequestMapping("updateByID")
  3. public String updateByID(Integer id,Model model){
  4. User user1 = new User();
  5. user1.setId(id);
  6. //。。。。
  7. model.addAttribute("user", user1);
  8. return "edit";
  9. }

五、其它

1、URL模版映射

  1. spring mvc url 格式为...controller.do?参数,这不符合restfull软件架构(无扩展名,无参数)。为了实现Restfull风格设计可以进行如下修改:

首先假如有如下url请求:

  1. <a href="${pageContext.request.contextPath }/rest/user/updateByID.do?id=${user.id }">

而处理的controller为:

  1. @RequestMapping("updateByID")
  2. public String updateByID(Integer id){
  3. //。。。。
  4. }

想去掉后面根加的请求参数可以将其写为:

  1. <a href="${pageContext.request.contextPath }/user/updateByID/${user.id }.do">

并且在controller中修改为:

  1. @RequestMapping("updateByID/{id}")
  2. public String updateByID(@PathVariable Integer id){
  3. //。。。。
  4. }

而想去掉.do扩展名,则可以在web.xml中配置的url拦截改为:

  1. <servlet-mapping>
  2. <servlet-name>springmvc</servlet-name>
  3. <url-pattern>*.do</url-pattern>
  4. </servlet-mapping>
  5. <servlet-mapping>
  6. <servlet-name>springmvc</servlet-name>
  7. <url-pattern>/rest/*</url-pattern>
  8. </servlet-mapping>

注意:第二个映射的rest是默认的。

此时url访问将变为:

  1. <a href="${pageContext.request.contextPath }/rest/user/updateByID/${user.id }"

2、转发和重定向

1.转发(forward)

在本类(同一个controller中方法与方法之间进行转发)进行转发:

  1. @RequestMapping("forward")
  2. public String forward(){
  3. return "forward:list.do";
  4. }

在不同类中进行转发:

  1. @RequestMapping("forward")
  2. public String forward(){
  3. return "forward:/items/list.do";
  4. }

2.重定向(redirect)

  1. @RequestMapping("redirect")
  2. public String redirect(){
  3. return "redirect:/items/list.do";
  4. }

3、整合JSON数据

首先需要在处理器适配器中进行如下配置:

  1. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
  2. <property name="messageConverters">
  3. <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"</bean>
  4. </property>
  5. </bean>

或者如前面注解中的

1.接收json数据,输出json数据

  1. 接收后转为pojo,然后将pojo输出为json格式,首先在页面中:
  2. function requestJson(){
  3. //模拟json格式数据
  4. var jsonObj=JSON.stringify({"username":"小明","sex":"男","address":“”河南});
  5. $.ajax({
  6. type:'POST',
  7. url:'${pageContext.request.contextPath}/user/requestJson.do',
  8. contentType:'application/json;charset=utf-8',
  9. data:jsonObj,
  10. success:function(data){//这里的data表示的是返回的数据
  11. alert(data.username)
  12. }
  13. })
  14. }

在后台代码中:

  1. @RequestMapping("requestJson")
  2. public @ResponseBody User requestJson(@RequestBody User user){
  3. Sysotem.out.println(user);
  4. return user;//这里不再是页面了
  5. }

2.接收pojo数据,输出json数据

首先在页面中:

  1. function requestPo(){
  2. $.ajax({
  3. type:'POST',
  4. url:'${pageContext.request.contextPath}/user/requestPo.do',
  5. data:'username=小明&sex=男&address=河南',
  6. success:function(data){//这里的data表示的是返回的数据
  7. alert(data.username)
  8. }
  9. })
  10. }

在后台代码中:

  1. @RequestMapping("requestPo")
  2. public @ResponseBody User requestJson(User user){
  3. Sysotem.out.println(user);
  4. return user;//这里不再是页面了
  5. }

4、Springmvc对多视图的支持

  1. 对多视图支持,表示的是springmvc可以根据条件生成多种格式的数据(如通过提交的url的扩展名相应的返回xml格式数据【.xml】或者json格式数据【.json】)。首先导入相应的jar包(json如上,只导xml),然后在配置文件中配置多视图的支持:
  2. <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
  3. <!-- 配置支持媒体类型 -->
  4. <property name="contentNegotiationManager">
  5. <bean class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
  6. <property name="mediaTypes">
  7. <map>
  8. <entry key="json" value="application/json"></entry>
  9. <entry key="xml" value="application/xml"></entry>
  10. </map>
  11. </property>
  12. </bean>
  13. </property>
  14. <!-- 指定默认视图 -->
  15. <property name="defaultViews">
  16. <!-- 支持多个视图 -->
  17. <list>
  18. <!-- josn格式视图支持 -->
  19. <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"></bean>
  20. <!-- xml格式视图支持 -->
  21. <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
  22. <constructor-arg>
  23. <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
  24. <property name="classesToBeBound">
  25. <list>
  26. <value>com.shen.domain.User</value>
  27. </list>
  28. </property>
  29. </bean>
  30. </constructor-arg>
  31. </bean>
  32. </list>
  33. </property>
  34. </bean>

此外为了支持xml格式的输出,还要在输出的相应的实体类中加上如下注解:

  1. @XmlRootElement
  2. public class User {
  3. }

在java代码中如下:

  1. @RequestMapping("multView")
  2. public String multView(){
  3. User user1 = new User();
  4. user1.setId(1);
  5. user1.setSex("男");
  6. user1.setUsername("张山峰");
  7. user1.setAddress("武当山");
  8. user1.setBirthday(new Date());
  9. return user1;
  10. }

5、spring MVC的拦截器

  1. 需要引入的命名空间为:
  2. xmlns:mvc="http://www.springframework.org/schema/mvc"<!--这里-->
  3. xsi:schemaLocation="http://www.springframework.org/schema/beans
  4. http://www.springframework.org/schema/mvc <!--这里-->
  5. http://www.springframework.org/schema/mvc/spring-mvc.xsd "><!--这里-->

1.局部拦截器

  1. 针对单个处理器映射器,就叫局部拦截器。

2.全局拦截器

  1. 在配置文件中:
  2. <!--拦截器 -->
  3. <mvc:interceptors>
  4. <!--多个拦截器,顺序执行 -->
  5. <mvc:interceptor>
  6. <mvc:mapping path="/**"/>
  7. <bean class="com.shen.interceptor.Interceptor1"></bean>
  8. </mvc:interceptor>
  9. <mvc:interceptor>
  10. <mvc:mapping path="/**"/>
  11. <bean class="com.shen.interceptor.Interceptor2"></bean>
  12. </mvc:interceptor>
  13. </mvc:interceptors>

然后拦截器代码:

  1. public class Interceptor1 implements HandlerInterceptor{
  2. //preHandle在处理器映射器之前进行执行
  3. //return false:拦截 return true:放行
  4. public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
  5. Object arg2) throws Exception {
  6. System.out.println("这是第一个拦截器Interceptor1。。。preHandle");
  7. return true;
  8. }
  9. //还没有调用Controller,还没返回modelAndView执行
  10. public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
  11. Object arg2, ModelAndView arg3) throws Exception {
  12. System.out.println("这是第一个拦截器Interceptor1。。。postHandle");
  13. }
  14. //返回modelAndView之后执行
  15. public void afterCompletion(HttpServletRequest arg0,
  16. HttpServletResponse arg1, Object arg2, Exception arg3)
  17. throws Exception {
  18. System.out.println("这是第一个拦截器Interceptor1。。。afterCompletion");
  19. }
  20. }
  21. public class Interceptor2 implements HandlerInterceptor{
  22. public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
  23. Object arg2) throws Exception {
  24. System.out.println("这是第二个拦截器Interceptor2。。。preHandle");
  25. return true;
  26. }
  27. public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
  28. Object arg2, ModelAndView arg3) throws Exception {
  29. System.out.println("这是第二个拦截器Interceptor2。。。postHandle");
  30. }
  31. public void afterCompletion(HttpServletRequest arg0,
  32. HttpServletResponse arg1, Object arg2, Exception arg3)
  33. throws Exception {
  34. System.out.println("这是第二个拦截器Interceptor2。。。afterCompletion");
  35. }
  36. }

然后测试:

1.第一个拦截器放行,第二个拦截器也放行:







这是第一个拦截器Interceptor1。。。preHandle

这是第二个拦截器Interceptor2。。。preHandle

这是第二个拦截器Interceptor2。。。postHandle

这是第一个拦截器Interceptor1。。。postHandle

这是第二个拦截器Interceptor2。。。afterCompletion

这是第一个拦截器Interceptor1。。。afterCompletion

2.第一个拦截器放行,第二个不放行:







这是第一个拦截器Interceptor1。。。preHandle

这是第二个拦截器Interceptor2。。。preHandle

这是第一个拦截器Interceptor1。。。afterCompletion

说明:Springmvc规定:凡是preHandle返回true,afterCompletion必须执行。

发表评论

表情:
评论列表 (有 0 条评论,316人围观)

还没有评论,来说两句吧...

相关阅读