SpringMvc中Controller的写法

说明:

     这篇文章来自网上的全文摘抄后修改。

     参考如下:

          https://www.cnblogs.com/zjf-1992/p/5736101.html

 


MVC框架是什么

模型-视图-控制器(MVC)是一个众所周知的以设计界面应用程序为基础的设计模式。它主要通过分离模型视图控制器在应用程序中的角色将业务逻辑从界面中解耦。通常,模型负责封装应用程序数据在视图层展示视图仅仅只是展示这些数据,不包含任何业务逻辑控制器负责接收来自用户的请求,并调用后台服务(manager或者dao)来处理业务逻辑。处理后,后台业务层可能会返回了一些数据在视图层展示。控制器收集这些数据及准备模型在视图层展示。MVC模式的核心思想是将业务逻辑从界面中分离出来,允许它们单独改变而不会相互影响。

 

 

 

 

Contrller控制器层的写法 

 1 package com.platform.mvc.system.layer.controller.test;
 2 
 3 import java.util.ArrayList;
 4 import java.util.HashMap;
 5 import java.util.List;
 6 import java.util.Map;
 7 import javax.servlet.http.HttpServletRequest;
 8 import org.apache.catalina.connector.Request;
 9 import org.springframework.stereotype.Controller;
10 import org.springframework.ui.Model;
11 import org.springframework.web.bind.annotation.RequestMapping;
12 import org.springframework.web.bind.annotation.RequestMethod;
13 import org.springframework.web.bind.annotation.RequestParam;
14 import org.springframework.web.bind.annotation.ResponseBody;
15 import org.springframework.web.servlet.ModelAndView;
16 
17 @Controller
18 @RequestMapping("/user")
19 public class userCtroller {
20 
21     //方式一:String
22     @RequestMapping("test")
23     public String list(Map<String, Object> map){
24         map.put("name", "HelloKitty");
25         map.put("age", 1);
26         //返回视图
27         return "system/userList";
28     }
29 
30 
31     //方式二:ModelAndView
32     @RequestMapping(value="test2", method=RequestMethod.GET)
33     public ModelAndView list2(Model model){
34         //创建一个视图对象
35         ModelAndView view = new ModelAndView();
36         //绑定数据
37         model.addAttribute("name", "zhangsan");
38         //设置视图
39         view.setViewName("system/userList");
40         return view;
41     }
42 
43 
44     //方式三:AJAX
45     //接收参数:@RequestParam(value="username", required=true, defaultValue="hello") String username
46     @RequestMapping(value="/test3", method=RequestMethod.POST)
47     @ResponseBody
48     public Map<String, Object> list3(HttpServletRequest request, 
49         @RequestParam(value="username", required=true, defaultValue="hello") String username){
50         Map<String, Object> map = new HashMap<>();
51         map.put("name", "zhangsan");
52         return map;
53     }
54 
55 }

 


 

自从SpringBoot出来后很久都没有使用xml的方式配置SpringMvc了,今天从网上看到了一篇配置信息。将其摘抄下

 

1. web.xml添加拦截器,把所有的请求统一交给 org.springframework.web.servlet.DispatcherServlet 来处理。

 1 <servlet>
 2     <servlet-name>viewspace</servlet-name>
 3     <servlet-class>
 4         org.springframework.web.servlet.DispatcherServlet
 5     </servlet-class>
 6     <load-on-startup>1</load-on-startup>
 7 </servlet>
 8 
 9 <servlet-mapping>
10     <servlet-name>viewspace</servlet-name>
11     <url-pattern>/</url-pattern>
12 </servlet-mapping>

 

2. 根据 servlet-name,还得在web.xml 的同一目录里建一个 {servlet-name}-servlet.xml 的文件

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xsi:schemaLocation="
 6        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
 7        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
 8 
 9     <!-- 扫描web包,应用Spring的注解 -->
10     <context:component-scan base-package="com.corp.chimera.web" />
11 
12 
13     <!-- HandlerMapping -->
14     <bean
15         class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
16  
17     <!-- HandlerAdapter -->
18     <bean
19         class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
20  
21 
22     <bean id="defaultAnnotationHandlerMapping"
23         class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
24     <bean id="annotationMethodHandlerAdapter"
25         class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
26  
27  
28     <!-- ViewResolver 配置视图解析器,将ModelAndView及字符串解析为具体的页面 -->
29     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
30         <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 
31         <property name="prefix" value="/views/"/> 
32         <property name="suffix" value=".jsp"/> 
33     </bean>
34 
35 
36     <!--
37     <bean
38         class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
39         <property name="resourceLoaderPath" value="/views/" />
40         <property name="configLocation" value="classpath:common/velocity.properties" />
41     </bean>
42     <bean
43         class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
44         <property name="viewClass"
45             value="org.springframework.web.servlet.view.velocity.VelocityView" />
46         <property name="suffix" value=".html" />
47     </bean>
48     -->
49  
50     <bean name="/index" class="com.corp.chimera.web.controllers.IndexController" />
51  
52 </beans>

 

3. 首先开始编写Controller层,作为MVC的控制层,是最直接和用户交互的,也是最外面的一层。Controller这里有两种写法: 一种是基于配置的,一种是基于注解的。

  • 基于配置

      这个好像是Spring很早的版本之前的功能,所有的url都必须在配置文件里配置一下。配置其使用的HandlerMapping和HandlerAdapter以及,该URL对应的Controller类。并且该Controller类必须实现(implements)org.springframework.web.servlet.mvc.Controller  并重写其:ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception的方法。

 

首先看配置文件:viewspace-servlet.xml

1 <!-- HandlerMapping -->
2 <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
3  
4 <!-- HandlerAdapter -->
5 <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
6 
7 <bean name="/index" class="com.corp.chimera.web.controllers.IndexController" />

 

Controller类:IndexController.java

 1 package com.corp.chimera.web.controllers;
 2  
 3 import javax.servlet.http.HttpServletRequest;
 4 import javax.servlet.http.HttpServletResponse;
 5  
 6 import org.springframework.web.servlet.ModelAndView;
 7 import org.springframework.web.servlet.mvc.Controller;
 8 
 9 /**
10  * 基于配置的 Controller,Spring最原始的用法
11  * 必须实现 org.springframework.web.servlet.mvc.Controller 并重写handleRequest方法。
12  * 需要在 xxx-servlet.xml 里进行配置:<bean name="/index" class="com.corp.chimera.web.controllers.IndexController" />
13  * 并且对于HandlerMapping 需要使用 org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
14  * HandlerAdapter 需要配置 org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
15  * 
16  * @author kevin
17  *
18  */
19 public class IndexController implements Controller {
20  
21     @Override
22     public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
23         // 1、收集参数、验证参数
24         // 2、绑定参数到命令对象
25         // 3、将命令对象传入业务对象进行业务处理
26         // 4、选择下一个页面
27         ModelAndView mv = new ModelAndView();
28         // 添加模型数据 可以是任意的POJO对象
29         mv.addObject("message", "I am liuzk");
30         // 设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面
31         mv.setViewName("index");
32         return mv;
33     }
34  
35 }

这样启动tomcat就可以 访问了。。。

其HandlerMapping映射使用的是 BeanNameUrlHandlerMapping 和 SimpleControllerHandlerAdapter 并且使用 JSTLView 作为 ViewResolver视图解析器。。

这样写的一个缺点就是:

      所有的url都得需要在文件里做配置。当系统庞大页面多的时候,这种效率上以及代码可读性上都大打折扣。于是,基于注解的方法就来了。。。

 

  • 基于注解
 1 <!-- 扫描web包,应用Spring的注解 -->
 2 <context:component-scan base-package="com.corp.chimera.web" />
 3 
 4 <bean id="defaultAnnotationHandlerMapping"
 5         class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
 6 <bean id="annotationMethodHandlerAdapter"
 7     class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
 8 
 9 <!-- ViewResolver 配置视图解析器,将ModelAndView及字符串解析为具体的页面 -->
10 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
11     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 
12     <property name="prefix" value="/views/"/> 
13     <property name="suffix" value=".jsp"/> 
14 </bean>

Controller类:ListController.java

 1 package com.corp.chimera.web.controllers;
 2  
 3 import javax.servlet.http.HttpServletRequest;
 4 import javax.servlet.http.HttpServletResponse;
 5  
 6 import org.springframework.stereotype.Controller;
 7 import org.springframework.web.bind.annotation.RequestMapping;
 8 import org.springframework.web.servlet.ModelAndView;
 9 
10 /**
11  * 基于注解的 Controller
12  * 和基于配置的Controller 不同的是,靠注解就可以实现所有Url,相比之下,基于注解的Controller 更方便,灵活
13  * 无需实现 和 继承任何类,只需要 @Controller 既可以标记该类位Controller
14  * @RequestMapping 注解 实现对于url的 path 进行注册
15  * 
16  * 但是使用前仍然需要配置 Spring 的配置文件:
17  * HandlerMapping 使用的是 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
18  * HandlerAdapter 需要指定 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
19  * 
20  * @author kevin
21  *
22  */
23 @Controller
24 @RequestMapping(value = "/list")
25 public class ListController{
26     
27     @RequestMapping(value="/index")
28     public ModelAndView listIndex(HttpServletRequest request, HttpServletResponse response) throws Exception {
29         // 1、收集参数、验证参数
30         // 2、绑定参数到命令对象
31         // 3、将命令对象传入业务对象进行业务处理
32         // 4、选择下一个页面
33         ModelAndView mv = new ModelAndView();
34         // 添加模型数据 可以是任意的POJO对象
35         mv.addObject("message", "This is a Spring Constraint with annotation.<br/> @Controller <br/>@RequestMapping");
36         // 设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面
37         mv.setViewName("list");
38         return mv;
39     }
40  
41 }

看上面方式:一个@Controller 一个@RequestMapping 两个注解解决了所有的配置,但是前提是在配置文件里配置使用 DefaultAnnotationHandlerMapping 和 AnnotationMethodHandlerAdapter 作为 url映射控制器。

当然以上这两种方式在一个系统里也是可以一块是用的,

posted @ 2020-10-14 23:15  枫雪奕  阅读(712)  评论(0编辑  收藏  举报