一、SpringMVC概述
1、SpringMVC是一个基于MVC模式的WEB层框架,主要解决参数接收、文件上传&下载、表单验证
2、SpringMVC是建立在Spring基础上的。所以使用SpringMVC必须先保证你的项目拥有Spring的运行环境;
3、SpringMVC的功能就是之前servlet的功能
二、环境搭建
1、搭建Spring环境
2、配置tomcat服务器
3.导入SpringMVC依赖
xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
4.SpringMVC配置文件 spring-mvc.xml
ini
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
</beans>
5.在web.xml
中配置核心控制器DispatcherServlet
注意:
需要优先加载并读取配置文件spring-mvc.xml
xml
<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-mvc.xml</param-value>
</init-param>
<!-- 优先加载-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!-- /* 核心分发器拦截所有请求 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
6.编写controller,页面测试,配置Controller的Bean(不重要)
- Controller类(实现Controller接口并覆
handleRequest
方法)
ini
String name = request.getParameter("name");
System.out.println(name);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg","hello,海绵宝宝");
modelAndView.setViewName("/WEB-INF/hello.jsp");
return modelAndView;
- 在WEB-INF下建hello.jsp页面,使用EL表达式取Request域里的值
- spring-mvc.xml配置Bean
name:由核心分发器转到后台接口的URL
calss: controller的路径
ini
<bean name="/hello" class="cn.lifei._01hello.controller.HelloController"></bean>
启动Tomcat
访问hello能到hello页面表示成功搭建
三、前端控制器url-pattern配置(主流用第三种)
Spring的前端控制器拦截匹配规则,可以自己定义
sql
<url-pattern>...</url-pattern>
1、*.xxx(后缀匹配)
拦截固定结尾的uri ,如*.json、 *.html
不会
导致静态资源的拦截,只有以.xxx结尾的请求才会经过DispatcherServlet处理;
2、/*
会拦截所有url,一般只用在过滤器上
3、/ (重要,主要的配置方式)
javascript
<url-pattern>/</url-pattern>
会拦截js、css、.css、.htm等后缀型url
也是拦截所有
,包括静态资源,不会拦截*.jsp,如果想要访问静态资源需要在spring-mvc.xml里开启静态资源访问权限
arduino
- 放行静态资源
<mvc:default-servlet-handler/>
四、业务处理控制器的三种实现(主流用第三种)
1、 实现Controller接口;
实现接口COntroller并在spring-mvc.xml里配置(配置方法和环境搭建里的一样)
2、 实现HttpRequestHandler接口;
方法和上面一样,只是实现接口不同
3、 普通类(pojo)+注解 @RequestMapping;
建一个普通类,打类上@Controller
注解,在类和方法上打出注解@RequestMapping
,括号内是uri访问路径(和配置bean的name一样)
csharp
@RequestMapping("/insert")
public void test01 () {
System.out.println("新增请求");
}
注意:
- 使用
@Controller
注解需要配置扫描相应的包及其子包下的所有类
ini
<context:component-scan base-package="cn.lifei"></context:component-scan>
- 要使用
@RequestMapping
注解(请求映射支持),就需要配置映射
kotlin
<mvc:annotation-driven/>
五、控制器常用操作
控制器接收到请求后需要做:接收参数->跳转页面->绑定数据。这儿主要说前两个。
1、接受请求参数
1.1、处理中文参数乱码
参数接收首先要考虑乱码问题,之前是获取请求参数之前设置编码格式,如下:
vbscript
request.setCharacterEncoding("utf-8");
但这样的方式需要在每个控制器都要处理乱码,不够简便,因此引入过滤器进行优化
- 过滤器Filter
过滤器可以实现web容器在对某资源的访问前进行截获并进行相关的处理,因此可以在这个过程中对字符进行设置编码格式
在web.xml中配置字符编码过滤器并设置字符编码
xml
<filter>
<filter-name>characterEncoding</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>characterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
以下为强制指定字符编码,一般不配置,太过暴力,会导致就算再Request或者response设置字符编码也会执行强制的字符
xml
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
1.2、参数接收方式(主要第三种和第四种)
- 通过HttpServletRequest接收
csharp
//使用HttpServletRequest接收(不建议使用)
/**
* http://localhost/test01?name=admin&age=24
*/
@RequestMapping("/test01")
public void test01(HttpServletRequest request){
System.out.println(request.getParameter("name"));
System.out.println(request.getParameter("age"));
}
- 通过参数接收
csharp
/**
* http://localhost/test01?name=admin&age=24
*/
@RequestMapping("/test02")
public void test02(String name,Integer age){
System.out.println(name);
System.out.println(age);
}
- 通过对象接收
sql
创建一个User类
@RequestMapping("/test03")
public void test03(User user){
System.out.println(user);
}
- URL地址提取数据
less
/**
* 接收url中参数的请求,接收用户请求参数值
* http://localhost/params05/delete/100/tom
* 注:这种方式为RESTful风格,参数不易过多
*/
@RequestMapping("/test04/{id}/{name}")
public void test04(@PathVariable("id") Long id,@PathVariable("name")String name){
System.out.println(id);
System.out.println(name);
}
2、视图解析器
SpringMvc提供了InternalResourceViewResolver,用于统一管理响应视图的匹配
这里主要为写视图路径能更简便,使用之后,响应的数据会交给视图解析器进行解析,然后转向响应的页面,以下是xml中的配置
ini
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/" />
<property name="suffix" value=".jsp" />
</bean>
3、向页面传值
通过传统的HttpServletRequest传递;
vbscript
@RequestMapping("/test01")
public void test01(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("msg","test01");
request.getRequestDispatcher("/WEB-INF/hello.jsp").forward(request,response);
}
通过ModelAndView对象传递;
typescript
@RequestMapping("/test02")
public ModelAndView test02(){
return new ModelAndView("hello","msg","test02");
}
通过Model对象传递;
typescript
@RequestMapping("/test03")
public String test03(Model model){
model.addAttribute("msg","test03");
// return "forward:/WEB-INF/hello.jsp";
return "hello";
}
4、跳转方式
请求转发forward
重定向redirect
注意
:请求转发和重定向的时候,是不会经过视图解析器,需要配置全路径