网站类网站开发犯罪吗,wordpress留言板页面怎么制作,知名的家居行业网站制作,响应网官方网站✅作者简介#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者#xff0c;修心和技术同步精进。 #x1f34e;个人主页#xff1a;Java Fans的博客 #x1f34a;个人信条#xff1a;不迁怒#xff0c;不贰过。小知识#xff0c;大智慧。 #x1f49e;当前专栏… ✅作者简介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 中的资源。
项目案例共用资源
本项目案例是以 IdeaMaven 构建的项目项目目录结构如下 pom.xml 文件配置如下
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsdmodelVersion4.0.0/modelVersiongroupIdcn.kgc.springmvc03/groupIdartifactIdspringmvc03/artifactIdpackagingwar/packagingversion1.0-SNAPSHOT/versionnamespringmvc03 Maven Webapp/nameurlhttp://maven.apache.org/urldependenciesdependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/versionscopetest/scope/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.3.9/version/dependencydependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.14.1/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.24/version/dependencydependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion3.1.0/version/dependencydependencygroupIdcommons-fileupload/groupIdartifactIdcommons-fileupload/artifactIdversion1.4/version/dependency/dependencies
/projectspring-config.xml 文件配置如下
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:mvchttp://www.springframework.org/schema/mvcxsi:schemaLocationhttp://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 classorg.springframework.web.servlet.view.InternalResourceViewResolver!--逻辑视图前缀--property nameprefix value/WEB-INF/jsp//property!--逻辑视图后缀匹配模式前缀逻辑视图后缀形成完整路径名--property namesuffix value.jsp/property/bean!-- 配置组件扫描器 --context:component-scan base-packagecn.hh.springmvc03/
/beansweb.xml 文件配置如下
?xml version1.0 encodingUTF-8?
web-app xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlnshttp://xmlns.jcp.org/xml/ns/javaee xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd idWebApp_ID version3.1display-namespringmvc17/display-name!--注册字符集过滤器--filterfilter-namecharacterEncodingFilter/filter-namefilter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-classinit-param!--指定字符集--param-nameencoding/param-nameparam-valueUTF-8/param-value/init-paraminit-param!--强制使用指定字符集--param-nameforceEncoding/param-nameparam-valuetrue/param-value/init-param/filterfilter-mappingfilter-namecharacterEncodingFilter/filter-nameurl-pattern/*/url-pattern/filter-mappingservletservlet-namespringmvc/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-classinit-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:spring-config.xml/param-value/init-param/servletservlet-mappingservlet-namespringmvc/servlet-nameurl-pattern*.do/url-pattern/servlet-mappingwelcome-file-listwelcome-fileindex.html/welcome-filewelcome-fileindex.htm/welcome-filewelcome-fileindex.jsp/welcome-filewelcome-filedefault.html/welcome-filewelcome-filedefault.htm/welcome-filewelcome-filedefault.jsp/welcome-file/welcome-file-list
/web-app1、请求转发到其他页面 当处理器方法返回ModelAndView 时跳转到指定的ViewName默认情况下使用的是请求转发当然也可显式的进行请求转发。此时需在setViewName()指定的视图前添加forward关键字一旦添加了forward关键字控制器方法返回的视图名称就不会再与视图解析器中的前辍与后辍进行拼接所以必须写出相对于项目根的完整路径才能返回正确的视图。 当通过请求转发跳转到目标资源页面或Controller时若需要目标资源传递数据可以使用 HttpRequestServletHttpSession还可以将数据存放于ModelAndView中的Model中。目标页面则通过 EL 表达式来访问该数据。下面案例演示使用ModelAndView的情形。
项目案例 用户注册完毕后,显示用户的注册信息。
关键步骤
【1】在 WEB-INF/jsp 下新建 register.jsp 和 info.jsp 页面
register.jsp 代码如下
% page languagejava contentTypetext/html; charsetutf-8pageEncodingutf-8%
!DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN http://www.w3.org/TR/html4/loose.dtd
html
head
meta http-equivContent-Type contenttext/html; charsetISO-8859-1
titleInsert title here/title
/head
body
用户注册
form actiondoregister.do
姓名:input typetext nameusername/br/
密码:input typetext namepassword/br/
input typesubmit value注册/
/form
/body
/htmlindo.jsp 代码如下
% page languagejava contentTypetext/html; charsetutf-8pageEncodingutf-8%
!DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN http://www.w3.org/TR/html4/loose.dtd
html
head
meta http-equivContent-Type contenttext/html; charsetISO-8859-1
titleInsert 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 mvnew 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 mvnew ModelAndView();mv.addObject(user,user);mv.setViewName(forward:second.do);return mv;}RequestMapping(/second.do)public ModelAndView doSecond(User user){ModelAndView mvnew 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 mvnew 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 mvnew 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 mvnew 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后。 注意事项
放入到Model中的value只能是基本数据类型与 String不能是自定义类型的对象数据。原因是视图解析器会将Map的value放入到URL后作为请求参数传递出去任何类型的value都会变为String。重定向的面页中是无法从request 中读取数据的。但由于map中的key与value以请求参数的形式放到了请求的URL后所以页面可以通过EL表达式中的请求参数param读取。重定向的页面不能是/WEB-INF下的页面。因为重定向相当于客户端发出一次新的请求,而客户端是不可以请求/WEB-INF下的资源的。
项目案例 用户登录成功后, 通过重定向页面实现登录后显示用户信息。
关键步骤
【1.1】在WebContent 下创建页面 show.jsp复制之前的 login.jsp 页面。
show.jsp 代码如下
% page languagejava contentTypetext/html; charsetutf-8pageEncodingutf-8%
!DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN http://www.w3.org/TR/html4/loose.dtd
html
head
meta http-equivContent-Type contenttext/html; charsetutf-8
titleInsert title here/title
/head
body
登录用户信息
form actiondoregister.do
用户名:${param.username}br/
密码:${param.password}br/
/body
/html【注意】这里用到了 param 对象。
Login.jsp 代码如下
% page languagejava contentTypetext/html; charsetutf-8pageEncodingutf-8%
!DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN http://www.w3.org/TR/html4/loose.dtd
html
head
meta http-equivContent-Type contenttext/html; charsetutf-8
titleInsert title here/title
/head
body
用户登录
form actiondologin.do
姓名:input typetext nameusername/br/
密码:input typetext namepassword/br/br/
input typesubmit 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 mvnew 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 languagejava contentTypetext/html; charsetutf-8pageEncodingutf-8%
!DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN http://www.w3.org/TR/html4/loose.dtd
html
head
meta http-equivContent-Type contenttext/html; charsetutf-8
titleInsert 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 mvnew 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 mvnew 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 mvnew 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 mvnew 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 mvnew ModelAndView(); mv.setViewName(redirect:fourth.do);return mv;} RequestMapping(/fourth.do)public ModelAndView doFifth(HttpSession session){User user(User) session.getAttribute(user);ModelAndView mvnew 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 mvnew 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 mvnew 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 languagejava contentTypetext/html; charsetutf-8pageEncodingutf-8%
!DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN http://www.w3.org/TR/html4/loose.dtd
html
headmeta http-equivContent-Type contenttext/html; charsetutf-8titleInsert title here/title
/head
body登录用户信息br/用户名:${username}br/密码:${password}br/
/body
/html码文不易本篇文章就介绍到这里如果想要学习更多Java系列知识点击关注博主博主带你零基础学习Java知识。与此同时对于日常生活有困扰的朋友欢迎阅读我的第四栏目《国学周更—心性养成之路》学习技术的同时我们也注重了心性的养成。