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映射控制器。
当然以上这两种方式在一个系统里也是可以一块是用的,