SpringMVC
Spring MVC
代替之前MVC Controller(Servlet)层
web.xml文件配置
优先级高于springMVC配置 可以决定什么请求进入到springMVC中
<!--如果使用SpringMVC 就必须注册dispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--引入springmvc的配置文件-->
<!--
也可以不做配置
默认路径:WEB-INF/
默认文件名:<servlet-name>-servlet.xml
这个配置文件的默认文件名就是springmvc-servlet
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/app-context.xml</param-value>
</init-param>
<!--启动web容器就加载springmvc-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--请求映射 什么样的请求进入到springMVC-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/back/</url-pattern>
</servlet-mapping>
SpringMVC.xml配置文件
视图解析器 负责处理Controller 发送的请求 拼接访问页面 路径和后缀
要想使用注解 就必须在这开启注解扫描 (spring 和springMVC)
<!--开启spring注解扫描-->
<context:component-scan base-package="com.jsoft"></context:component-scan>
<!--开启springmvc注解扫描-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--处理映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!--处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<!--可以访问web-inf下加密路径 使用的是请求转发-->
<property name="prefix" value="/WEB-INF/pages/"></property>
<!--后缀-->
<property name="suffix" value=".jsp"></property>
</bean>
创建Controller类
-
实现Controller接口 重写handleRequest方法
-
设置请求页面名称 设置参数属性
-
返回modelAndView
//xml配置版
public class UserController implements Controller {
存在弊端 模型和视图耦合在了一起
//视图和模型分离
执行流程
Handler 处理器
Handler是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理,由于Handler涉及到具体用户业务请求,所以一般情况下Handler是由我们程序员来进行开发的
实际上Handler 就是我们开发的Controller
View 视图
一般情况下需要通过页面的标签或页面的模板技术展示给客户 需要由程序员根据业务需求开发具体的页面
实际上 就是我们写的HTML JSP。。。各种页面技术
DispatcherServlet 中央控制器
用户请求到达前端控制器 它就相当于MVC模式中的C DispatcherServlet是整个流程控制的核心
由它来调用其他组件处理用户的请求 DispatcherServlet的存在降低了组件的耦合性
类似于 门卫传达室 一个请求来的时候先去门卫 门卫再去分发请求 一步一步处理问题 就是Servlet
HandlerMapping 处理映射器
HandlerMapping 负责根据用户请求url找到Handler处理器 springmvc 提供了不同的映射器实现不同的映射方式,如配置文件方式 实现接口方式 注解方式
实际上 就是Map 放了一堆数据 key是url value是你对应的处理器 一个请求来了 调用map.get(url)就知道是哪个类的哪个方法来处理这个请求 实际上将这个url对应的拦截器 处理器都拿到
HandlerAdapter 处理器适配器
通过HandlerAdapter对处理器进行执行 这里适配器模式的应用 通过扩展适配器可以对更多类型的处理器进行执行
实际上 它会调用对应的方法 生成最终的ModelAndView
ViewResolver 视图解析器
它负责将处理结果生成view视图 ViewResolver 根据逻辑视图名解析成物理视图名 即具体的页面的地址 再生成View视图对象 最后对View进行渲染将处理结果通过页面展示给客户
实际上就是解析ModelAndView 拼接字符串 给你加个前缀 再加个后缀 让你能够找到对应的试图地址
Mapping注解
可以多层嵌套 下面请求路径就为(user/user)
可以使用通配符
字符集过滤器
配置在web.xml配置文件中
<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>
传参
@RequestParam("传递参数名")
使用RequestParam注解来标记参数 前台传输过来的数据的key是username的 值直接注入到参数中
如果前台传过来的参数的key和方法的形参的参数名是匹配的 就可以省略RequestParam注解
如果前台传过来的参数的key和User对象里的属性一 一对应
并且User类有对应的get set方法 就可以直接封装对象
//发送请求部分
<form action="login" method="post">
<p>用户名:<input type="text" name="username"></p>
<p>密码:<input type="password" name="password"></p>
<p><input type="submit" value="提交"></p>
</form>
//接受请求部分
SpringMVC想用什么用什么 直接写就可以 例如使用request Session等
重定向
在return后加入 redirect:请求名
筛选请求
params ="..." 存在具体条件才能通过 例子就是用户名只能为123
JSON发送和接收
@ResponseBody 当前方法就不走视图解析器,以json串的形式给出响应
@RequestBody 声明接收json串
spring中经典的9种设计模式
-
简单工厂
-
工厂方法
-
单例模式
-
适配器模式
-
装饰器模式
-
代理模式
-
观察者模式
-
策略模式
-
模板方法模式
全局异常
向前台返回异常
写异常枚举类 减少字面量
写返回结果工具类
写自定义异常
写全局异常控制器
产生错误时候 调用返回结果工具类的方法 将错误信息发送给前台 后台服务器打印错误信息
写Controller
写http请求
POST http://localhost:8080/SpringMVC/user/get
Content-Type: application/json
{
"username": "",
"password": "123"
}
格式转换器
文档流传参
写自定义格式转换类
//实现Converter接口
public class StringToDateConverter implements Converter<String,Date> {
配置格式转换器
<!--配置格式转换器-->
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean id="stringToDateConverter"
class="com.jsoft.converter.StringToDateConverter"></bean>
</set>
</property>
</bean>
声明实体类属性
JSON传参
直接声明实体类属性格式
声明接受形式为JSON
数据校验
配置pom.xml文件 导入hibernate-validator依赖
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.7.Final</version>
</dependency>
给需要校验的实体类属性添加相应注释
静态资源放行
直接放行
<!--放行静态资源-->
<mvc:resources mapping="/page/**" location="/page/"></mvc:resources>
<mvc:resources mapping="/js/**" location="/static/js/"></mvc:resources>
-
/page/* 只能访问到page下一层的目录 /page/** 可以访问page包下的任意层目录
页面配置
<body>
<h1>login page!!!</h1>
<a href="js/index.js"></a>
</body>
默认交还给tomcat
基本都能放行 除了极个别的 (可以采用直接放行)
<!--默认的servlet 交给tomcat-->
<mvc:default-servlet-handler/>
REST风格
| 请求 | 请求方式 | 操作 |
|---|---|---|
| /user/1 | get | 获取id为1的user对象(查询) |
| /user/1 | delete | 删除id为1的user对象(删除) |
| /user | put | 更新user对象(修改) |
| /user | post |

浙公网安备 33010602011771号