自学springmvc的回顾(1/1)
springmvc概述
springmvc是一个在sprig框架基础上专门为web所开发的框架。
springmvc的核心是DispatcherServlet(中央调度器),DispatcherServlet能够创建一个全局作用域对象,控制Controller对象,并且接受用户请求,并处理结果。
spirngmvc基本流程
1、新建web maven工程
2、加入依赖
spring-webmvc依赖、jsp、servlet、jackson依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
3、重点:在web.xml中注册springmvc框架的核心对象DispatcherServlet
(1)DispatcherServlet是叫做中央调度器,是一个servlet,它的父类是继承HttpServlet
(2)DispatcherServlet页叫做前端控制器
(3)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">
<servlet>
<servlet-name>springMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:dispatcherServlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup><!--tomcat启动后,创建Servlet对象-->
</servlet>
<servlet-mapping>
<servlet-name>springMvc</servlet-name>
<!--在框架中,使用url-pattern有两种值的表示
1、扩展名的方式*.do
2、使用/的方式
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!--过滤器,过滤接受请求和响应的字符集编码-->
<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>
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<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>
</web-app>
4、创建一个发起请求的页面 index.jsp
<form action="some.do" method="get">
name:<input type="text" name="name" id="name"/><br>
age:<input type="text" name="age" id="age"/><br>
<input type="submit" value="查看"/>
</form>
5、创建控制器类
(1)在类的上面加入@Controller注解,创建对象,并放入Springmvc容器中
(2)在类中的方法上面加入@RequestMapping注解
@Controller
public class MyController {
@RequestMapping(value ="/some.do",method = RequestMethod.GET)
public ModelAndView doSome(@RequestParam(value = "name",required = false) String name1, String age){
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("com",name1);
modelAndView.addObject("my",age);
modelAndView.setViewName("result");
return modelAndView;
}
6、创建一个作为结果的jsp页面,显示请求的处理结果。
name:${com}<br/>
age:${my}
7、创建springmvc的配置文件(spring的配置文件一样)
(1)声明组件扫描器,指定@Controller注解所在的包名
(2)声明视图解析器,帮助处理视图的
<?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">
<context:component-scan base-package="com.my.controller"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".jsp"/>
</bean>
<mvc:annotation-driven/>
<mvc:default-servlet-handler/>
</beans>
springmvc处理请求
1、处理请求的两个注解:@Controller、@RequstMapping
@Controller:控制器类对象,控制和处理请求
@RequestMapping:绑定请求到本类的方法上,处理请求(使用value属性绑定请求到方法上,method设置请求方式)
2、控制器对象方法参数都可以有哪些?
(1)HttpServletRequest、HttpServletResponse、HttpSession
(2)和请求参数名相同的参数(也可以使用@RequestParam来指定参数对应的请求参数名)
(3)java对象,要求属性名和参数名必须一致
(4)List、Map集合,数组
3、控制器对象方法返回值都可以有哪些?
(1)ModelAndView:表示视图和数据(对视图进行forward操作)
(2)String:表示视图,返回的字符串可以为视图路径(对视图进行forward操作)
注:使用String做返回值,要在ResquestMapping中写入produces=“text/plains;charset=utf-8”,来做字符编码的处理
(3)void:不能表示视图和数据,响应ajax
(4)对象Object:表示数据,响应ajax
4、springmvc框架响应ajax的步骤:
(1)加入jackson依赖
(2)加入注解驱动(<mvc:annotation-driven/>)到springmvc的配置文件中
(3)在Controller处理器方法上加@ResponseBody注解
5、在spirngmvc框架中,几乎不能处理静态资源,可以处理动态资源,如果DispatcherServlet的地址是"/"的话,可能会导致静态资源访问不到的情况。
6、解决静态资源访问失败的方法:
(1) 在springmvc配置文件加入<mvc:annotation-driven/>和<mvc:default-servlet-handler/>,是通过处理器对象DefaultRequestHandler处理静态资源
(2)使用<mvc:resources mapping="/images/**" location="/images/"></mvc:resources>,指定静态资源的位置,让框架处理
重定向和转发
1、重定向redirect:重新指定响应页面并携带请求数据,所以el表达式应该是
modelAndView.setViewName("redirect:绝对路径");
${param.参数名}
2、转发forward:由于视图解析器的存在,导致控制器对象只能从指定的参考路径出发,而其他路径的资源就访问不到,这时就可以使用forward
modelAndView.setViewName("forward:绝对路径");
springm框架的异常处理(流程)
1、新建一个自定义异常类MyUserException,再定义它的子类StudentException
public class MyException extends Exception {
public MyException() {
super();
}
public MyException(String message) {
super(message);
}
}
public class StudentException extends MyException{
public StudentException() {
super();
}
public StudentException(String message) {
super(message);
}
}
2、在controller类抛出StudentException异常
public ModelAndView addStudent(Student student) throws MyException {
String i1="注册成功";
int i = studentService.insertStudent(student);
if(student.getAge()>20){
throw new StudentException("注册信息不正确");
}
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("i1",i1);
modelAndView.setViewName("result");
return modelAndView;
}
3、创建一个普通类,作用全局异常处理类
(1)在类的上面加入@ControllerAdvice
(2)在类中定义方法,方法上面加入@ExceptionHandler
@ControllerAdvice
public class GlobalException {
@ExceptionHandler(value = StudentException.class)
public ModelAndView error(Exception exp){
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("exp",exp);
modelAndView.setViewName("error");
return modelAndView;
}
}
4、创建处理异常的视图页面
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>注册信息有误
${exp}
</h2>
</body>
</html>
5、创建springmvc的配置文件
(1)组件扫描器,扫描@Controller注解
(2)组件扫描器,扫描@ControllerAdvice所在的包名
(3)声明注解驱动
<context:component-scan base-package="com.controller"/>
<context:component-scan base-package="com.handler"/>
<mvc:annotation-driven/>
springm框架的拦截器(流程)
1、创建一个普通类,作为拦截器使用
(1)实现HandlerInterceptor接口
(2)实现接口中的三个方法
public class MyInterceptor implements HandlerInterceptor {
@Override/*在控制器方法前执行*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler/*被拦截的控制器对象*/) throws Exception {
return false;//代表已拦截
}
@Override/*在控制器方法执行结束后执行,一般是对modelandview的数据做处理*/
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override/*在forward结束后执行,一般是做资源回收工作的*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
2、创建springmvc的配置文件
(1)组件扫描器
(2)声明拦截器,并指定拦截的请求uri地址
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.handler.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
spingmvc中DispatcherServlet的具体处理
1、浏览器发送请求给DispatcherServlet
2、DispatcherServlet将请求发送给处理器映射器
3、处理器映射器将请求处理加入到处理器执行链中返回给DispatcherServlet
4、DispatcherServlet将处理器执行链交给处理器适配器
5、处理器适配器将处理器执行链交给Controller去执行
6、Controller按照执行流程去执行,将ModelAndView返回给DispatcherServlet
7、DispatcherServlet把ModelAndView交给视图解析器去解析成view
8、最后调用view响应给浏览器