随笔 - 10  文章 - 0  评论 - 0  阅读 - 330

SpringMVC

SpringMVC

普通

  1. 配置 web.xml, 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>
        <!-- DispatcherServlet 要绑定Spring的配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <!-- 启动级别 : 1-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

/ * 匹配所有的请求,包括 jsp 页面

/ 只匹配所有的请求,不包括 jsp 页面

  1. 配置 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-3.0.xsd">
​
    <!--处理器映射器-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!--处理器适配器-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    <!--视图解析器-->
    <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.wang.controller.Hello"/></beans>
  1. 写实现 Controller 接口的处理器类

package com.wang.controller;
​
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
​
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
​
public class Hello implements Controller {
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mv = new ModelAndView();
        // 业务层处理返回结果
        String res = "HelloMVC";
        mv.addObject("msg", res);
        mv.setViewName("test");
        return mv;
    }
}

注解

  1. 配置 web.xml, 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>
        <!-- DispatcherServlet 要绑定Spring的配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <!-- 启动级别 : 1-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>
  1. 配置 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"
       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-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
​
    <context:component-scan base-package="com.wang.controller"/>
    <!--不处理静态资源   .css  .js  .html  .mp3  .mp4-->
    <mvc:default-servlet-handler/>
    <!--配置处理器映射器、处理器适配器-->
    <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>
  1. 注解实现处理类

package com.wang.controller;
​
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
​
@Controller
@RequestMapping("/hello")
public class HelloCtrl {
    @RequestMapping("/h1")
    public String hello(Model model){
        model.addAttribute("msg", "Hello, SpringMVC!");
        // web-info/jsp/hello.jsp, return的字符串被字符解析器处理
        // 加注解 @RestController, 返回值仍为字符串
        return "hello";
    }
}

RestFul 风格

package com.wang.controller;
​
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
​
@Controller
public class RestFul {
​
    @RequestMapping(value = "/multi/{a}/{b}",method = RequestMethod.GET)
    // 相当于
    @GetMapping("/multi/{a}/{b}")
    
    public String test(@PathVariable int a, @PathVariable int b, Model model){
        model.addAttribute("msg", a*b);
        return "hello";
    }
}
@PostMapping
@DeleteMapping
@PutMapping
@PatchMapping

转发与重定向

删除视图解析器后 转发与 重定向如下:

@RequestMapping("m1")
public String test1(Model model){
    model.addAttribute("msg","Test1");
    //        return "/WEB-INF/jsp/hello.jsp";
    //        return "forward:/WEB-INF/jsp/hello.jsp";
    return "redirect:/index.jsp";
}

有视图解析器,转发只需要目标的jsp,重定向前面加 redirect:即可

传递的是对象,需要保证对象属性的名字和参数名字一样,就可以自动传过来参数

乱码问题可通过过滤器解决,url 需要为 / * ,才可解决 jsp 乱码问题,Spring 处理乱码问题需要在 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>

Controller 返回 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.2</version>
</dependency>

@Controller + @ResponseBody 不会走视图解析器,会直接返回一个字符串,相当于一个 @RestController

@Controller
public class Jackson_test {
    @RequestMapping(value = "/j1",produces = "application/json;charset=utf-8")
    @ResponseBody
    public String test1() throws JsonProcessingException {
        ArrayList list = new ArrayList();
        User user1 = new User("张", 3, "女");
        User user2 = new User("张", 3, "女");
        Date date = new Date();
        list.add(user1);
        list.add(user2);
        list.add(date);
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        objectMapper.setDateFormat(simpleDateFormat);
        return objectMapper.writeValueAsString(list);
    }
}

Json 乱码不用每一个都设置produces,在 springmvc-servlet.xml 中配置如下:

<!--解决JSON乱码-->
    <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>

也可以用 fastjson,如下:

java 对象转 json 字符串
JSON.toJSONString;
json 字符串转 java对象
JSON.parseObject();
java 对象转 json 对象
JSON.toJSON();
json 对象转 java 对象
JSON.toJavaObject();

Ajax

首先编写前端页面

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

需要在 controller 层创建一个链接 /a1,如下:

@RestController
public class AjaxController {
    @RequestMapping("/a1")
    public void a1(String name, HttpServletResponse response) throws IOException {
        System.out.println(name);
        if ("wang".equals(name)){
            response.getWriter().println("true");
        } else {
            response.getWriter().println("false");
        }
    }
​
    @RequestMapping("/a2")
    public List<User> a2(){
        List<User> users = new ArrayList<User>();
        users.add(new User("王", 1, "女"));
        users.add(new User("李", 2, "男"));
        users.add(new User("赵", 3, "女"));
        return users;
    }
}

前端传递 username 的值,采用键值对的形式给 name 赋值 username.val,后端对传入的名字 name 进行判断,通过 success 函数传给前端数据为 data,前端对其进行显示或者其他处理。

下面是 /a2 链接的jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script src="${pageContext.request.contextPath}/statics/js/jquery-3.6.0.js"></script>
    <script>
        function b(){
            $.post({
                url:"${pageContext.request.contextPath}/a2",
                success:function (data){
                    // console.log(data);
                    var html1 = "<>";
                    for (let i = 0; i < data.length; i++) {
                        html1 += "<tr>" +
                            "<td>" + data[i].name + "</td>" +
                            "<td>" + data[i].age + "</td>" +
                            "<td>" + data[i].sex + "</td>" +
                            " </tr>"
                    }
                    $("#content").html(html1);
                }
            })
        }
        // $("#btn").click(function (){
        //
        // })
    </script>
</head>
<body>
<input type="button" value="加载数据" id="btn" onclick="b()">
    <table>
        <tr>
            <td>姓名</td>
            <td>年龄</td>
            <td>性别</td>
        </tr>
        <tbody id="content">
​
        </tbody>
    </table>
</body>
</html>

拦截器 Interceptor

拦截器是 AOP 思想的具体应用,是SpringMVC 独有的,故配置在 SpringMVC 的 xml 中

自定义一个类,实现 HandlerInterceptor 接口,重写 preHandle 函数,如下:

public class MyInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("======处理前======");
        return true;  // return false 则会被拦截
    }
    // postHandle,afterCompletion 用来输出日志等
}

在 SpringMVC 中配置拦截器,如下:

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.wang.interceptor.MyInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

文件上传 下载

配置 Maven 依赖,如下:

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>

配置 applicationContext.xml,如下:

<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
      id="multipartResolver">
    <property name="defaultEncoding" value="utf-8"/>
    <property name="maxUploadSize" value="10485760"/>    <!--10M-->
    <property name="maxInMemorySize" value="40960"/>
</bean>

编写表单:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
      
  <form action="${pageContext.request.contextPath}/upload1" enctype="multipart/form-data" method="post">
    <input type="file" name="file"/>
    <input type="submit" value="upload"/>
  </form>

  </body>
</html>

编写文件上传函数

@RestController
public class FileCtrl {
    @RequestMapping("/upload1")
    public String upload1(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {
        String originalFilename = file.getOriginalFilename();
        if ("".equals(originalFilename)){
            return "redirect:/index.jsp";
        }

        // 设置上传的保存路径
        String path = request.getServletContext().getRealPath("/upload");
        File realPath = new File(path);
        if (!realPath.exists()){
            realPath.mkdir();
        }

        // 文件输入流   文件输出流
        InputStream is = file.getInputStream();
        FileOutputStream os = new FileOutputStream(new File(realPath, originalFilename));

        int len = 0;
        byte[] buffer = new byte[1024];
        while ((len = is.read(buffer)) != -1){
            os.write(buffer,0,len);
            os.flush();
        }
        os.close();
        is.close();
        return "redirect:/index.jsp";
    }

    @RequestMapping("/upload2")
    public String upload2(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {
        // 设置上传的保存路径
        String path = request.getServletContext().getRealPath("/upload");
        File realPath = new File(path);
        if (!realPath.exists()){
            realPath.mkdir();
        }
        // 通过 transferTo 写文件
        file.transferTo(new File(path + "/" + file.getOriginalFilename()));
        return "redirect:/index.jsp";
    }
}

编写文件下载函数

@RequestMapping("/download")
public String download(HttpServletResponse response, HttpServletRequest request) throws IOException{
    // 要下载的图片地址
    String realPath = request.getServletContext().getRealPath("/upload");
    String filename = "BingWallpaper.jpg";
    // 设置响应头
    response.reset();
    response.setCharacterEncoding("utf-8");
    response.setContentType("multipart/form-data");
    response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(filename, "utf-8"));
    // 设置输入输出流
    FileInputStream fis = new FileInputStream(new File(realPath, filename));
    ServletOutputStream os = response.getOutputStream();
    int len = 0;
    byte[] buffer = new byte[1024];
    while ((len = fis.read(buffer)) != -1){
        os.write(buffer, 0, len);
        os.flush();
    }
    os.close();
    fis.close();
    return "ok";
}

前端

分为:

逻辑:判断、循环

事件:浏览器事件(window,document)、DOM事件(增删改查节点元素内容)、jQuery

视图:html,css,bootstrap,layui

通信:xhr(ajax)、axios(Vue)

posted on   木非辛  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示