一.简介
Spring MVC主要由DispatcherServlet、处理器映射【找控制器】、适配器【调用控制器的方法】、控制器【业务】、视图解析器、视图组成。
请求流程
实现机制:
Springmvc基于servlet实现。
二.web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!--配置:所有以*.do的请求由springmvc管理-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置 DispatcherServlet 的一个初始化参数:配置SpringMVC 配置文件的位置和名称-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--
oad-on-startup 元素标记容器是否应该在web应用程序启动的时候就加载这个servlet,(实例化并调用其init()方法)。
它的值必须是一个整数,表示servlet被加载的先后顺序。
如果该元素的值为负数或者没有设置,则容器会当Servlet被请求时再加载。
如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个servlet,值越小,servlet的优先级越高,就越先被加载。值相同时,容器就会自己选择顺序来加载。
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<!--配置多个拦截,拦截restful风格的请求-->
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<!--配置拦截器,解决post提交中文乱码问题 -->
<filter>
<filter-name>EncodingFilter</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>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
三.springMVC基于xml开发
1.springMVC配置文件springmvc.xml(默认DispatcherServlet-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"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
<!--
Spring MVC主要由DispatcherServlet、
处理器映射【找控制器】、
适配器【调用控制器的方法】、
控制器【业务】、
视图解析器、
视图组成。
-->
<!--
配置 处理器映射 这个类用来处理url和执行类的对应关系
springmvc默认的处理器映射器:BeanNameUrlHandlerMapping
三种方式:
BeanNameUrlHandlerMapping:根据url请求去匹配bean的name属性,从而获取Controller
SimpleUrlHandlerMapping:根据浏览器url匹配key,value是Controller的id
ControllerClassNameHandlerMapping:在url中访问类名(不分大小写),找到对应的Controller
-->
<!--第一种-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!--第二种-->
<!--<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">-->
<!--<property name="mappings">-->
<!--<props>-->
<!--<prop key="/user1.do">beanId</prop>-->
<!--<prop key="/user2.do">beanId</prop>-->
<!--<prop key="/user3.do">beanId</prop>-->
<!--</props>-->
<!--</property>-->
<!--</bean>-->
<!--第三种-->
<!--<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean>-->
<!--
配置 控制器处理适配器 作用:配置调用Controller的细节(调用控制器的方法)
两种方式:
1.SimpleControllerHandlerAdapter
功能:执行controller调用controller里面的handleRequest方法,返回modelAndView
2.HttpRequestHandlerAdapter
功能:负责调用实现HttpRequestHandler接口的控制器
-->
<!--第一种-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!--第二种-->
<!--<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>-->
<!-- 3.配置 控制器(实现自己的业务逻辑) 浏览器接收 /user.do 地址的请求时 由UserController 来处理-->
<bean name="/user.do" class="com.miracle.web.controller.UserController"></bean>
<!--<bean name="/http.do" class="com.miracle.web.controller.HttpController"></bean>-->
<!-- 4.配置 资源视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/views/"></property>
<!-- 后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
2.三种处理器映射 配置
(1).BeanNameUrlHandlerMapping
(2).SimpleUrlHandlerMapping
(3).ControllerClassNameHandlerMapping
3.controller编写
UserController
package com.miracle.web.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class UserController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
// 由于DispatcherServlet-servlet.xml配置了 配置资源视图解析器 会自动拼接路径的前缀,后缀
// 最后实际路径 /WEB-INF/views/user/userlist.jsp
ModelAndView modelAndView = new ModelAndView("user/userlist"); //这里路径是服务资源路径
// 向 modelAndView 中存值,前端页面可以从中拿值
modelAndView.addObject("name", "赵兴邦");
return modelAndView;
}
}
四.SpringMVC的拦截器
1.概述
Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理
2.登录拦截器配置
<!-- 配置 springMVC拦截器,interceptors标签内可以配置多个拦截器 -->
<mvc:interceptors>
<!-- 配置一个登录拦截器 -->
<mvc:interceptor>
<!-- 这个拦截器拦截哪些路径 ,拦截所有请求 /** -->
<mvc:mapping path="/**"/>
<!-- 这个拦截器排除 拦截哪些路径,也可以在拦截器里面判断 -->
<!--<mvc:exclude-mapping path="/*login.do"/>-->
<!-- 告诉springMVC哪些类是拦截器 -->
<bean class="com.miracle.web.interceptor.LoginInterceptor"/>
</mvc:interceptor>
<!-- 配置多个拦截器,拦截器会顺序执行 -->
</mvc:interceptors>
3.拦截器编写
public class LoginInterceptor implements HandlerInterceptor{
//controller执行后且视图返回后调用此方法
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("返回视图前 后处理");
}
//controller执行后但未返回视图前调用此方法
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("未返回视图前 后处理....");
}
// controller执行前调用此方法
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
// TODO Auto-generated method stub
System.out.println("预处理....");
//如果是登录页面则放行
if(request.getRequestURI().indexOf("login.do")>=0){
return true;
}
HttpSession session = request.getSession();
//如果用户已登录也放行
if(session.getAttribute("user")!=null){
return true;
}
//用户没有登录挑战到登录页面
request.getRequestDispatcher("/WEB-INF/views/login.jsp").forward(request, response);
return false;
}
}
4.登录控制器
/**
* 登录相关的示例
*/
@RequestMapping("/login")
public String login(String username, String password, HttpServletRequest request, HttpServletResponse response){
if ("miracle".equals(username) && "123456".equals(password)){
// 登录成功
// 1.保存session
HttpSession session = request.getSession();
session.setAttribute("user", username);
// 2.进入主页面
return "redirect:/items/list.do";
}
return null;
}
5.登录界面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/login.do" method="post">
<table border="1">
<tr>
<td>用户名</td>
<td>
<input type="text" name="username">
</td>
</tr>
<tr>
<td>密码</td>
<td>
<input type="password" name="password">
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="登录">
</td>
</tr>
</table>
</form>
</body>
</html>