SpringMVC原理图

SpringMVC接口解释

    1.DispatcherServlet接口:

    Spring提供的前端控制器,所有的请求都有经过它来统一分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。

    2.HandlerMapping接口:

    能够完成客户请求到Controller映射。

    3.Controller接口:

    需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。

    Controller将处理用户请求,这和Struts Action扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。

    从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。

    4.ViewResolver接口:

Spring提供的视图解析器(ViewResolver)在Web应用中查找View对象,从而将相应结果渲染给客户。


SpringMVC运行原理

       1. 客户端请求提交到DispatcherServlet
        2.由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller
        3.DispatcherServlet将请求提交到Controller
        4.Controller调用业务逻辑处理后,返回ModelAndView
       5. DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图
        6.视图负责将结果显示到客户端

 

1,DispatcherServlet是Spring MVC的核心,它的本质是一个实现了J2EE标准中定义的HttpServlet,通过在web.xml配置<servlet-mapping>,来实现对request的监听.

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	
	<servlet>
	<servlet-name>action</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	
	<init-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>classpath:action-servlet.xml</param-value>
	</init-param>
	</servlet>
	
	<servlet-mapping>
	<servlet-name>action</servlet-name>
	<url-pattern>*.action</url-pattern>
	</servlet-mapping>
		
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

 

以.action结尾的request都会由action来处理.
2.当接受到request的时候,DispatcherServlet根据HandlerMapping的配置(HandlerMapping的配置文件默认根据<servlet-name>的值来决定,这里会读取action-servlet.xml来获得HandlerMapping的配置信息),调用相应的Controller来对request进行业务处理.

<bean id="homeController" name="/home.action" class="reed.controller.HomeController"></bean>


调用reed.controller.HomeController,返回一个ModelAndView对象.

 

package reed.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
public class HomeController extends AbstractController{

	@Override
	protected ModelAndView handleRequestInternal(HttpServletRequest arg0,
			HttpServletResponse arg1) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("HomeController........");
		
		return new ModelAndView("home");
	}
}


根据返回的home及以下代码找到相应的view,如jsp

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsps/"></property>
    <property name="suffix" value=".jsp"></property>
    </bean>    

找到home.jsp


如何解决POST请求中文乱码问题,GET的又如何处理呢?

在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>

以上可以解决post请求乱码问题。对于get请求中文参数出现乱码解决方法有两个:

修改tomcat配置文件添加编码与工程编码一致,如下:

<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

另外一种方法对参数进行重新编码:

String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")

ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码