Spring技术体系
Spring MVC
主要组件
-
DispatcherServlet
核心控制器,按Servlet标准定义。使用时在web.xml配置。所有请求首先进入DispatcherServlet.
-
HandlerMapping
处理器映射,负责根据请求映射到不同Controller处理器
-
Controller
处理器,负责接收请求及参数,调用业务组件Service/DAO进行处理,然后返回处理结果
-
ModelAndView
负责存储模型数据和视图名称(例如book.jsp视图名是book),模型数据默认是request范围,可以传递到指定名称的视图组件中。
-
ViewResolver
视图解析器,根据ModelAndView中的视图名找JSP组件,生成HTML响应。(默认将ModelAndView信息解析,将Model存入request;采用转发调用视图组件)
Spring MVC处理流程
Spring入门案例 - HelloWorld
-
熟悉流程,设计功能实现流程
/hello.do-->DispatcherServlet-->HandlerMapping-->HelloController(返回ModelAndView)-->ViewResolver-->/hello.jsp
-
编写流程中缺失的组件
- HelloController
实现Controller接口及其约定方法
public class HelloController implements Controller{ @Override public ModelAndView handleRequest( HttpServletRequest request, HttpServletResponse response) throws Exception { ModelAndView mav = new ModelAndView(); mav.setViewName("hello");//设置视图名称 mav.getModel().put("msg", "Hello SpringMVC");//设置模型数据 return mav; } }
- hello.jsp
利用EL表达式获取显示ModelAndView中的模型数据
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>${msg}</h1> </body> </html>
-
流程组件的配置
-
配置DispatcherServlet(web.xml)
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
-
配置HandlerMapping(applicationContext.xml)
<bean id="handlermapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/hello.do">hellocontroller</prop> </props> </property>
-
配置HelloController(applicationContext.xml)
<bean id="hellocontroller" class="cn.xdl.controller.HelloController"> </bean>
-
配置ViewResolver(applicationContext.xml)
<bean id="viewresolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> </bean>
-
-
测试功能
启动tomcat,发布程序测试
Spring入门示例 - 登录
-
设计流程(显示登录界面)
/login.do-->DispatcherServlet-->HandlerMapping-->LoginController-->ViewResolver-->/login.jsp
-
编写缺失组件
- LoginController
- login.jsp
-
流程配置
-
修改HandlerMapping,追加/login.do请求
<bean id="handlermapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/hello.do">hellocontroller</prop> <prop key="/login.do">logincontroller</prop> </props> </property> </bean>
-
配置LoginController
<bean id="logincontroller" class="cn.xdl.controller.LoginController"> </bean>
-
Spring MVC注解配置
框架可以采用XML配置和注解配置两种,平时采用混用,jar包中提供的组件采用XML定义;程序员定义的组件采用注解配置。
-
DispatcherServlet配置没有改变,还是采用web.xml中XML定义方式
-
handlerMapping可以使用RequestMappingHandlerMapping替代SimpleUrlHandlerMapping组件
-
SimpleUrlHandlerMapping工作
<bean id="handlermapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/hello.do">hellocontroller</prop> <prop key="/login.do">logincontroller</prop> </props> </property>
-
RequestMappingHandlerMapping工作
<bean id="handlermapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> </bean> <bean id="handlermapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> </bean>
可以使用下面配置替代上面< bean>定义
<mvc:annotation-driven/>
在Controller组件方法前使用@RequestMapping("/hello.do")
-
-
Controller配置可以采用组件扫描替代定义
<context:component-scan base-package=""/>
在Controller组件中,使用@Controller标记扫描,Controller方法可以根据需要灵活定义。
public String xxx(){ return "视图名";} public ModelAndView xxx(){...} public String xxx(HttpServletRequest request){} public ModelAndView xxx(HttpServletRequest request){} public ModelAndView xxx(HttpServletRequest request,HttpServletResponse response){} ... ...
-
ViewResolver配置没有改变
Spring登录案例
-
流程设计
/check.do-->DispatcherServlet-->HandlerMapping-->LoginController(返回ModelAndView)-->ViewResolver-->失败进入login.jsp;成功进入success.jsp
-
编写缺失组件或方法
-
在LoginController追加方法
@RequestMapping("/check.do") public ModelAndView checkLogin(HttpServletRequest request){ ModelAndView mav = new ModelAndView(); //检查用户名和密码 String username = request.getParameter("username"); String password = request.getParameter("password"); if("scott".equalsIgnoreCase(username) && "123456".equals(password)){ //成功跳转到success.jsp mav.setViewName("success"); mav.getModel().put("msg", "登录成功!"); }else{ //失败跳转到login.jsp mav.setViewName("login"); mav.getModel().put("error", "用户名或密码错误"); } return mav; }
-
添加一个success.jsp
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>${msg}</h1> <a href="login.do">重新登录</a> </body> </html>
-
Spring MVC接收请求参数
-
使用原有HttpServletRequest
String value = request.getParameter("key");
-
使用Controller方法参数
public ModelAndView xxx(String username,String password)
可以获取请求提交的username=xxx和password=xxx值。同名赋值,名称不一致可以采用@RequestParam()标记
@RequestParam(value="username",required=false,defaultValue="aaa") String name @RequestParam(value="page",required=false,defaultValue="1") int p
-
使用Controller方法实体对象做参数
public ModelAndView checkLogin2(User user)
将username和password从request对象取出存入user对象的属性中。(同名赋值)
-
POST中文乱码的解决方法
Spring框架提供了一个CharacterEncodingFilter过滤器。内部执行了request.setCharacterEncoding("xxx"),只需要在web.xml配置下即可
<!-- 解决post中文乱码过滤器 --> <filter> <filter-name>characterfilter</filter-name> <filter-class> org.springframework.web.filter.CharacterEncodingFilter </filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterfilter</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping>