文章目录
SpringMVC笔记
什么是SpringMVC
SpringMVC是一个Spring,SPring是容器,IOC能够管理对象,是用标签 @component @Repository @Servicer @ Controller
SpringMVC能够创建对象,放入容器中,SpringMVC容器中放的是控制器的对象
我们要做的时使用@Controller注解创建控制器对象,把对象放入到SpringMVC容器中,把重建对象作为控制器使用,这个控制器对象能够收到用户的氢气与,显示处理的结果,就当作一个servlet使用
使用@Controller创建的是一个普通类的对象,不是Servlet,SpringMVC赋予了控制器对象一些额外的功能
Web开发底层是Servlet,SpringMVC中有一个对象Servlet:DispatheServlet,是一个类,负责接受用户的所有请求,用户请求给了DispatheServlet,之后会把请求转发给 Controller对象,最后Controller对象处理请求
DispatheServlet涵盖了所有的Servlet
实现步骤
新建web maven工程
加入依赖
Spring-webmvc依赖间接的把Spring依赖都加入到项目中
JSP依赖、Servlet依赖
重点:在Web.xml中注册SpringMVC框架的核心:DispatheServlet
- DispatheServlet叫做中央调度器,是一个Servlet,父类为:HTTPServlet
- DispatheServlet也叫做前端控制器
- DispatheServlet负责接受用户的请求,调其它的控制对象,并把请求处理的结果显示给用户
创建一个发起请求取得页面
创建控制器类
-
在类的上面加入@Controller注解,创建对象,并把它放入到SpringMVC容器中
-
在类中的方法上面加入@ResquestMapping注解
ResquestMapping的注意点:
- 它的值是一个数组,这就标志这它可以有多个值,即处理多个方法。
创建一个作为结果的JSP,显示处理结果
创建SpringMVC的配置文件(与Spring的配置文件相同)
- 生命组件扫描器,指定@Controller注解所在的包名
- 生命视图解析器,帮助处理视图
测试一下
注册DispatheServlet
<servlet>
<!--此处为创建DispatherServlet的全过程-->
<!--名字可自取-->
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 创建一个xml,标识创建了一个对象,在默认去情况下会自动默认对象在web-INF下,此种方法可以自定义它的位置-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:Spring-controller.xml</param-value>
</init-param>
<!--设置它的启动时间,数字越小标识启动的时间越早,一般的为1 这里面的值可以为0~任何数
在这里标识启动的时间为tomcat服务器启动的时候。
-->
<load-on-startup>1</load-on-startup>
</servlet>
配置mapping
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--
两种方式:
1. 使用拓展名的方式: 语法: *.xxx 例子:*.do,标识只要是以.do结尾的则直接被这个servlet调用
2. 使用/
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
SpringMVC处理请求的流程
- 发起some.do
- tomcat根据web.xml文件知道这个请求给DispatherServlet
- DispatherServlet将这个some.do转发给控制器下的some.do方法
- 执行some.do()方法,把得到的ModelAndView进行处理,转发到show.jsp文件中
提高安全性:
在web项目中,如果文件放置在web-INF下是不能够随意被用户访问的,只有转发可以实现对该文件的访问,因此一些重要的文件(数据展示的JSP放置在WEB-INF文件下)
视图解析器
声明视图解析器可以减少重复的代码,能够极大提高效率
使用方法:
-
在Spring文件中声明视图解析器的配置
声明方式:
<!--配置视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--前缀--> <property name="prefix" value="/WEB-INF/view/"/> <!--后缀--> <property name="suffix" value=".jsp"/> </bean>
在我们的Java文件中,ModelAndView的setViewName设置为文件名,不需要后缀(.jsp等等)
view.setViewName("showInformatrion");
“/”的方式配置mapping
在项目中使用 / ,他会代替tomcat中的default。这种方式会导致所有的静态资源都交给了DispatherServlet处理,然而在默认情况下,DispatherServlet没有处理静态资源的能力,没有控制器能够处理静态的访问资源,所以所有的静态资源都无法找到(报错404)
动态资源能够访问是因为 程序中含有Controller控制器对象,能够处理动态资源
第一种处理方式:
-
在文件Spring配置文件中加入配置:
<mvc:default-servlet-handler/>
原理:加入这个标签后,框架会创建控制对象DefaultServletHttpRequestHandler(类似于controller对象),DefaultServletHttpRequestHandler对象会将请求转发给tomcat下的default的这个servlet
-
问题:动态资源无法使用,原因是这个"/"与注解@RequestMapping之间有冲突,会使注解失效,解决方法:
添加注解驱动:(在Spring配置文件中)
<mvc:default-servlet-handler/>
使用mvc:resources标签来实现
使用mvc:resources加入框架后会创建ResourceHttpServletHandler对象来处理对象,让这个静态资源能够访问,且不依赖tomcat服务器。
属性:
- mapping:表示静态资源的url地址,使用通配符**
- location:静态资源所在的位置
<mvc:resources mapping="image/**" location="/image/">
-
注解开发
注解1 @RequestMapping
在一个Controller中,在类名上方放入一个@RequestMapping且赋予Value值,这里的Value表示的是在这个类中公共的部分,即根部
例子如下:
@Controller
@RequestMapping(value = "/http")
public class KDA {
@RequestMapping(value = "/hello.do")
public ModelAndView modelAndView(){
ModelAndView view=new ModelAndView();
view.addObject("msg","啥子啊");
view.setViewName("showInformatrion");
return view;
}
@RequestMapping(value = "/yingying.do")
public ModelAndView at(){
ModelAndView view=new ModelAndView();
view.addObject("kda","嗷嗷嗷嗷~");
view.setViewName("showAlll");
return view;
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html> <head> <title>$Title$</title> </head>
<body>
<a href="http/hello.do" >发送请求</a>
<a href="http/yingying.do">啊哈哈哈</a>
</body>
</html>
控制请求的方式:
- 方法: @RequestMapping的属性中含有method方法:它的值中含有一个枚举类方法:RequestMethod方法 含有 post、get
获取参数:
在处理器中包含多种参数,最常用的参数为 HttpServletRequest HttpServletResponse HttpServletSession 以及请求中所携带的参数,这些参数会在系统调用时由系统自动复制,及程序原在方法内可直接使用
参数的位置:
放在方法的()内
public ModelAndView at(HttpServletResponse response,
HttpServletRequest request, HttpSession session){
return null;
}
逐个获取参数:
- 要求:处理器(控制器Controller)方法的形参名必须和请求中的参数名一致,同名的请求参数赋值给同名的形参
- 框架接收参数:
- 使用request对象接收请求参数:
- SpringMVC框架通过DispatherServlet调用Contorller下的方法,调用方法时,按名称对应,把接受的参数值赋予形参,此外框架会自动的进行类型转化
- 注意: null是一个常量,不能被强项转换类型
- 400状态码:是客户端问题,表示提交请求参数过程中发生了问题
- 包装 解决null
- 直接使用String
解决乱码问题: 使用过滤器:
目的:
- 在不适用过滤器的情况下 如果提交的数据为中文汉字,在get方法中无现象正常显示但是在post方法中会发生乱码现象,所以使用过滤器对编码进行强制的设置。
- 设置方法:
<!-- 注册声明过滤器,解决POST乱码的问题-->
<filter>
<filter-name>CharacterEncodingFilter</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>
<!-- 强制请求对象(HttpServletRequest)使用encoding编码的值-->
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<!-- 强制应答对象(HttpServletResponse) 使用encoding编码的值-->
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<!-- /*表示强制所有的请求先经过过滤器处理-->
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注解的使用-@RequestParam
在此处的作用是为了解决传参过程中参数的名字与形参的名字不一样的问题
属性:
- value 请求中的参数名字
- required:是一个boolean型,默认为true
- true:表示必须有参数传入,如果没有传入,则会报错,状态码(报错码):400
- false:表示可以不存在参数,即如果没有传入参数也不会报错
位置:在处理方法的形参的前面
用对象获取参数:
创建一个Java类用于封装各种对象,然后在处理方法的参数中加入该类,在进行传参的时候框架会自动的创建,并将这些属性自动赋给对象下面的属性
要求:
- 对象中的属性必须与参数中的属性相同
- 不能够使用注解@RequestParam
- 可以有多个对象
返回值
1. 返回一个ModelAndView
这种行经常使用,但是当我们知识需要数据的时候,则view多余,当我们只需要视图的时候,则Model多余,但是这种方式的较为方便
2. 返回String
这种发可以只返回一个String从而实现只实现视图的转跳而数据的的转发我们可以自己设置,即自己设置一个request作用域实现数据与视图的转发
//只实现视图的转发
@RequestMapping(value = "/string")
public String str(){
return "show";
}
//自行设置request作用域
@RequestMapping(value = "/string")
public String str(HttpServletRequest request){
request.setAttribute("msg","哈哈哈哈");
return "show";
}
注意:
在此时由于我们设置了视图解析器,在这时候只需要返回文件的名字即可,但是如果设置的String是一个完整的路径,那么不能够使用视图解析器,否则会报错
SSM
什么是SSM
SSM是一个简称,分别是Spring SpringMVC、Mybatis的结合使用的简称
使用流程:
用户发送请求–SpringMVC处理请求–Spring中的Service对象–Mybatis–返回到Service–返回到SpringMVC–返回到视图界面
对其功能的分析:
- SpringMVC容器:管理Contorller控制器对象
- Spring容器:管理Service、Dao、工具类对象
我们要做的是把使用的对象交给合适的容器进行创建,管理,吧controller还有web开发的相关对象交给SpringMVC容器,这些web用的对象卸载Springmvc配置文件中
Service、Dao对象可以定义在Spring容器中,让Spring管理这写对象
其他
SpringMVC容器与Spring容器是有关系的,关系为:Spring是SpringMVC的父容器,类似于Java中的继承,但是又不是那么相似,子容器中的Controller可以访问父容器中的Service对象,就可以实现Controller使用Service对象
实现步骤:
- 新建maven web项目
- 加入依赖:
- Spring依赖
- SpringMVC依赖
- mybatis依赖
- jackson依赖
- mysql依赖
- druid 连接池依赖
- jsp、servlet依赖
- 写web.xml文件
- 注册DispatherServlet,目的是:
- 创建SpringMVC容器对象,这样才能够创建Controller类对象
- 创建servlet,这样才能够处理用户的请求
- 注册Spring的监听器: ContextLoaderListener 目的:
- 创建Spring的容器对象,这样子才能够创建service dao等对象
- 注册 字符集过滤器,解决post乱码问题
- 注册DispatherServlet,目的是:
- 创建包:Controller、Service、Dao、实体类包
- 写SpringMVC、Spring、Mybatis的配置文件:
- 写代码,dao接口和mapper文件、service实现类、Controller、实体类
- 写JSP页面
MVC——其他
forward与redirect
forward:表示转发
redirect:表是重定向、
forward 与 redirect都是关键字,有一个共同的特点就是不和视图解析器一起工作
//处理器方法返回ModelAndView的时候会实现forward转发,
//语法: setViewName("forward:完整路径");
//特点:不能和视图解析器一同使用,就当视图解析器不存在。
@Controller@RequestMapping(value = "/ok")
public class userController {
@Resource
private userService userService;
@RequestMapping(value = "/ol.do")
public ModelAndView view(user user){
int nums=userService.addUser(user);
String tips="233";
if (nums>0){
tips="222";
}
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("msg",tips);
modelAndView.setViewName("forward:/WEB-INF/view/show.jsp");
return modelAndView;
}
}
//处理器方法返回ModelAndView的时候会实现redirect重定向,
//语法: setViewName("redirect:完整路径");
//特点:不能和视图解析器一同使用,就当视图解析器不存在,此外,这种方式会把设置的信息:addObject("msg",tips)以get的方法进行转发,显示在地址栏中
@Controller
@RequestMapping(value = "/ok")
public class userController {
@Resource
private userService userService;
@RequestMapping(value = "/ol.do")
public ModelAndView view(user user){
int nums=userService.addUser(user);
String tips="233";
if (nums>0){
tips="222";
}
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("msg",tips);
modelAndView.setViewName("redirect:/WEB-INF/view/show.jsp");
modelAndView.setViewName("tipsInformation");
return modelAndView;
}
}
//解决方法:在JSP页面中使用EL表达式来实现,${param.属性}
//其功能类似于:<%=request.属性名%>
但是需要注意的是:redirect不能够重定向到服务器内部的文件中——WEB-INF下的文件中
全局异常处理:
流程:
- 新建一个自定义异常类,在定义它的子类
- 在Controller中抛出自己响应的异常
- 创建一个类,作用全局异常处理类
- 在类的上面加入@ControllerAdvice
- 在类中定义方法,在方法上方加入@ExceptionHandler
- 创建异常处理的视图界面
- 配置MVC文件
- 组件扫描器: 扫描@Controller注解
- 组件扫描器: 扫描@ControllerAdvice所在的包
- 声明注解驱动
拦截器:
作用:
- 拦截器是SpringMVC中的一种,实现了HanderInterceptor接口
- 拦截器与过滤器的功能相似,但是侧重点不同,过滤器是用来过滤请求参数、设置编码字符集等工作的,而拦截器是拦截用户的请求的,是做请求处理的
- 拦截器是全局的,可以对多个Controller做拦截,一个项目中可以有0个或者多个拦截器,他们一起拦截用户的请求,
- 拦截器的存在:登录处理、权限检查、记录日志
实现步骤
- 定义类实现HandlerInterceptor接口
- 在SPringMVC中声明拦截器,让框架知道拦截器的存在。
执行时间:
- 在请求处理之前,也就是Controller类方法执行之前
- 在控制器方法执行之后也会被拦截
- 请求方法处理结束后也会被拦截
待定名称
-
preHandle:
- 名称:预处理
- 参数:request 、 response、Object object-----被拦截的控制对象
- 返回值:
- true
- false
- 特点:
- 在控制器方法执行之前执行,用户请求首先到达此方法
- 在这个方法中可以获取用户请求的信息,验证请求是否符合标准,也可以验证用户是否登录、验证用户是否有登录某个网站的权限(url),若失败,则拦断,反之则放行
- 使用: 配置SpringMVC文件:
<!--在interceptors声明拦截器,如果有一个则只出现一个 mvc:interceptor标签,如果有多个就出现多个--> <mvc:interceptors> <mvc:interceptor> <!--path可以使用通配符,这里表示 拦截所有的文件,/user/**表示拦截 user下的所有文件--> mvc:mapping path="/**"/> <!--这里表示拦截器的路径 是拦截器 不是要拦截的路径--> <bean class="a"/> </mvc:interceptor> </mvc:interceptors>
-
postHandle:
- 后处理(修正处理)
- 参数: Object object 被拦截处理的对象 modelAndView 处理器方法的返回值
- 特点:
- 再处理器方法之后执行
- 能够获取到处理器方法的返回值,可以修改modelAndView 中的数据和视图,修改执行结果
-
afterCompletion
- 最后执行
- 参数:
- Object 被拦截的处理对象 Exception:程序中发生的异常
- 特点:
- 再请求处理完成之后执行的,框架中规定是当你的视图处理之后,对视图执行了forward,就认为处理完成
- 一般做的是资源回收工作,程序请求过程中创建了一些对象,可以删除