springmvc 学习笔记 2021.11.7~11.8

SpringMVC

学习方法转变

  • JavaSE、JavaWeb:老师带,容易入门
  • 框架:多自学,研究文档

这一章的目的:演进更好的MVC架构

image

一、初识SpringMVC

狂神说SpringMVC01:什么是SpringMVC (qq.com)

二、SpringMVC执行原理

image

三、深入学习SpringMVC

从第二节我们知道,Spring的核心就是DispatcherServlet的处理,这也是对接servlet的关键,下面是加入SpringMVC框架的步骤

首先我们需要知道,SpringMVC框架从web.xml中接过了servlet配置的功能,所以在web.xml中我们配置DispatcherServlet,它本身就是一个servlet

  • 第一步:在web.xml中配置DispatcherServlet

    <!--DispatcherServlet接手Servlet工作-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <!--SpringMVC的工作地点-->
            <param-value>classpath:spring-mvc-servlet.xml</param-value>
        </init-param>
        <!--启动等级-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!--对所有请求,但不包括jsp页面请求进行处理-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
  • 第二步,在从web.xml中接手Servlet工作后,我们需要开始配置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"
           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"/>
        <!--视图渲染配置:控制器也就是Controller处理完后获得模型和视图,交给ViewResolver处理,渲染数据并且转发到指定视图-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
            <!--前缀-->
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <!--后缀-->
            <property name="suffix" value=".jsp"/>
        </bean>
        <!--注册了的控制器--> 
        <bean id="/hello" class="com.xiaowei.controller.HelloController"/>
    
    </beans>
    
  • 第三步:接下来就编写控制器并且注册到上面的配置文件中

    public class HelloController implements Controller {
        @Override
        public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
            ModelAndView modelAndView = new ModelAndView();
            modelAndView.addObject("msg","hello MVC!");//加入数据
            modelAndView.setViewName("helloMVC");//设置转发的视图
    
            return modelAndView;
        }
    }
    

四、使用注解开发SpringMVC

首先一样是从web手中结果servlet的功能,所以web.xml是不变的

然后springmvc的配置文件变成了这样:(直接抄,稍微理解下即可,不用记),不需要注册controller了,因为注解实现了注册的功能

<?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.xiaowei.controller"/>
    <!-- 让Spring MVC不处理静态资源 -->
    <mvc:default-servlet-handler />
    <!--
    支持mvc注解驱动
     ↓  在spring中一般采用@RequestMapping注解来完成映射关系
     ↓  要想使@RequestMapping注解生效
     ↓  必须向上下文中注册DefaultAnnotationHandlerMapping
     ↓  和一个AnnotationMethodHandlerAdapter实例
     ↓  这两个实例分别在类级别和方法级别处理。
     ↓  而annotation-driven配置帮助我们自动完成上述两个实例的注入。
     -->
    <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>

然后再controller中,我们这样子写

@Controller
public class AnnotationHallo {
    @RequestMapping("/hello")
    public String hellofunc(Model model){

        model.addAttribute("msg","hello annotation");
        return "annotationhello";
    }
}
  • @Controller :使用了这个注解,就是控制器了
  • @RequestMapping("/hello"):这个是请求的地址,在地址栏上输入的
  • hellofunc(Model model):这里我们使用Model传输数据
  • return "annotationhello":这个地方返回的就是jsp视图的地址,前后缀已经在springmvc的配置文件中声明,所以这里不用加

五、RequiestMapping说明

直接加在方法中就是localhost:8080/项目名/注解参数

如果类和方法上都有这个注解就是localhost:8080/项目名/类注解参数/方法注解参数

六、RestFul风格讲解

RestFul风格:一个定位资源和资源操作的风格,不是标准也不是协议,让url和请求更简洁有层次更利于缓存等机制的实现。

如何实现?

@RequestMapping("/t1/{a}/{b}")
public String test(@PathVariable int a,@PathVariable int b, Model model){
    model.addAttribute("msg",a+b);
    return "test";
}

这样就可以。

详细用法:

  • @RequestMapping("/t1/{a}/{b}")可以指定请求方式如:

    • @RequestMapping(value = "/t1/{a}/{b}",method = RequestMethod.GET)
      
    • @PostMapping("/t1/{a}/{b}")
      
  • 前端表单可以指定提交方法来指定请求路径一样但是提交方式不一样的Controller。

好处:

  • url简洁了,开发方便了
  • 安全性高了
  • 层次清晰了

七、重定向和转发

@Controller
public class RedirectController {
    @RequestMapping("/c2/t1")
    public String test2(Model model){
        model.addAttribute("msg","RedirectController");
        return "test";
        //下面这两个即使没有视频解析器也可以用
        //return "forward:/index.jsp";这样子参数过得去,因为是转发
        //return "redirect:index.do";也可以重定向到另一个请求但是重定向的话参数过不去
    }
}

关键词:

  • forward:可以携带参数
  • redirect:携带不了参数

注意点:可以在没有视图解析器情况下也可以使用

八、接收请求参数及数据回显

提交参数

  • 提交的参数名和请求控制器中的参数名一致可以直接获取
  • 提交的参数名和请求控制器中的参数名一致,需要在控制器中参数加入注解@RequestParam("提交参数名")

提交一个对象

九、乱码问题解决

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>

十、什么是JSON

JSON是数据交换用的格式:在前后端分离的这个时代用得很多

JSON字符串长这样:

{"name":"xiaowei","age":"22","gender":"男"}

可以将这个字符串转化成对象,也可以将JSON对象转换成字符串

在JavaScript中这样用:

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>JSON_秦疆</title>
</head>
<body>

<script type="text/javascript">
   //编写一个js的对象
   var user = {
       name:"xiaowei",
       age:22,
       gender:"男"
  };
   //将js对象转换成json字符串
   var str = JSON.stringify(user);
   console.log(str);
   
   //将json字符串转换为js对象
   var user2 = JSON.parse(str);
   console.log(user2.age,user2.name,user2.sex);

</script>

</body>
</html>

我们需要知道在Java中如何使用JSON的数据格式和转换,这样才能完成前后端数据交换

十一、Jackson使用

依赖:

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.0</version>
</dependency>

创建JSON字符串:

public String test() throws JsonProcessingException {
    User user = new User("xiaowei",22,"男");
    ObjectMapper objectMapper = new ObjectMapper();
    String s = objectMapper.writeValueAsString(user);
    return s;
}

解决JSON字符串乱码问题

方法一、在视图渲染中设置json字符编码

@RequestMapping(value = "/j1",produces = "application/json;charset=utf-8")

方法二、springmvc配置解决

<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>

@RestController:只返回字符串,不去字符解析器,前后端分离的时候用,不渲染JSP了

传递数组的时候,用后端传入List的时候,前端经过解析JSON最后也是拥有多个对象的数组

转换Date时间戳的时候:

mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
//指定日期格式
mapper.setDateFormat(sdf);

思想:可以封装起来,会好一些

十二、Fastjson使用

依赖:

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.78</version>
</dependency>

使用:

//java对象---> json字符串
String jsonString = JSON.toJSONString(user);
//java对象---> json对象
JSONObject o = (JSONObject) JSON.toJSON(user);
//json字符串--->java对象
User user1=JSON.parseObject(jsonString,User.class);
//json对象--->Java对象
User user2 = JSON.toJavaObject(o, User.class);

十三~十九SSM整合

https://mp.weixin.qq.com/s?__biz=Mzg2NTAzMTExNg==&mid=2247484004&idx=1&sn=cef9d881d0a8d7db7e8ddc6a380a9a76&scene=19#wechat_redirect

二十、Ajax初体验

前端方法:

需要jQeury

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
    <script src="js/jQuery.js"></script>
    <script>
      function x() {
        $.ajax({
          url: "${pageContext.request.contextPath}/a1",
          data: {"name":$("#username").val()},
          success: function (data) {
            alert(data);
          }
        })
      }
    </script>
  </head>
  <body>
  <input type="text" id="username" onblur="x()">
  </body>
</html>

注意点:

  • 只要JavaScript读到了ajax请求会做Ajax要求的事情
  • 格式:
  • $.ajax({
    url: "请求地址",
    data: {"键":"值"},
    success: function (data) {//回调函数和后端传回的数据,data可以是data1data2都可以,反正就是后端resp写回来的数据
    alert(data);
    }
    })

后端时刻都准备接收请求

@RequestMapping("/a1")
public void toAjax(String name, HttpServletResponse resp) throws IOException {
    System.out.println("get:"+name);
    if(name.equals("xiaowei")){
        resp.getWriter().print(true);
    }else {
        resp.getWriter().print(false);
    }
}

注意点:需要用HttpServletResponse写回数据。

二十一、Ajax异步加载数据

$(#div1).html(....这里写html....)
这里的html由后端传回来就可以异步加载数据

二十二、拦截器是什么

和Filter差不多的东西,springmvc里的

实现:实现这个接口HandlerInterceptor

package com.xiaowei.interAop;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Lanjieqi implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("执行前");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("执行后");
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("清理");
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

配置,在springmvc中配置

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.xiaowei.interAop.Lanjieqi"></bean>
    </mvc:interceptor>
</mvc:interceptors>

二十三、登录判断验证

试着用刚刚学的拦截器做一下登录权限判断。

关键点:

  • 判断session
  • 判断是否登录页
  • request.getRequestURL()可以得到当前请求的url,用来判断是否拦截

二十四、文件上传下载

https://mp.weixin.qq.com/s?__biz=Mzg2NTAzMTExNg==&mid=2247484026&idx=1&sn=eba24b51963e8c3293d023cbcf3318dc&scene=19#wechat_redirect

posted @ 2021-11-08 22:29  小阴辨  阅读(46)  评论(0)    收藏  举报