当前位置: 首页 > news >正文

一文吃透 SpringMVC 中的转发和重定向

在这里插入图片描述

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:SSM 框架从入门到精通
✨特色专栏:国学周更-心性养成之路
🥭本文内容:一文吃透 SpringMVC 中的转发和重定向

文章目录

  • 项目案例(共用资源)
  • 1、请求转发到其他页面
  • 2、请求转发到其他控制器
  • 3、返回 String 时的请求转发
  • 4、返回 void 时的请求转发
  • 5、请求重定向到其他页面
    • 【1】通过 ModelAndView 中的 Model 携带参数
    • 【2】使用 HttpSession 携带参数
  • 6、请求重定向到其他控制器
    • 【1】通过 ModelAndView 的 Model 携带参数
    • 【2】使用 HttpSession 携带参数
  • 7、返回 String 时的重定向
    • 【1】重定向到页面时携带参数
    • 【2】重定向到控制器时携带参数
  • 8、返回 void 时的重定向

在这里插入图片描述

  当处理器完成请求处理后向其它资源进行跳转时,有两种跳转方式:请求转发重定向。根据跳转的资源类型,分为两类:跳转到 页面 与跳转到 其它处理器。请求转发的页面,可以是 WEB-INF 中页面,但重定向的页面不能为 WEB-INF中的页面的,因为重定向相当于用户重新发出一次请求,而用户是不可以直接访问 WEB-INF 中的资源。

项目案例(共用资源)

本项目案例是以 Idea+Maven 构建的项目,项目目录结构如下:

在这里插入图片描述

pom.xml 文件配置如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.kgc.springmvc03</groupId><artifactId>springmvc03</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><name>springmvc03 Maven Webapp</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.9</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.1</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency></dependencies>
</project>

spring-config.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/beanshttp://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 http://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 配置视图解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--逻辑视图前缀--><property name="prefix" value="/WEB-INF/jsp/"></property><!--逻辑视图后缀,匹配模式:前缀+逻辑视图+后缀,形成完整路径名--><property name="suffix" value=".jsp"></property></bean><!-- 配置组件扫描器 --><context:component-scan base-package="cn.hh.springmvc03"/>
</beans>

web.xml 文件配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"><display-name>springmvc17</display-name><!--注册字符集过滤器--><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>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><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:spring-config.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list>
</web-app>

1、请求转发到其他页面

  当处理器方法返回ModelAndView 时,跳转到指定的ViewName,默认情况下使用的是请求转发,当然也可显式的进行请求转发。此时,需在setViewName()指定的视图前添加forward关键字,一旦添加了forward关键字,控制器方法返回的视图名称就不会再与视图解析器中的前辍与后辍进行拼接,所以必须写出相对于项目根的完整路径才能返回正确的视图。

  当通过请求转发跳转到目标资源(页面或Controller)时,若需要目标资源传递数据,可以使用 HttpRequestServlet,HttpSession,还可以将数据存放于ModelAndView中的Model中。目标页面则通过 EL 表达式来访问该数据。下面案例演示使用ModelAndView的情形。

项目案例: 用户注册完毕后,显示用户的注册信息。

关键步骤:

【1】在 WEB-INF/jsp 下新建 register.jsp 和 info.jsp 页面

register.jsp 代码如下:

<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
用户注册
<form action="doregister.do">
姓名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
<input type="submit" value="注册"/>
</form>
</body>
</html>

indo.jsp 代码如下:

<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
用户注册信息<br/>
用户名:${user.username}<br/>
密码:${user.password}<br/>
</body>
</html>

【2】在 cn.hh.springmvc03.entity 包下,新建实体类 User,代码如下:

package cn.hh.springmvc03.entity;import lombok.Data;@Data
public class User {String username;String password;
}

【3】在 cn.hh.springmvc03.controller 包下,新建 UserController 控制器,代码如下:

package cn.hh.springmvc03.controller;import cn.hh.springmvc03.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/register.do")public String register(){return "register";}@RequestMapping("/doregister.do")public ModelAndView doRegister(User user){ModelAndView mv=new ModelAndView();mv.addObject("user",user);mv.setViewName("forward:/WEB-INF/jsp/info.jsp");return mv;}
}

【4】运行测试,输入“http://localhost:8080/user/register.do”,注册和转发页面如下图所示:

注册页面:

在这里插入图片描述

转发页面:
在这里插入图片描述

2、请求转发到其他控制器

  当前控制器的处理方法处理完毕后也可不返回视图,而是转发给下一个控制器方法继续处理。

项目案例: 用户注册成功后,转发给其他方法,由其他方法返回视图显示当前用户的基本信息。

关键步骤:

【1】 将 cn.hh.springmvc03.controller 包下的 UserController 控制器的 doRegister 方法替换成下面两个方法,代码如下:

package cn.hh.springmvc03.controller;import javax.servlet.http.HttpServletRequest;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;package cn.hh.springmvc03..entity.User;
@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/register.do")public String register(){return "register";}@RequestMapping("/doregister.do")public ModelAndView doRegister(User user){ModelAndView mv=new ModelAndView();mv.addObject("user",user);mv.setViewName("forward:second.do");return mv;}@RequestMapping("/second.do")public ModelAndView doSecond(User user){ModelAndView mv=new ModelAndView();mv.addObject("user",user);mv.setViewName("forward:/WEB-INF/jsp/info.jsp");return mv;}
}

  可以发现,参数仍然可以在两个方法之间传递,第一个方法把参数存进ModelAndView,第二个方法用同名形式参数接收。

  mv.setViewName(“forward:second.do”);这行代码实现转发到另一个方法second.do继续处理。

【2】运行测试,结果同前。

3、返回 String 时的请求转发

  当处理器方法返回String 时,该String 即为要跳转的视图。必须在其前面加上前辍 forward:,显式的指定跳转方式为请求转发。视图解析器将不会对其进行前辍与后辍的拼接,该String中的路径须是完整路径。

  请求转发的目标资源无论是一个页面,还是一个Controller,用法一样。

项目案例: 用户注册成功后,转发给其他方法,由其他方法返回视图显示当前用户的基本信息。

关键步骤:

  修改 UserController 控制器方法 doRegister 如下:

package cn.hh.springmvc03.controller;import javax.servlet.http.HttpServletRequest;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;package cn.hh.springmvc03..entity.User;
@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/register.do")public String register(){return "register";}@RequestMapping("/doregister.do")public String doRegister(User user,HttpServletRequest request){request.setAttribute("user", user);		return "forward:/WEB-INF/jsp/info.jsp";}
}

注意: 这种情况不能使用ModelAndView来传递数据,但可以使用HttpServletRequest等来传递数据。

4、返回 void 时的请求转发

  当处理器方法返回void时,可以使用HttpServletRequest实现请求转发。既可转发到页面,也可转发到其他控制器方法。若有数据需要向目标资源传递,可将数据放入到 HttpServletRequest或 HttpSession 中。但不能将数据放到 Model、RedirectAttributes中,因为这两者的数据都是通过拼接到处理器方法的返回值中,作为请求的一部分出现向下传递的。但这里没有返回值,所以它们中的数据无法向下传递。

package cn.hh.springmvc03.controller;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;import cn.hh.springmvc03.entity.User;
@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/login.do")public String login(){return "login";}//重定向到控制器@RequestMapping("/dologin.do")public String doLogin(User user,Model model){model.addAttribute("username",user.getUsername());model.addAttribute("password",user.getPassword());return "redirect:second.do";}//逐个参数接收@RequestMapping("/second.do")public ModelAndView doSecond(String username,String password){ModelAndView mv=new ModelAndView();mv.addObject("username",username);mv.addObject("password",password);mv.setViewName("redirect:/show.jsp");return mv;}//整体接收@RequestMapping("/third.do")public ModelAndView doThird(User user){ModelAndView mv=new ModelAndView();mv.addObject("username",user.getUsername());mv.addObject("password",user.getPassword());mv.setViewName("redirect:/show.jsp");return mv;}@RequestMapping("/fourth.do")public ModelAndView doFifth(HttpSession session){User user=(User) session.getAttribute("user");ModelAndView mv=new ModelAndView();mv.addObject("username",user.getUsername());mv.addObject("password",user.getPassword());mv.setViewName("redirect:/show.jsp");return mv;}@RequestMapping("/register.do")public String register(){return "register";}@RequestMapping("/doregister.do")public String doRegister(User user,HttpServletRequest request){request.setAttribute("user", user);		return "forward:/WEB-INF/jsp/info.jsp";}
}

5、请求重定向到其他页面

  在重定向时,请求参数不能通过HttpServletRequest向目标资源中传递。可以通过以下方式之一来传递请求参数。

【1】通过 ModelAndView 中的 Model 携带参数

  当ModelAndView中的Model 存入数据后,视图解析器InternalResourceViewResolver 会将map中的key 与value,以请求参数的形式放到请求的URL后。 注意事项:

  1. 放入到Model中的value,只能是基本数据类型与 String,不能是自定义类型的对象数据。原因是视图解析器会将Map的value放入到URL后作为请求参数传递出去,任何类型的value,都会变为String。
  2. 重定向的面页中是无法从request 中读取数据的。但由于map中的key与value,以请求参数的形式放到了请求的URL后,所以,页面可以通过EL表达式中的请求参数param读取。
  3. 重定向的页面不能是/WEB-INF下的页面。因为重定向相当于客户端发出一次新的请求,而客户端是不可以请求/WEB-INF下的资源的。

项目案例: 用户登录成功后, 通过重定向页面实现登录后显示用户信息。

关键步骤:

【1.1】在WebContent 下创建页面 show.jsp,复制之前的 login.jsp 页面。

show.jsp 代码如下:

<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
登录用户信息
<form action="doregister.do">
用户名:${param.username}<br/>
密码:${param.password}<br/>
</body>
</html>

【注意】这里用到了 param 对象。

Login.jsp 代码如下:

<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
用户登录
<form action="dologin.do">
姓名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/><br/>
<input type="submit" value="登录"/>
</form>
</body></html>

【1.2】修改 UserController 控制器,添加方法 doLogin 如下:

package cn.hh.springmvc03.controller;import javax.servlet.http.HttpServletRequest;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;import cn.hh.springmvc03.User;
@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/login.do")public String login(){return "login";}@RequestMapping("/dologin.do")public ModelAndView doLogin(User user){ModelAndView mv=new ModelAndView();mv.addObject("username",user.getUsername());mv.addObject("password",user.getPassword());mv.setViewName("redirect:/show.jsp");return mv;}@RequestMapping("/register.do")public String register(){return "register";}@RequestMapping("/doregister.do")public String doRegister(User user,HttpServletRequest request){request.setAttribute("user", user);		return "forward:/WEB-INF/jsp/info.jsp";}
}

【1.3】测试运行,输入“http://localhost:8080/user/login.do”。
再次测试:如果在 show.jsp 页面删除 param,能否接收到数据。

【2】使用 HttpSession 携带参数

项目案例: 用户登录成功后, 通过重定向页面实现登录后显示用户信息。

关键步骤:

【2.1】在WebContent 下创建页面 show2.jsp,代码如下:

<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
登录用户信息<br/>用户名:${user.username}<br/>
密码:${user.password}<br/>
</body>
</html>

【2.2】修改方法 doLogin 代码如下:

	@RequestMapping("/dologin.do")public ModelAndView doLogin(User user,HttpSession session){ModelAndView mv=new ModelAndView();session.setAttribute("user", user);mv.setViewName("redirect:/show2.jsp");return mv;}

【2.3】测试运行,输入“http://localhost:8080/user/login.do”。

6、请求重定向到其他控制器

  重定向到其它 Controller方法时,携带参数可以采用前面的其中一个方式。而目标Controller 接收这些参数,也有多种方式。

【1】通过 ModelAndView 的 Model 携带参数

  目标Controller在接收这些参数时,只要保证目标 Controller的方法形参名称与发送 Controller 发送的参数名称相同即可接收。当然,目标 Controller 也可以进行参数的整体接收。只要保证参数名称与目标 Controller接收参数类型的类的属性名相同即可。

项目案例: 用户登录成功后, 通过重定向页面实现登录后显示用户信息。(

【1.1】修改doLogin方法,添加两个目标方法。

	@RequestMapping("/dologin.do")public ModelAndView doLogin(User user){ModelAndView mv=new ModelAndView();mv.addObject("username",user.getUsername());mv.addObject("password",user.getPassword());//第1次测试mv.setViewName("redirect:second.do");//第2次测试//mv.setViewName("redirect:third.do");return mv;}	//整体接收@RequestMapping("/second.do")public ModelAndView doSecond(User user){ModelAndView mv=new ModelAndView();mv.addObject("username",user.getUsername());mv.addObject("password",user.getPassword());mv.setViewName("redirect:/show.jsp");return mv;}	//逐个参数接收@RequestMapping("/third.do")public ModelAndView doThird(String username,String password){ModelAndView mv=new ModelAndView();mv.addObject("username",username);mv.addObject("password",password);mv.setViewName("redirect:/show.jsp");return mv;}

【1.2】测试运行,输入http://localhost:8080/user/login.do。

  注释掉mv.setViewName(“redirect:second.do”),添加mv.setViewName(“redirect:third.do”)再次测试。观察两次结果是否相同。

【2】使用 HttpSession 携带参数

项目案例: 用户登录成功后, 通过重定向页面实现登录后显示用户信息。

关键步骤: 修改 UserController 代码如下:

	@RequestMapping("/dologin.do")public ModelAndView doLogin(User user,HttpSession session){session.setAttribute("user", user);ModelAndView mv=new ModelAndView();		mv.setViewName("redirect:fourth.do");return mv;}	@RequestMapping("/fourth.do")public ModelAndView doFifth(HttpSession session){User user=(User) session.getAttribute("user");ModelAndView mv=new ModelAndView();mv.addObject("username",user.getUsername());mv.addObject("password",user.getPassword());mv.setViewName("redirect:/show.jsp");return mv;}

7、返回 String 时的重定向

  可以重定向到页面,也可以重定向到其他控制器方法。当处理器的方法返回类型为String时,可在字符串中添加前缀redired:即可实现重定向。如果还要传递参数,可以通过URL携带参数,通过HttpSession 携带参数,通过Model携带参数等多种办法。这里重点介绍Model和RedirectAttributes携带参娄和的办法。

【1】重定向到页面时携带参数

【1.1】通过 Model 形参携带参数

  在Controller形参中添加 Model 参数,将要传递的数据放入 Model 中进行参数传递。这种方式同样也是将参数拼接到了重定向请求的 URL后,因而放入其中的数据只能是基本类型数据,不能是自定义类型。

项目案例: 用户登录成功后, 通过重定向页面实现登录后显示用户信息。

关键步骤: 修改 UserController 代码如下:

	@RequestMapping("/dologin.do")public String doLogin(User user,Model model){model.addAttribute("username",user.getUsername());model.addAttribute("password",user.getPassword());return "redirect:/show.jsp";}

【1.2】通过形参 RedirectAttributes 携带参数

  RedirectAttributes专门用于携带重定向参数的。它其实继承自Model的接口,底层仍然使用ModelMap 实现。所以,这种携带参数的方式,同样不能携带自定义对象。

项目案例: 用户登录成功后, 通过重定向页面实现登录后显示用户信息。

关键步骤: 修改 UserController 代码如下:

	@RequestMapping("/dologin.do")public String doLogin(User user,RedirectAttributes rd){rd.addAttribute("username",user.getUsername());rd.addAttribute("password",user.getPassword());return "redirect:/show.jsp";}

  要使用 RedirectAttributes 参数,还需要在 SpringMVC 的配置文件中注册MVC 的注解驱动。

<mvc:annotation-driven/>

【2】重定向到控制器时携带参数

  重定向到控制器时,携带参数的方式,可以使用请求 URL 后携带方式,HttpSession携带方式,Model 形参携带方式等,下面案例学习下使用Model 形参携带参数,注意传递与接收的要点就是接收方法的形参的名称要与传递方法的model中的key名称一致。可以整体接收,也可以逐个参数接收。

项目案例: 用户登录成功后, 通过重定向页面实现登录后显示用户信息。

关键步骤: 修改 UserController 代码如下:

	//重定向到控制器@RequestMapping("/dologin.do")public String doLogin(User user,Model model){model.addAttribute("username",user.getUsername());model.addAttribute("password",user.getPassword());return "redirect:second.do";}//逐个参数接收@RequestMapping("/second.do")public ModelAndView doSecond(String username,String password){ModelAndView mv=new ModelAndView();mv.addObject("username",username);mv.addObject("password",password);mv.setViewName("redirect:/show.jsp");return mv;}//整体接收@RequestMapping("/second.do")public ModelAndView doSecond(User user){ModelAndView mv=new ModelAndView();mv.addObject("username",user.getUsername());mv.addObject("password",user.getPassword());mv.setViewName("redirect:/show.jsp");return mv;}

8、返回 void 时的重定向

  当处理器方法返回 void 时,使用 HttpServletResponse 的sendRedirect()方法实现重定向。若有数据需要向下一级资源传递,需要将数据放入到HttpSession中,不能放在HttpServletRequest中。

项目案例: 用户登录成功后, 通过重定向页面实现登录后显示用户信息。

关键步骤:

修改 UserController 代码如下:

	//重定向到控制器@RequestMapping("/dologin.do")public void doLogin(User user,HttpSession session,HttpServletRequest request,HttpServletResponse response){session.setAttribute("username",user.getUsername());session.setAttribute("password",user.getPassword());try {response.sendRedirect(request.getContextPath()+"/show3.jsp");} catch (IOException e) {e.printStackTrace();}}

在WebContent下添加页面 show3.jsp,代码如下:

<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Insert title here</title>
</head>
<body>登录用户信息<br/>用户名:${username}<br/>密码:${password}<br/>
</body>
</html>

  码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述

相关文章:

一文吃透 SpringMVC 中的转发和重定向

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

Hbase操作命令

目录 创建表&#xff0c;表中有两个列族 baseinfo, schoolinfo 查看指定表全名空间中的表 查看表描述 禁用/启用 查看是否启用/禁用 删除表 注意&#xff0c;首先要将删除的表设置为禁用状态才可以删除&#xff0c;否则会报错 新增列族 删除列族 更改列族存储版本的限制 增…...

1>LINK : fatal error LNK1104: cannot open file ‘libconvtname.obj‘

我自己最后找到问题原因是&#xff1a; 引用的库名称没有.lib&#xff0c;只有libconvtname。 改成完整的libconvtname.lib即可。 以下是chatGPT的回答 The error message "fatal error LNK1104: cannot open file libconvtname.obj" usually occurs when Visual S…...

数据结构——链表OJ题目讲解(1)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年3月7日 内容&#xff1a;数据结构链表OJ题目讲解 题目来源&#xff1a;力扣和牛客 目录 前言&#xff1a; 刷题&#xff1a; 1.移出链表元素&#xff1a; 2.链表的中间结点&#xff1a; 3. 链表中倒数第k个结点&#xff1…...

LeetCode_二分搜索_困难_154.寻找旋转排序数组中的最小值 II

目录1.题目2.思路3.代码实现&#xff08;Java&#xff09;1.题目 已知一个长度为 n 的数组&#xff0c;预先按照升序排列&#xff0c;经由 1 到 n 次 旋转 后&#xff0c;得到输入数组。例如&#xff0c;原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到&#xff1a; 若旋转 4…...

面向对象设计模式:创建型模式之建造者模式

一、引入 Build&#xff1a;建造和构建具有建筑结构的大型物体 建楼&#xff1a;打牢地基、搭建框架、然后自下而上一层层盖起来。构建物体&#xff1a;通常需要先建造组成这个物体的各个部分&#xff0c;然后分阶段把它们组装起来 二、建造者模式 2.1 Intent 意图 Separate…...

集成学习boosting、bagging、stacking

目录 一、介绍 二、三种架构学习 &#xff08;1&#xff09;boosting &#xff08;2&#xff09;bagging &#xff08;3&#xff09;stacking 一、介绍&#xff1a; 对于单个模型来说很难拟合复杂的数&#xff0c;模型的抗干扰能力较低&#xff0c;所以我们希望可以集成多…...

数据模型(上):模型分类和模型组成

1.模型分类 ​ 数据模型是一种由符号、文本组成的集合,用以准确表达信息景观,达到有效交流、沟通的目的。数据建模者要求能与来自不同部门,具有不同技术背景,不同业务经验,不同技术水平的人员交流、沟通。数据建模者要了解每个人员的观点,并通过反馈证明理解无误,最终作…...

郑州轻工业大学2022-2023(2) 数据结构题目集 - ZZULI

6-1 线性表元素的区间删除 6-1 线性表元素的区间删除 分数 20 全屏浏览题目 切换布局 作者 DS课程组 单位 浙江大学 给定一个顺序存储的线性表&#xff0c;请设计一个函数删除所有值大于min而且小于max的元素。删除后表中剩余元素保持顺序存储&#xff0c;并且相对位置不能改变…...

【Python语言基础】——Python MySQL Drop Table

Python语言基础——Python MySQL Drop Table 文章目录Python语言基础——Python MySQL Drop Table一、Python MySQL Drop Table一、Python MySQL Drop Table 删除表 您可以使用 “DROP TABLE” 语句来删除已有的表&#xff1a; 实例 删除 “customers” 表&#xff1a; import…...

2023美团面试真题

面试前需要准备&#xff1a; 1. Java 八股文&#xff1a;了解常考的题型和回答思路&#xff1b; 2. 算法&#xff1a;刷 100-200 道题&#xff0c;记住刷题最重要的是要理解其思想&#xff0c;不要死记硬背&#xff0c;碰上原题很难&#xff0c;但 大多数的解题思路是相通的…...

【微信小程序开发全流程】篇章0:基于JavaScript开发的校园综合类微信小程序的概览

基于JavaScript开发的校园综合类微信小程序的概览 本文仅供学习&#xff0c;未经同意请勿转载 一些说明&#xff1a;上述项目来源于笔者我本科大三阶段2019年电子设计课程项目&#xff0c;在这个项目中&#xff0c;我主要是负责的部分有前端&#xff0c;前后端的对接&#xf…...

如何分析sql性能

1、前言 提到sql性能分析&#xff0c;可能都会想到explain&#xff0c;它在mysql里被称为执行计划&#xff0c;也就是说可以通过该命令看出mysql在通过优化器分析之后如何执行sql。mysql的内置优化器十分强大&#xff0c;它能帮我们把sql再次优化&#xff0c;以最低的成本去执…...

市场营销书籍推荐:《经理人参阅:市场营销》

要学好市场营销有什么好方法&#xff1f;答案是看书&#xff01;比起碎片化地去阅读一些文章或看一些相关视频&#xff0c;读书来得更实在些。倘若能静下心来好好读上一本系统性的市场营销书籍&#xff0c;学好营销管理将不会再是一件难事。然而&#xff0c;问题的关键是&#…...

WPF 控件专题 MediaElement控件详解

1、MediaElement 介绍 MediaElement&#xff1a;表示包含音频和/或视频的控件。 MediaOpened在引发事件之前&#xff0c;ActualWidth控件将ActualHeight报告为零&#xff0c;因为媒体内容用于确定控件的最终大小和位置。 对于仅音频内容&#xff0c;这些属性始终为零。 对于固…...

基于SpringBoot+SpringCloud+Vue前后端分离项目实战 --开篇

本文目录前言做项目的三大好处强强联手(天狗组合)专栏作者简介专栏的优势后端规划1. SpringBoot 和 SpringCloud 的选择2. Mybatis 和 MybatisPlus 和 JPA 的选择3. MySQL 和 Mongodb 的选择4. Redis 和 RocketMQ5. 后端规划小总结后端大纲提前掌握的知识点一期SpringBoot二期S…...

循环队列的实现

我们知道队列的实现可以用单链表和数组&#xff0c;但是循环链表也可以使用这两种方式。首先我们来看看单链表&#xff1a;首先使用单链表&#xff0c;我们需要考虑循环队列的一些特点。单链表实现循环队列我们要考虑几个核心问题&#xff1a;首先我们要区别 解决 空 和 满 的问…...

MTK平台开发入门到精通(休眠唤醒篇)休眠唤醒LPM框架

文章目录 一、lpm驱动源码分析二、设备属性调试文件沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇文章将介绍 lpm 驱动源码分析。 mtk 平台下,其默认的 lpm 机制的源码位置:drivers/misc/mediatek/lpm/ 一、lpm驱动源码分析 目录:drivers/misc/mediatek/lpm/…...

ThreadLocal详解

一、ThreadLocal简介 1、简介 ThreadLocal叫做线程变量&#xff0c;它是一个线程的本地变量&#xff0c;意味着这个变量是线程独有的&#xff0c;是不能与其他线程共享的。这样就可以避免资源竞争带来的多线程的问题。 即 ThreadLocal类用来提供线程内部的局部变量&#xff0…...

利用Cookie劫持+HTML注入进行钓鱼攻击

目录 HTML注入和cookie劫持&#xff1a; 发现漏洞 实际利用 来源 HTML注入和cookie劫持&#xff1a; HTML注入漏洞一般是由于在用户能够控制的输入点上&#xff0c;由于缺乏安全过滤&#xff0c;导致攻击者能将任意HTML代码注入网页。此类漏洞可能会引起许多后续攻击&#…...

【接口汇总】常用免费的API

短信API 短信验证码&#xff1a;可用于登录、注册、找回密码、支付认证等等应用场景。支持三大运营商&#xff0c;3秒可达&#xff0c;99.99&#xff05;到达率&#xff0c;支持大容量高并发。 通知短信&#xff1a;当您需要快速通知用户时&#xff0c;通知短信是最快捷有效的…...

数字信号处理知识点

数字信号处理知识点1 频谱图中&#xff0c;横坐标取值范围的含义2 MATLAB常用函数2.1 波形产生2.2 滤波器分析2.3 滤波器实现2.4 线性系统变换2.5 滤波器设计2.5.1 FIR滤波器2.5.2 IIR滤波器2.6 Transforms(变换)2.7 统计信号处理和谱分析2.8 Windows(窗函数)2.9 Parametric Mo…...

计算机网络第八版——第三章课后题答案(超详细)

第三章 该答案为博主在网络上整理&#xff0c;排版不易&#xff0c;希望大家多多点赞支持。后续将会持续更新&#xff08;可以给博主点个关注~ 第一章 答案 第二章 答案 【3-01】数据链路&#xff08;即逻辑链路&#xff09;与链路&#xff08;即物理链路&#xff09;有何区…...

九龙证券|磷酸亚铁锂是什么?磷酸亚铁锂的特点和性能介绍

磷酸亚铁锂是一种新式锂离子电池电极资料&#xff0c;化学式&#xff1a;LiFePO4&#xff0c;磷酸亚铁锂为近来新开发的锂离子电池电极资料&#xff0c;首要用于动力锂离子电池&#xff0c;作为正极活性物质运用&#xff0c;人们习气也称其为磷酸铁锂。 磷酸亚铁锂的特色和功能…...

3D目标检测(二)—— 直接处理点云的3D目标检测网络VoteNet、H3DNet

前言上次介绍了基于Point-Based方法处理点云的模块&#xff0c;3D目标检测&#xff08;一&#xff09;—— 基于Point-Based方法的PointNet点云处理系列,其中相关的模块则是构成本次要介绍的&#xff0c;直接在点云的基础上进行3D目标检测网络的基础。VoteNet对于直接在点云上预…...

Java学习-IO流-常用工具包(hutool)

Java学习-IO流-常用工具包&#xff08;hutool&#xff09; hutool工具包 DateUtil&#xff1a;日期时间工具类 TImeInterval&#xff1a;计时器工具类 StrUtil&#xff1a;字符串工具类 HexUtil&#xff1a;16进制工具类 HashUtil&#xff1a;Hash算法类 ObjectUtil&#xff1…...

【LeetCode】1. 两数之和

题目链接&#xff1a;https://leetcode.cn/problems/two-sum/ &#x1f4d5;题目要求&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入…...

【数值模型环境搭建】Intel编译器安装

Intel编译器在数值模型编译中被广泛使用&#xff0c;它有一个很好的地方是自带Mpich&#xff0c;不需要额外安装。本文介绍Intel2018.1.163版本的安装。 1、安装包获取 Intel编译器可从官网下载下载&#xff1a; https://www.intel.cn/content/www/cn/zh/homepage.html 或者…...

操作VMware vCenter Converter 实现物理机迁移到虚拟机

实验目的&#xff1a;熟练VMware虚拟化项目中&#xff0c;物理机向ESXI5迁移操作过程。 1、打开VMwarevCenterConverterStandalone5.0软件&#xff0c;按“转换计算机”。 2、选择“已打开电源的计算机”。并输入远程要连接迁移物理机IP地址&#xff0c;登录帐户和密码。 然后…...

hutool XML反序列化漏洞(CVE-2023-24162)

漏洞简介 Hutool 中的XmlUtil.readObjectFromXml方法直接封装调用XMLDecoder.readObject解析xml数据&#xff0c;当使用 readObjectFromXml 去处理恶意的 XML 字符串时会造成任意代码执行。 漏洞复现 我们在 maven 仓库中查找 Hutool ​https://mvnrepository.com/search?…...