7.2应用案例:SpringMVC
本案例程序结构如下图:

1、前端控制器DispatcherServlet
前端控制器是整个SpringMVC的核心。从名称来看,它是一个Servlet,拦截符合特定格式的URL请求,负责统一分发所有请求,初始化DispatcherServlet上下文对应的WebApplicationContext,并与业务层、持久化层建立联系,初始化SpringMVC的各个组件,并装配到DispatcherServlet中
前端控制器在web.xml文件中进行配置,负责接收HTTP请求、组织协调SpringMVC的各个组成部分,其内容如下。
<?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_3_0.xsd" id="WebApp_ID" version="3.0"> <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:springmvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> |
如果不指定<param-value>的值,则默认配置文件为/WEB-INF/<servlet-name>-servlet.xml。<load-on-startup>是启动顺序,通常让Servlet跟随Servlet容器一起启动。<url-pattern>定义要拦截的URL请求。
拦截规则:
*.xxx,指定要拦截的特定类型,最简单实用的方式,并且不会拦截静态文件
/,使用REST风格进行拦截,但是会导致静态文件被拦截不能正常显示
/*,不能像Struts那样使用,会导致不能访问jsp
如果使用/进行拦截,并且希望正常访问静态文件,可以在DispatcherServlet之前,使用DefaultServlet先拦截特定类型的请求(如:*.js、*.css等)。
2、控制器Controller
控制器负责处理用户请求,完成之后返回ModelAndView对象给前端控制器。因为需要考虑并发,所以必须保证线程安全并且可重用。
SpringMVC中的Controller与Struts中的Action基本相同。通过实现Controller接口或继承父类的方式编写控制器。代码如下。
package ctrl; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; public class LoginController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception { String str=arg0.getParameter("loginname"); String str2=arg0.getParameter("loginpassword"); //arg1.getWriter().write(str+" "+str2); ModelAndView vw=new ModelAndView(); vw.addObject("msg", str+" "+str2); vw.setViewName("mainpage.jsp"); return vw; } } |
同时我们设计配置文件springmvc-config.xml如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!-- 定义组件扫描器,指定需要扫描的包 --> <context:component-scan base-package="ctrl" /> <!-- 配置处理器Handle,映射“//loginController”请求 --> <bean name="/loginController" class="ctrl.LoginController" /> <bean class= "org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> <!-- 处理器适配器,配置对处理器中handleRequest()方法的调用--> <bean class= "org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /> <!-- 视图解析器 --> <bean class= "org.springframework.web.servlet.view.InternalResourceViewResolver"> </bean> </beans> |
3、视图解析器ViewResolver
负责对ModelAndView对象的解析,并查找对应的View对象。SpringMVC框架默认通过转发进行页面跳转,如果想通过重定向的方式进行跳转,有以下几种实现方式。
在控制器中,返回一个ModelAndView对象,由对象来指定重定向的URL:
ModelAndView vw=new ModelAndView();
vw.addObject("msg", str+" "+str2);
vw.setViewName("mainpage.jsp");
return new vw;
另外两个jsp文件代码如下:
文件login.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> <form action="loginCtrler" method="post"> <p> <input name="loginname" type="text" /> </p> <p> <input name="loginpw" type="text" /> </p> <p> <input name="" type="submit" value="提交" /> </p> </form> </body> </html> |
文件mainpage.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> 欢迎登录, ${msg } </body> </html> |
运行程序,并在浏览器中输入http://localhost:8080/springMVCannotation/login.jsp

点击提交按钮结果如下:


