springMvc实用开发

来源:互联网 发布:战地使命召唤知乎 编辑:程序博客网 时间:2024/06/07 23:35

一、简介

springMvc是基于模型-视图-控制器(Model-View-Controller)模式的web层应用框架。

二、请求流程

1、springMvc是围绕DispacherServlet(其实也就是一个Servlet)展开的,也就是说,通常DispatcherServlet会拦截所有请求,

之后在DispatcherServlet进行请求的分发处理。

2、在DispatcherServlet中,客户端请求到响应通常需经历以下流程:

request  一>  handlerMapping(request与handler的映射关系) 一>  handler(handlerAdapter封装)  一>  

ModelAndView(包含数据与逻辑视图名称)  一>   viewResolver(逻辑视图到真实视图的解析)  一>view(使用数据渲染真实视图)。

总结下流程,客户端请求到DispatcherServlet后,通过handlerMapping查找请求对应的控制器handler,

接着控制器handler处理请求并产生数据与逻辑视图,再根据viewResolver将逻辑视图解析为真实视图(视图模板),

最后使用之前生成的数据渲染最终需要的视图,返回给客户。

三、开发流程

在基于spring的web开发中,所有的spring配置都是在web.xml文件中进行加载的。

1、在web.xml文件中,添加配置监听器org.springframework.web.context.ContextLoaderListener   (实现了ServletContextListener接口)

如:

<listener>  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
2、在web.xml文件中,通过context-param添加配置文件

如:

<context-param>  <param-name>contextConfigLocation</param-name>  <param-value>classpath:spring-config.xml</param-value></context-param>
3、在web.xml文件中,添加DispathcerServlet及对应的配置文件、拦截路径(通常是/,即所有的)

如:

<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:dispatcher-servlet.xml</param-value>  </init-param></servlet><servlet-mapping>  <servlet-name>dispatcherServlet</servlet-name>  <url-pattern>/</url-pattern></servlet-mapping>
4、spring配置文件spring-config.xml编写,在此略过

5、在DispathcerServlet配置文件dispatcher-servlet.xml中,添加对注解的支持

<context:component-scan base-package="com.dragon.springmvcStudy" />

6、在DispathcerServlet配置文件dispatcher-servlet.xml中,添加映射器handlerMapping,

在这里,通过注解可以简化开发,即

<mvc:annotation-driven />
里面包含了映射器注解、校验等信息。

7、在DispathcerServlet配置文件dispatcher-servlet.xml中,添加视图解析器viewResolver

<!--视图解析 委托给一个或多个视图解析器进行解析--><bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">    <property name="viewResolvers">        <list>            <!--根据前缀和后缀,在war文件中查找视图模板-->            <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">                <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />                <property name="prefix" value="/WEB-INF/view/" />                <property name="suffix" value=".jsp" />            </bean>        </list>    </property>    <!--默认视图-->    <property name="defaultViews">        <list>            <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" />        </list>    </property></bean>

其中,ContentNegotiatingViewResolver 是委托给一个或多个视图解析器进行解析

,InternalResourceViewResolver是根据前缀和后缀来查找视图模板,当然还有其它的模板,这里是通用的。

8、在DispathcerServlet配置文件dispatcher-servlet.xml中,添加静态资源访问配置

如:

<mvc:resources mapping="/static/**" location="/WEB-INF/static/" />
这样,静态资源将不通过控制器,直接返回。

9、在DispathcerServlet配置文件dispatcher-servlet.xml中,如有需要,可以添加不经过控制器,直接访问页面的配置,

<mvc:view-controller path="/directPage" view-name="directPage" />
10、在DispathcerServlet配置文件dispatcher-servlet.xml中,如有需要,可以添加拦截器配置,进而对指定请求进行拦截处理,

<mvc:interceptors>    <mvc:interceptor>        <mvc:mapping path="/**"/>        <bean class="com.dragon.springmvcStudy.interceptor.HelloInterceptor" />    </mvc:interceptor></mvc:interceptors>
其中拦截器需实现org.springframework.web.servlet.HandlerInterceptor接口,内部有三个方法:

preHandle:controller处理前调用,返回true,则后续接点继续处理请求,返回false,则直接返回给用户,后续接点不再处理;

postHandle:controller处理请求后(同时页面渲染前)调用

afterCompletion:页面渲染结束后调用

11、在DispathcerServlet配置文件dispatcher-servlet.xml中,如有需要,可以进行文件上传相关配置,

如:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">    <!--单位是字节-->    <property name="maxUploadSize" value="10241000" />    <!--上传文件编码 默认是ISO-8859-1 -->    <property name="defaultEncoding" value="utf8" />    <!--上传文件默认路径-->    <property name="uploadTempDir" value="upload" /></bean>
注意:文件上传需要依赖两个包,分别是commons-io和commons-fileupload这两个包,同时文件上传的url路径名称不能是upload(特别注意,这是一个坑)

四、代码实例

1、添加maven依赖

<dependency>    <groupId>junit</groupId>    <artifactId>junit</artifactId>    <version>3.8.1</version>    <scope>test</scope></dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-beans</artifactId>    <version>4.3.4.RELEASE</version></dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-core</artifactId>    <version>4.3.4.RELEASE</version></dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-context</artifactId>    <version>4.3.4.RELEASE</version></dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-webmvc</artifactId>    <version>4.3.4.RELEASE</version></dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-web</artifactId>    <version>4.3.4.RELEASE</version></dependency><dependency>    <groupId>javax.servlet</groupId>    <artifactId>jstl</artifactId>    <version>1.2</version></dependency><dependency>    <groupId>javax.servlet</groupId>    <artifactId>jsp-api</artifactId>    <version>2.0</version>    <scope>provided</scope></dependency><dependency>    <groupId>javax.servlet</groupId>    <artifactId>servlet-api</artifactId>    <version>3.0-alpha-1</version>    <scope>provided</scope></dependency><dependency>    <groupId>commons-io</groupId>    <artifactId>commons-io</artifactId>    <version>2.5</version></dependency><dependency>    <groupId>commons-fileupload</groupId>    <artifactId>commons-fileupload</artifactId>    <version>1.3.1</version></dependency><dependency>    <groupId>com.fasterxml.jackson.core</groupId>    <artifactId>jackson-core</artifactId>    <version>2.8.6</version></dependency><dependency>    <groupId>com.fasterxml.jackson.core</groupId>    <artifactId>jackson-databind</artifactId>    <version>2.8.6</version></dependency><dependency>    <groupId>org.codehaus.jackson</groupId>    <artifactId>jackson-mapper-lgpl</artifactId>    <version>1.8.1</version></dependency><dependency>    <groupId>org.codehaus.jackson</groupId>    <artifactId>jackson-mapper-asl</artifactId>    <version>1.9.13</version></dependency>
2、web.xml配置

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">  <display-name>springMvcStudy</display-name>  <listener>    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  </listener>  <context-param>    <param-name>contextConfigLocation</param-name>    <param-value>classpath:spring-config.xml</param-value>  </context-param>  <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:dispatcher-servlet.xml</param-value>    </init-param>  </servlet>  <servlet-mapping>    <servlet-name>dispatcherServlet</servlet-name>    <url-pattern>/</url-pattern>  </servlet-mapping></web-app>
3、dispatcher-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:mvc="http://www.springframework.org/schema/mvc"       xmlns:context="http://www.springframework.org/schema/context"       xsi:schemaLocation="http://www.springframework.org/schema/beans       http://www.springframework.org/schema/beans/spring-beans.xsd        http://www.springframework.org/schema/mvc        http://www.springframework.org/schema/mvc/spring-mvc.xsd        http://www.springframework.org/schema/context        http://www.springframework.org/schema/context/spring-context.xsd">    <!--注解支持-->    <context:component-scan base-package="com.dragon.springmvcStudy" />    <!--静态资源-->    <mvc:resources mapping="/static/**" location="/WEB-INF/static/" />    <!--映射器注册,其中还包含了校验、转换等信息-->    <mvc:annotation-driven />    <!--不经过控制器,直接返回视图-->    <mvc:view-controller path="/directPage" view-name="directPage" />    <!--视图解析 委托给一个或多个视图解析器进行解析-->    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">        <property name="viewResolvers">            <list>                <!--根据前缀和后缀,在war文件中查找视图模板-->                <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">                    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />                    <property name="prefix" value="/WEB-INF/view/" />                    <property name="suffix" value=".jsp" />                </bean>            </list>        </property>        <!--默认视图-->        <property name="defaultViews">            <list>                <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" />            </list>        </property>    </bean>    <!--拦截器-->    <mvc:interceptors>        <mvc:interceptor>            <mvc:mapping path="/**"/>            <bean class="com.dragon.springmvcStudy.interceptor.HelloInterceptor" />        </mvc:interceptor>    </mvc:interceptors>    <!--文件上传解析器-->    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">        <!--单位是字节-->        <property name="maxUploadSize" value="10241000" />        <!--上传文件编码 默认是ISO-8859-1 -->        <property name="defaultEncoding" value="utf8" />        <!--上传文件过程中的临时路径,一旦上传完成,则文件将被删除-->        <property name="uploadTempDir" value="upload" />    </bean></beans>

5、拦截器interceptor实例

public class HelloInterceptor implements HandlerInterceptor {    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {        System.out.println("HelloInterceptor preHandle: "+new Date());        return true;    }    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {        System.out.println("HelloInterceptor postHandle: "+new Date());    }    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {        System.out.println("HelloInterceptor afterCompletion: "+new Date());    }}

6、控制器Controller实例

@Controller@RequestMapping("/")public class IndexController {    @RequestMapping("index")    public String index(Model model){        model.addAttribute("name","china");        return "index";    }    @RequestMapping("showjson")    @ResponseBody    public String showJson(){        return "json string";    }    @RequestMapping("myUpload")    public String upload(@RequestParam MultipartFile multiFile){        try{            String fileName = multiFile.getOriginalFilename();            System.out.println("fileName: "+fileName);            multiFile.transferTo(new File("E:/tmp/"+fileName));  //保存文件        }catch (Exception e){        }        return "index";    }}
7、页面jsp实例

<html><script type="text/javascript" src="/static/js/t.js"></script><body><h2>this is index</h2>hello,${name}<form method="post" action="/myUpload" enctype="multipart/form-data" >    <input type="file" name="multiFile">    <button type="submit">submit</button></form></body></html>

上述是一些关键的代码,像spring自身配置spring-config.xml这些,在此不多述。