SpringMvc
1-SpringMVC简介
1.1-是什么
一个轻量级的MVC框架
1.2-为什么
- 轻量,简单
- 高效,基于响应
- 兼容Spring
- 用的人多
2-建立一个SpringMVC的流程
2.1-新建maven项目并添加web 框架支持
2.2-添加依赖项
<dependencies>
<!--测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--日志-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--jsp-->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>jsp-api</artifactId>
<version>6.0.14</version>
</dependency>
<!--jstl-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--springMVC-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.10.RELEASE</version>
</dependency>
</dependencies>
2.3-配置web.xml , 注册DispatcherServlet
<?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_4_0.xsd"
version="4.0">
<!--1.注册DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--启动级别-1-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--/ 匹配所有的请求;(不包括.jsp)-->
<!--/* 匹配所有的请求;(包括.jsp)-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2.4-编写SpringMVC 的 配置文件springmvc-servlet.xml
类型是spring配置文档,是在容器里注册MVC需要的类
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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">
<!--添加 处理映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--添加 处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--添加 视图解析器-->
<!--视图解析器:DispatcherServlet给他的ModelAndView-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
2.5-编写controller,实现controller接口,并注册
实现
public class firstcontroller implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv =new ModelAndView();
mv.setViewName("hello");//拼接之后是 WEB-INF/jsp/hello.jsp
mv.addObject("msg","hahaha");
return mv;
}
}
注册
<!--Handler-->
<bean id="/hello" class="com.sunspot.controller.firstcontroller"/>
2.6编写jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
</body>
</html>
2.7-测试
2.8-问题
-
404:需要在项目结构中添加lib文件夹,并导入全部依赖
-
404:是否注册了controller?
-
工件部署失败:web.xml不能有先导空行
3-使用注解开发
使用springMVC必须配置的三大件:
处理器映射器、处理器适配器、视图解析器
通常,我们只需要手动配置视图解析器,而处理器映射器和处理器适配器只需要开启注解驱动即可,而省去了大段的xml配置
3.1-web.xml
无变化
3.2-springmvc-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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 -->
<context:component-scan base-package="com.sunspot.controller"/>
<!-- 让Spring MVC不处理静态资源 -->
<mvc:default-servlet-handler />
<!--干掉处理器映射器和处理器适配器-->
<mvc:annotation-driven />
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
</beans>
3.3-controller
@Controller
注解表示它是一个controller(这是spring里3个等价于component的注解之一)
@RequestMapping("/hello")
意为/hello路径会对应这个controller(不加/似乎也可以)
return "hello"
配合视图解析器定位到WEB-INF/jsp/hello.jsp
Model model
在model中设置参数
@Controller
public class helloController {
@RequestMapping("hello")
public String hello(Model model){
model.addAttribute("msg","annotation");
return "hello";
}
}
4-参数处理
你的函数是可以加上httpRequest和HttpResponse参数的
这太低级了,有没有更高级的?
有,你可以直接在参数中写name,password等等
对于路径参数,就是xxx/{a}/xxx
,可以使用@RequestMapping("/hello/{a}/{b}")
获取映射,@PathVariable
声明你要接受的参数
对于查询字符串,就是xxx?id=xxx这种,可以使用@RequestParam
声明要接受的参数
@Controller
public class RestFulController {
//http://localhost:8080/RestFul/1/2
@GetMapping(value="RestFul/{a}/{b}")
public String fun1(@PathVariable int a, @PathVariable String b, Model model){
model.addAttribute("msg","PathVariable"+a+b);
return "hello";
}
//http://localhost:8080/RestFul?a=11&aa=111
@GetMapping(value="RestFul")
public String fun2(@RequestParam("a") int a, @RequestParam("aa") String b, Model model){
model.addAttribute("msg","RequestParam"+a+b);
return "hello";
}
}
5-RestFul风格
就是把xxx/xxx?key1=value1&key2=value2
转化为xxx/xxx/value1/value2
方法是使用路径参数
6-处理转发与重定向
重定向:return “redirect:全路径”
7-filter处理乱码问题
过滤器:继承过滤器接口,在web.xml中配置
springMVC自带编码过滤器
不加几乎必定GG
在web.xml加入如下内容
<filter>
<filter-name>encoding</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>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
8-JSON入门
8.1-什么是 JSON ?
- JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
- JSON 是轻量级的文本数据交换格式
- JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。
- JSON 具有自我描述性,更易理解
8.2-与 XML 相同之处
- JSON 是纯文本
- JSON 具有"自我描述性"(人类可读)
- JSON 具有层级结构(值中存在值)
- JSON 可通过 JavaScript 进行解析
- JSON 数据可使用 AJAX 进行传输
8.3-与 XML 不同之处
- 没有结束标签
- 更短
- 读写的速度更快
- 能够使用内建的 JavaScript eval() 方法进行解析
- 使用数组
- 不使用保留字
8.4使用json开发
原理:返回json数据,交给前端
mvc部分:使用@RestController
注解声明一个只返回字符串的类,或者使用@ResponseBody
注解声明一个只返回字符串的方法
json解析库部分:使用jackson或者fastjson库。
最佳实践:往往使用工具类封装一个自动转换的工具
8.5-jackson的使用
依赖
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.1</version>
</dependency>
controller
@Controller
public class jsonController {
@RequestMapping("/j1")
@ResponseBody
public String json1() throws JsonProcessingException {
User user1 = new User("name1","id1",1);
User user2 = new User("name2","id2",3);
List<User> users=new ArrayList<>();
users.add(user1);
users.add(user2);
return new ObjectMapper().writeValueAsString(users);
}
}
结果
[{"name":"name1","id":"id1","age":1},{"name":"name2","id":"id2","age":3}]
乱码问题
json可能存在乱码问题,即便设置了过滤器也一样,这时需要在springmvc-servlet.xml
将mvc:annotation-driven
更改为:
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
8.6-fastjson
依赖
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
</dependency>
使用
@RequestMapping("/j2")
@ResponseBody
public String json2() throws JsonProcessingException {
User user1 = new User("name1","id1",1);
User user2 = new User("姓名2","id2",3);
List<User> users=new ArrayList<>();
users.add(user1);
users.add(user2);
return JSON.toJSONString(users);
}
9-整合ssm框架
整体思路:数据库整合使用mybatis,web部分使用springmvc,整体项目使用spring托管
需要做的事:
- 导入依赖
- 软件包分层
- mybatis配置(扫描pojo的别名,注册dao的映射,数据库文件)
- spring整合dao层——将mybatis的对象注册(datasource,SqlSessionFactory)
- spring整合service层——将业务层的对象注册(一一注册或者扫描+注解)
- spring整合mvc——编写web.xml(注册DispatcherServlet和encodingFilter)
9.1-依赖文件
pom.xml
<dependencies>
<!--log4j日志-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.25</version>
</dependency>
<!--c3p0数据库连接池-->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.5</version>
</dependency>
<!--servlet-->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>servlet-api</artifactId>
<version>6.0.14</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>jsp-api</artifactId>
<version>6.0.14</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<dependency>
<groupId>org.singledog</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.3</version>
</dependency>
<!--spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.15</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.15</version>
</dependency>
</dependencies>
9.2-资源过滤
pom.xml
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
9.3-包基础架构
- pojo-存放bean对象
- dao-存放mapper接口以及映射xml
- servlet-业务层,调用dao(类似静态代理)
- controller-控制器层,调用servlet
- utils-存放代码小工具
- mybatis-config.xml-mybatis核心配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>
- applicationContext.xml-spring总体配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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">
</beans>
9.4-mybatis编写
database.properties·
加jdbc.前缀, 不然报错org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://bj-cynosdbmysql-grp-2ny5n7eg.sql.tencentcdb.com:21436/MyBatisLearing?useSSL=true&useUnicode=true&characterEncoding=UTF-8
jdbc.username=
jdbc.password=
mybatis核心配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<package name="com.sunspot.pojo"/>
</typeAliases>
<mappers>
<mapper class="com.sunspot.dao.UserDao"/>
</mappers>
</configuration>
pojo/bean编写
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
public int id;
public String name;
public String desc;
}
dao层编写
public interface UserDao {
List<User> getUserList();
User getUserById(@Param("id") int id);
int insertUser(User user);
int deleteUser(@Param("id") int id);
int updateUser(User user);
}
mapper.xml
写完xml记得要注册
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sunspot.dao.UserDao">
<select id="getUserList" resultType="User">
select * from wuziqi.User;
</select>
<select id="getUserById" resultType="User">
select * from wuziqi.User where id = #{id};
</select>
<insert id="insertUser" parameterType="User">
insert into wuziqi.User(name, `desc`)
values (#{name},#{desc});
</insert>
<update id="updateUser" parameterType="User">
update wuziqi.User
set name=#{name},desc=#{desc}
where id=#{id};
</update>
<delete id="deleteUser">
delete wuziqi.User where id=#{id};
</delete>
</mapper>
service业务层编写
接口
public interface UserServlet {
List<User> getUserList();
User getUserById(int id);
int insertUser(User user);
int deleteUser(int id);
int updateUser(User user);
}
实现
public class UserServletImpl implements UserServlet{
private UserDao userDao;
@Override
public List<User> getUserList() {
return userDao.getUserList();
}
@Override
public User getUserById(int id) {
return userDao.getUserById(id);
}
@Override
public int insertUser(User user) {
return userDao.insertUser(user);
}
@Override
public int deleteUser(int id) {
return userDao.deleteUser(id);
}
@Override
public int updateUser(User user) {
return userDao.updateUser(user);
}
}
9.5-spring整合
spring-dao.xml整合mybatis/dao层
<?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: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/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置整合mybatis -->
<!-- 1.关联数据库文件 -->
<context:property-placeholder location="classpath:database.properties"/>
<!-- 2.数据库连接池 -->
<!--数据库连接池
dbcp 半自动化操作 不能自动连接
c3p0 自动化操作(自动的加载配置文件 并且设置到对象里面)
-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 配置连接池属性 -->
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!-- c3p0连接池的私有属性 -->
<property name="maxPoolSize" value="30"/>
<property name="minPoolSize" value="10"/>
<!-- 关闭连接后不自动commit -->
<property name="autoCommitOnClose" value="false"/>
<!-- 获取连接超时时间 -->
<property name="checkoutTimeout" value="10000"/>
<!-- 当获取连接失败重试次数 -->
<property name="acquireRetryAttempts" value="2"/>
</bean>
<!-- 3.配置SqlSessionFactory对象 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 配置MyBatis全局配置文件:mybatis-config.xml -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!-- 4.配置扫描Dao接口包,动态实现Dao接口注入到spring容器中 -->
<!--解释 :https://www.cnblogs.com/jpfss/p/7799806.html-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- 给出需要扫描Dao接口包 -->
<property name="basePackage" value="com.sunspot.dao"/>
</bean>
</beans>
spring-service.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: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/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 扫描service相关的bean -->
<context:component-scan base-package="com.sunspot.servlet" />
<!--进行了上边扫描操作,这里就可以用注解代替写xmluserServletImpl注入到IOC容器中-->
<!--<bean id="userServletImpl" class="com.sunspot.servlet.UserServletImpl">
<property name="userDao" ref="userDao"/>
</bean>-->
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
9.6-springMVC整合
web.xml
<!--DispatcherServlet-->
<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:applicationContext.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>
<!--encodingFilter-->
<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>
<!--Session过期时间-->
<session-config>
<session-timeout>15</session-timeout>
</session-config>
applicationContext.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="spring-dao.xml"/>
<import resource="spring-service.xml"/>
<import resource="spring-mvc.xml"/>
</beans>
10-拦截器
什么是拦截器
就是拦截请求,检查。比如不登录不能进入某些页面
web.xml一致
在spring配置里加入
<mvc:interceptors>
<mvc:interceptor>
<!--/** 全部-->
<!--/xxx/** xxx下全部,类似/xxx/yyy会被拦截-->
<mvc:mapping path="/aaa"/>
<bean class="com.sunspot.intercepter.firstIntercepter"/>
</mvc:interceptor>
</mvc:interceptors>
拦截器需要实现HandlerInterceptor
接口
有三个方法,对应三个阶段
public class firstIntercepter implements HandlerInterceptor {
//请求前 true准入,false禁止
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return "msg".equals(request.getParameter("msg"));
}
// 执行后
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
// 清理工作
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
测试controller
@Controller
public class testCrontroller {
@RequestMapping("/aaa")
@ResponseBody
public String test(){
return "ok!!";
}
@RequestMapping("/bbb")
public String gotoo(){
return "aaa";
}
}
拦截了aaa,假如msg不是msg会被拦截
访问bbb,会天跳转到aaa.jsp提交表单,之后跳转到aaa,只有当msg合规时才会提示ok
11-文件操作
暂略