首页 > 代码库 > SpringMVC

SpringMVC

回顾spring+struts

web.xml配置;struts核心过滤器;spring监听器->配置spring.xml;struts.xml

技术分享
  <!-- 
  struts核心过滤器
  <filter>
      <filter-name>StrutsPrepareAndExecuteFilter</filter-name>
      <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>StrutsPrepareAndExecuteFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
  
  spring监听器
  <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring.xml</param-value>
  </context-param>
   -->
View Code

1.生命周期

  /hello.action->先访问web.xml->通过springMVC核心核心控制器DispatcherServlet-跳转(可以默认也可以指定)到springmvc.xml配置文件(有4个对象:1.注册Action,我们访问的对象;2.映射器BeanNameUrlHandlerMapping映射Bean name属性url地址,SimpleUrlHandlerMapping映射bean的id属性可以适配多个;3.SimpleControllerHandlerAdapter适配器用于适配继承Control的类;4视图解析器InternalResourceViewResolver通过modelandView视图名找到真正的视图)-》BeanNameUrlHandlerMapping找到action或者通过SimpleControllerHandlerAdapter找到action-》再逻辑处理完后通过视图解析器跳转到目标对象

工作流:

技术分享
1A)客户端发出http请求,只要请求形式符合web.xml
   文件中配置的*.action的话,就由DispatcherServlet
   来处理。

1B)DispatcherServlet再将http请求委托给映射器
   的对象来将http请求交给对应的Action来处理

2)映射器根据客户的http请求,再对比<bean name="/hello.action
   如果匹配正确,再将http请求交给程序员写的Action

3)执行Action中的业务方法,最终返回一个名叫ModelAndView
   的对象,其中封装了向视图发送的数据和视图的逻辑名

4)ModelAndView对象随着响应到到DispatcherServlet中了


5)这时DispatcherServlet收到了ModelAndView对象,
   它也不知道视图逻辑名是何意,又得委托一个名叫
   视图解析器的对象去具体解析ModelAndView对象
   中的内容

6)将视图解析器解析后的内容,再次交由DispatcherServlet
   核心控制器,这时核心控制器再将请求转发到具体的
   视图页面,取出数据,再显示给用户
View Code

2.spring快速入门 XML版

  1)步一:创建springmvc-day01这么一个web应用

  2)步二:导入springiocspringweb , springmvc相关的jar

 

  3)步三:在/WEB-INF/下创建web.xml文件

 

技术分享
    <!-- 注册springmvc框架核心控制器 -->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
View Code

 

    其中再web中还可以配置乱码过滤器

      在org.springframework.web.filter.CharacterEncodingFilter

技术分享
<!-- 注册spring提供的针对POST请求的中文乱码问题 -->
    <filter>
        <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
View Code

  4)创建HelloAction.java控制器类

 

技术分享
/**
 * 控制器
 * @author AdminTC
 */
public class HelloAction implements Controller{
    /**
     * 业务方法
     */
    public ModelAndView handleRequest(HttpServletRequest requqest,HttpServletResponse response) throws Exception {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("message","这是我的第一个springmvc应用程序");
        modelAndView.setViewName("/jsp/success.jsp");
        return modelAndView;
    }
}
View Code

 

  其中:

    1.继承Controller实现接口对ModelAndView对象模块视图对象赋值处理返回结果并跳转页面

      这个对象是单例对象,构造函数只在程序运行的时候执行;之后执行都是handleRequest方法

    2.

  5)/WebRoot/下创建jsp/success.jsp;这里反应结果页面

技术分享
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <body>
    success.jsp 成功<br>
    ${requestScope.message }<br/>
    姓名:${requestScope.emp.username}<br/>
    性别:${requestScope.emp.gender}<br/>
     入职时间:${requestScope.emp.hiredate}<br/>
    入职时间:<fmt:formatDate 
                value="${requestScope.emp.hiredate}"
                type="date"
                dateStyle="medium"
            />
        <!-- 
        1)fmt:formatDate 来源于 http://java.sun.com/jsp/jstl/fmt
        2)fmt:formatDate作用是格式化日期的显示,例如:2015年5月10日 星期日
        3)value表示需要格式化的值
        4)type表示显示日期,时间,都显示
          type=date表示只显示日期
          type=time表示只显示时间
          type=both表示日期时间均显示
        5)dateStyle表示显示日期的格式:short/medium/default/long/full
    -->
  </body>
</html>
View Code

 

  可以通过requestScope获得对象;日期问题可以通过:

  <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

技术分享
    入职时间:<fmt:formatDate 
                value="${requestScope.emp.hiredate}"
                type="date"
                dateStyle="medium"
            />
        <!-- 
        1)fmt:formatDate 来源于 http://java.sun.com/jsp/jstl/fmt
        2)fmt:formatDate作用是格式化日期的显示,例如:2015年5月10日 星期日
        3)value表示需要格式化的值
        4)type表示显示日期,时间,都显示
          type=date表示只显示日期
          type=time表示只显示时间
          type=both表示日期时间均显示
        5)dateStyle表示显示日期的格式:short/medium/default/long/full
    -->
View Code

  6)/WEB-INF/创建DispatcherServlet-servlet.xml配置文件,xml头部信息与spring.xml相同

       注意:该配置文件的命名规则:web.xml文件中配置的<servlet-name>的值-servlet.xml

技术分享
<?xml version="1.0" encoding="UTF-8"?>
<beans 
      xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xmlns:tx="http://www.springframework.org/schema/tx"
      xmlns:mvc="http://www.springframework.org/schema/mvc"
      xsi:schemaLocation="
      
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
      
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-3.0.xsd
       
      http://www.springframework.org/schema/aop 
      http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
      
      http://www.springframework.org/schema/tx
      http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    
      http://www.springframework.org/schema/mvc
      http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        
      ">
      
      
    
    <!-- 控制器(程序员) -->
    <bean name="/hello.action" class="cn.itcast.javaee.springmvc.base.HelloAction"></bean>  
    
    
    <!-- 映射器(框架) -->  
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>  
      
      
    <!-- 适配器(框架) -->  
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>  
      
      
    <!-- 视图解析器(框架) -->  
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>  
      
      
</beans>
View Code

 

  其中,配置位置可以自己定义;也可以在包中创建再通过src下的配置文件引用这个配置文件

  配置文件中四个对象

  7)部署web应用到tomcat中,通过浏览器访问如下URL

       http://127.0.0.1:8080/springmvc-day01/hello.action

3.加载自定义目录下的springmvc.xml配置文件

 

技术分享
    <!-- 注册springmvc框架核心控制器 -->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring.xml</param-value>    
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
View Code

 

4.解析视图逻辑名对应的真实路径

技术分享
    <!-- 视图解析器(框架) -->  
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
View Code

5.映射器Mapping

1) org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping(核心)

技术分享
      <!-- 注册控制器(程序员) -->
      <bean name="/add.action" class="cn.itcast.javaee.springmvc.mapping.UserAction"></bean>

      <!-- 注册映射器(handler包)(框架) -->
      <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
View Code

2) org.springframework.web.servlet.handler.SimpleUrlHandlerMapping

技术分享
      <!-- 注册控制器(程序员) -->
      <bean id="userActionID" class="cn.itcast.javaee.springmvc.mapping.UserAction"></bean>
        
      <!-- 注册映射器(handler包)(框架) -->
      <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
              <property name="mappings">
                  <props>
                      <prop key="/delete.action">userActionID</prop>
                      <prop key="/update.action">userActionID</prop>
                      <prop key="/find.action">userActionID</prop>
                  </props>
              </property>
      </bean>
View Code

6.控制器Controller

  org.springframework.web.servlet.mvc.ParameterizableViewController

  如果请求是/hello.action的请求路径,则直接跳转到/jsp/success.jsp页面,不经过程序员定义的控制器Action

 

技术分享
      <!-- /index.action请求,直接转发到/index.jsp页面 -->
      <bean name="/index.action" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
              <property name="viewName" value="http://www.mamicode.com/index.jsp"/>
      </bean>
      
      
     <!-- 注册视图解析器(view包)(框架) 
      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
              <property name="prefix" value="http://www.mamicode.com/"/>
              <property name="suffix" value="http://www.mamicode.com/.jsp"/>
      </bean>
      -->
View Code

 

  org.springframework.web.servlet.mvc.AbstractCommandController

  能够以实体的形式,收集客户端参数

技术分享
public class AdminAction extends AbstractCommandController{
    public AdminAction(){
        this.setCommandClass(Admin.class);
    }
    @Override
    protected ModelAndView handle(HttpServletRequest request,HttpServletResponse response, Object obj, BindException bindException)throws Exception {
        System.out.println("AdminAction::handle");
        ModelAndView modelAndView = new ModelAndView();
        Admin admin = null;
        if(obj instanceof Admin){
            admin = (Admin) obj;
        }
        modelAndView.addObject("username",admin.getUsername());
        modelAndView.addObject("gender",admin.getGender());
        modelAndView.addObject("hiredate",admin.getHiredate());
        modelAndView.setViewName("/jsp/success.jsp");
        return modelAndView;
    }
}
View Code

7.日期转换和编码过滤器

  1) 在默认情况下,springmvc不能将String类型转成Date类型,必须自定义类型转换器

 

技术分享
public class AdminAction extends AbstractCommandController{
    @Override
    protected void initBinder(HttpServletRequest request,ServletRequestDataBinder binder) throws Exception {
        binder.registerCustomEditor(Date.class,new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true));
    }
View Code

 

  2spring提供的,专用于解决POST提交中文乱码问题,需要在web.xml文件中配置

 

技术分享
    <!-- 编码过滤器 -->
    <filter>
        <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
View Code

 

------------------------------------------------------------------------

8.springmvc快速入门(注解版本)

 

SpringMVC