目录
随便转发到任何页面(可以不再ViewResolver的前后限制)
它是一种开发模式,它是模型视图控制器的简称.所有的web应用都是基于MVC开发.
M:模型层,包含实体类,业务逻辑层,数据访问层
V:视图层,html,javaScript,vue等都是视图层,用来显现数据
C:控制器,它是用来接收客户端的请求,并返回响应到客户端的组件,Servlet就是组件
步骤:
1.新建maven_web项目
2.修改目录,添加缺失的test,java,resources(两套),并修改目录属性
3.添加依赖
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-webmvcartifactId>
- <version>5.2.5.RELEASEversion>
- dependency>
-
- <dependency>
- <groupId>javax.servletgroupId>
- <artifactId>javax.servlet-apiartifactId>
- <version>3.1.0version>
- dependency>
4.添加springmvc.xml配置文件,指定包扫描,添加视图解释器
- <context:component-scan base-package="com.bjpowernode.controller">context:component-scan>
-
- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
-
- <property name="prefix" value="/admin/">property>
-
- <property name="suffix" value=".jsp">property>
- bean>
5.删除web.xml,自动生成的web.xml版本过低,重新添加web.xml
6.在web.xml文件中注册springMVC框架(所有的web请求都是基于servlet的)
-
- <servlet>
- <servlet-name>springmvcservlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
- <init-param>
- <param-name>contextConfigLocationparam-name>
- <param-value>classpath:springmvc.xmlparam-value>
- init-param>
- servlet>
- <servlet-mapping>
- <servlet-name>springmvcservlet-name>
- <url-pattern>/url-pattern>
- servlet-mapping>
在方法中声明一个自定义的实体类参数,框架调用实体类中相应的setter方法注入属性值,只要保证实体类中成员变量的名称与提交请求的name属性值一致即可。
使用框架提供的一个注解@PathVariable,将请求url中的值作为参数进行提取
请求与形参中的名字不对应,可以使用
@RequestParam(value="name1",required=true)String namea来进行参数名称绑定。
- /**
- * 姓名:
- * 年龄:
- */
- @RequestMapping("/five")
- public String five(HttpServletRequest request){
- String name = request.getParameter("name");
- int age = Integer.parseInt(request.getParameter("age"));
- System.out.println("name="+name+",age="+(age+100));
- return "main";
- }
pring 对于请求参数中的中文乱码问题,给出了专门的字符集过滤器: spring-web-5.2.5.RELEASE.jar 的org.springframework.web.filter 包下的 CharacterEncodingFilter 类。
在 web.xml 中注册字符集过滤器,即可解决 Spring 的请求参数的中文乱码问题。不过,最好将该过滤器注册在其它过滤器之前。因为过滤器的执行是按照其注册顺序进行的。
- <filter>
- <filter-name>encodefilter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
-
- <init-param>
- <param-name>encodingparam-name>
- <param-value>UTF-8param-value>
- init-param>
- <init-param>
- <param-name>forceRequestEncodingparam-name>
- <param-value>trueparam-value>
- init-param>
- <init-param>
- <param-name>forceResponseEncodingparam-name>
- <param-value>trueparam-value>
- init-param>
- filter>
- <filter-mapping>
- <filter-name>encodefilter-name>
- <url-pattern>/*url-pattern>
- filter-mapping>
默认的跳转是请求转发,直接跳转到jsp页面展示,还可以使用框架提供的关键字redirect:,进行一个重定向操作,包括重定向页面和重定向action,使用框架提供的关键字forward:,进行服务器内部转发操作,包括转发页面和转发action。当使用redirect:和forward:关键字时,视图解析器中前缀后缀的拼接就无效了。
- @RequestMapping("/one")
- public String one(){
- System.out.println("这是请求转发页面跳转.........");
- return "main"; //默认是请求转发,使用视图解析器拼接前缀后缀进行页面跳转
- }
- @RequestMapping("/five")
- public String five(){
- System.out.println("这是随便跳.......");
- //ViewResolver设置的prefix为/admin,这里可以跳转到其他folder下的页面
- return "forward:/fore/login.jsp";
- }
- @RequestMapping("/two")
- public String two(){
- System.out.println("这是请求转发action跳转.........");
- //forward: 这组字符串可以屏蔽前缀和后缀的拼接.实现请求转发跳转
- return "forward:/other.action";
- }
- @RequestMapping("/three")
- public String three(){
- System.out.println("这是重定向页面.......");
- //redirect: 这组字符串可以屏蔽前缀和后缀的拼接.实现重定向跳转
- return "redirect:/admin/main.jsp";
- }
- @RequestMapping("/four")
- public String four(){
- System.out.println("这是重定向action.......");
- //redirect: 这组字符串可以屏蔽前缀和后缀的拼接.实现重定向跳转
- return "redirect:/other.action";
- }
不需要去创建,直接拿来使用即可.
1)HttpServletRequest
2)HttpServletResponse
3)HttpSession
4)Model
5)Map
6)ModelMap
- //做一个数据,传到main.jsp页面上
- Users u = new Users("张三",22);
-
- //传递数据
- request.setAttribute("requestUsers",u);
- session.setAttribute("sessionUsers",u);
- model.addAttribute("modelUsers",u);
- map.put("mapUsers",u);
- modelMap.addAttribute("modelMapUsers",u);
注意:Map,Model,ModelMap和request一样,都使用请求作用域进行数据传递.所以服务器端的跳转必须是请求转发.
在springmvc.xml文件中添加注解驱动
<mvc:annotation-driven>mvc:annotation-driven>
@ResponseBody返回json格式
使用的jackson工具进行转换,必须要添加jackson依赖
- <dependency>
- <groupId>com.fasterxml.jackson.coregroupId>
- <artifactId>jackson-databindartifactId>
- <version>2.9.8version>
- dependency>
- @Controller
- public class AjaxAction {
- //处理ajax请求,一定要加@ResponseBody
- @ResponseBody
- @RequestMapping("/ajax")
- public List
ajax(){ - Student stu1 = new Student("张三",22);
- Student stu2 = new Student("李四",24);
- Student stu3 = new Student("王五",23);
- List
list = new ArrayList<>(); - list.add(stu1);
- list.add(stu2);
- list.add(stu3);
- //调用json转换工具ObjectMapper进行转换
- return list; //===>springmvc负责转换成json
- }
- }
日期类型不能自动注入到方法的参数中。需要单独做转换处理。使用@DateTimeFormat注解,需要在springmvc.xml文件中添加<mvc:annotation-driven/>标签。
- @RequestMapping("/submitone")
- public String submitdateone(
- @DateTimeFormat(pattern="yyyy-MM-dd")
- Date mydate){
- System.out.println(mydate);
- return "dateShow";
- }
或者
在类的成员setXXX()方法上使用@DateTimeFormat注解
- @DateTimeFormat(pattern="yyyy-MM-dd")
- public void setDate(Date date) {
- this.date = date;
- }
注册一个注解,用来解析本类中所有的日期类型,自动转换.
- @InitBinder
- public void initBinder(WebDataBinder dataBinder){
- dataBinder.registerCustomEditor(Date.class,new CustomDateEditor(sf,true));
- }
需要在类中的成员变量的getXXX方法上加注解.
- @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
- public Date getDate() {
- return date;
- }
- <dependency>
- <groupId>jstlgroupId>
- <artifactId>jstlartifactId>
- <version>1.2version>
- dependency>
在页面上导入标签库
- <%--导入jstl核心标签库--%>
- <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- <%--导入jstl格式化标签库--%>
- <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
- <table width="800px" border="1">
- <tr>
- <th>姓名th>
- <th>生日th>
- tr>
- <c:forEach items="${list}" var="stu">
- <tr>
- <td>${stu.name}td>
-
<fmt:formatDate value="${stu.birthday}" pattern="yyyy-MM-dd">fmt:formatDate>td>- tr>
- c:forEach>
- table>
9. mvc:annotation-driven
会自动注册两个bean:
分别为DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter。
是springmvc为@controller分发请求所必须的。除了注册了这两个bean,还提供了很多支持。
1)支持使用ConversionService 实例对表单参数进行类型转换;
2)支持使用 @NumberFormat 、@DateTimeFormat;
3)注解完成数据类型的格式化;
4)支持使用 @RequestBody 和 @ResponseBody 注解;
5)静态资源的分流也使用这个标签;
10.资源在WEB-INF目录下
很多企业会将动态资源放在WEB-INF目录下,这样可以保证资源的安全性。在WEB-INF目录下的动态资源不可以直接访问,必须要通过请求转发的方式进行访问。这样避免了通过地址栏直接对资源的访问。重定向也无法访问动态资源。
修改视图解析器的配置
-
- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
-
- <property name="prefix" value="/WEB-INF/jsp">property>
-
- <property name="suffix" value=".jsp">property>
- bean>
11.SpringMVC拦截器
SpringMVC 中的 Interceptor 拦截器,它的主要作用是拦截指定的用户请求,并进行相应的预处理与后处理。
1)preHandle():在请求被处理之前进行操作
2)postHandle():在请求被处理之后,但结果还没有渲染前进行操作,可以改变响应结果
3)afterCompletion:所有的请求响应结束后执行善后工作,清理对象,关闭资源
拦截器实现的两种方式
1)继承HandlerInterceptorAdapter的父类
2)实现HandlerInterceptor接口,实现的接口,推荐使用实现接口的方式
在springmvc.xml文件中注册拦截器
- <mvc:interceptors>
- <mvc:interceptor>
-
- <mvc:mapping path="/**"/>
-
- <mvc:exclude-mapping path="/showLogin">mvc:exclude-mapping>
- <mvc:exclude-mapping path="/login">mvc:exclude-mapping>
-
- <bean class="com.bjpowernode.interceptor.LoginInterceptor">bean>
- mvc:interceptor>
- mvc:interceptors>
12.过滤器
过滤器和拦截器的执行顺序
- public class TestFilter1 extends Filter {
-
- @Override
- protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
- //在DispatcherServlet之前执行
- System.out.println("############TestFilter1 doFilterInternal executed############");
- filterChain.doFilter(request, response);
- //在视图页面返回给客户端之前执行,但是执行顺序在Interceptor之后
- System.out.println("############TestFilter1 doFilter after############");
- }
- }
-
- public class TestFilter2 extends Filter {
-
- @Override
- protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
- //在DispatcherServlet之前执行
- System.out.println("############TestFilter2 doFilterInternal executed############");
- filterChain.doFilter(request, response);
- //在视图页面返回给客户端之前执行,但是执行顺序在Interceptor之后
- System.out.println("############TestFilter2 doFilter after############");
- }
- }
注册拦截器
-
- <filter>
- <filter-name>testFilter1filter-name>
- <filter-class>com.scorpios.filter.TestFilter1filter-class>
- filter>
- <filter-mapping>
- <filter-name>testFilter1filter-name>
- <url-pattern>/*url-pattern>
- filter-mapping>
-
- <filter>
- <filter-name>testFilter2filter-name>
- <filter-class>com.scorpios.filter.TestFilter2filter-class>
- filter>
- <filter-mapping>
- <filter-name>testFilter2filter-name>
- <url-pattern>/*url-pattern>
- filter-mapping>
13.跨域访问
注解@CrossOrigin出于安全原因,浏览器禁止Ajax调用驻留在当前原点之外的资源。
Spring Framework 4.2 GA为CORS提供了第一类支持,使您比通常的基于过滤器的解决方案更容易和更强大地配置它。所以springMVC的版本要在4.2或以上版本才支持@CrossOrigin
你可以向@RequestMapping注解处理程序方法添加一个@CrossOrigin注解,以便启用CORS(默认情况下,@CrossOrigin允许在@RequestMapping注解中指定的所有源和HTTP方法):
注解@CrossOrigin详解_huayang183的博客-CSDN博客_@crossorigin
-
相关阅读:
Shell脚本编程实践——第1关:编写一个脚本,求斐波那契数列的前10项及总和
MySQL大表优化方案
C#中的delegate和event,及他们的区别
JVM系列金九银十面试必看(至尊典藏版)
DCU集群搭建虚拟环境方法简介
Python05、字典、键值对、文件、标准库
直流无刷电机开环调速基于STM32F302R8+X-NUCLEO-IHM07M1(一)
Django day 10
分布式一致性协议
java 数据脱敏
-
原文地址:https://blog.csdn.net/qq_33753147/article/details/127459204