重温经典struts1之八种页面跳转或请求转发的方式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

前言

今天来学习下,struts1框架中实现页面跳转或请求转发的八种方式。


页面跳转方式

  1. request的Dispatcher方法
    这种方式在学习servlet编程中,我们学习过,适合任何项目的手动页面跳转或请求转发

action代码如下

request.getRequestDispatcher(“login.jsp”).forward(request, response);

login.jsp内容,可以参看我之前的文章

https://blog.csdn.net/dy051107/article/details/134743425

这种方式struts1中不推荐使用,
struts1中常用的页面跳转或请求转发一般使用ActionForward类的findForward方法结合struts-config.xml文件中的action标签内的forward标签来配置,下面的几种方式我们会讲到
这里作为了解
action示例代码如下:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;public class ForwardAction extends Action {@Overridepublic ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,HttpServletResponse response) throws Exception {System.err.println("request getRequestDispatcher forward");request.getRequestDispatcher("login.jsp").forward(request, response);return null;}
}
  1. response的重定向
    同样servlet中我们学习过,struts1中不推荐使用,作为了解
    因为struts1框架中也为我们提供重定向功能,下面的几种方式中我们会介绍
    代码如下

response.sendRedirect(“/login.jsp”);

使用request和response的页面跳转,
action的返回值是null,这样就违反了,struts1框架中action返回ActionForward的设计原则

action示例代码如下:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;public class ForwardAction extends Action {@Overridepublic ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,HttpServletResponse response) throws Exception {System.err.println("response redirect");response.sendRedirect("/login.jsp");return null;}
}

struts-config.xml的配置

    <actionpath="/MultForwardLogin"type="xxx.xxx.action.ForwardAction"></action>
  1. ActionForward类的findForward方法结合struts-config.xml的配置
    这种方式是struts1框架中常用的页面跳转或请求转发的方式
    action中掉用ActionForward类的findForward方法进行页面跳转或请求转发
    跳转的页面或请求在struts-config.xml文件中,使用forward标签进行配置
    struts-config.xml的配置
    <actionpath="/MultForwardLogin"type="xxx.xxx.action.ForwardAction"><forward name="success" path="/login.jsp"></forward></action>

action示例代码如下:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;public class ForwardAction extends Action {@Overridepublic ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,HttpServletResponse response) throws Exception {return mapping.findForward("success");}
}
  1. struts-config.xml文件中,action标签的forward属性
    这种方式比较简洁,无需编写action类
    只需在struts-config.xml文件中配置action标签的forward属性
    struts-config.xml的代码如下
    <actionpath="/MultForwardLogin" forward="/login.jsp"></action>
  1. struts-config.xml文件中,全局跳转
    这种方式多用在多个页面在某种场合下都跳转同一页面时使用,
    例如,每个页面都需用户login后,才能使用时,使用全局统一配置
    这样就不需要在每个action中都配置跳转同一页面
    redirect默认是false,页面跳转或请求转发
    当设置成true时,进行重定向
    struts-config.xml配置代码如下
	<global-forwards><forward name="login" path="/login.jsp" redirect="true"></forward></global-forwards>
  1. ActionForward类的getInputForward方法结合struts-config.xml的配置
    常用在当action中发生输入验证错误或业务错误时,将错误信息返回本页面时使用
    例如,login页面,用户输入不正确的用户名和密码时,错误信息显示在本页面时使用
    action中调用ActionForward类的getInputForward方法跳转
    在struts-config.xml文件中,action标签的input属性配置跳转目标页面
    <actionpath="/login"type="xxx.xxx.action.LoginAction"name="loginForm"scope="request"input="/login.jsp"><forward name="success" path="/login_success.jsp"></forward></action>

action代码如下

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;import xxx.xxx.form.LoginForm;public class LoginAction extends Action {@Overridepublic ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,HttpServletResponse response) {LoginForm lf = (LoginForm) form;String username = lf.getUsername();String password = lf.getPassword();if ("admin".equals(username) && "admin".equals(password)) {request.getSession().setAttribute("username", username);return mapping.findForward("success");} else {request.setAttribute("msg", "用户名和密码不正确");return mapping.getInputForward();}}
}
  1. struts-config.xml文件中,action标签的unkown属性
    unkown属性也是一个全局属性,当用户发送不存在的*.do的请求时,
    struts1框架会为我们跳转到unkown属性配置的目标页面

struts-config.xml配置代码如下

    <action forward="/404.jsp" unknown="true"></action>
  1. 动态跳转
    根据页面输入的值,动态跳转到指定页面时,使用动态跳转,
    在action中重新new ActionForward类,设定Path属性值,并返回。
    下边的示例是,页面输入1…n,跳转到page1.jsp…pagen.jsp

action代码如下:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;public class DynaForwardAction extends Action {@Overridepublic ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,HttpServletResponse response) {ActionForward af = new ActionForward();af.setPath("/page" + request.getParameter("page") + ".jsp");return af;}
}

struts-config.xml文件中的action配置如下:

     <actionpath="/dyna_forward"type="xxx.xxx.action.DynaForwardAction"></action>

jsp代码如下

<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body><form action="dyna_forward.do" method="post">page:<input type="text" name ="page"><br><input type="submit" value="forward"></form></body>
</html>

总结

以上就是struts1框架中的八种页面跳转或请求转发的方式总结,欢迎留言补充,下篇见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/232026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ACM32如何保护算法、协议不被破解或者修改

ACM32具有以下几种功能&#xff0c;可以保护算法、协议不被破解或者修改。 1.存储保护  RDP读保护  WRP写保护  PCROP 专有代码读保护  MPU存储区域权限控制  Secure User Memory存储区域加密 2.密码学算法引擎  AES  HASH  随机数生成  …

Electron中Tray的setContextMenu导致窗口无法聚焦

在使用 Electron 开发应用时&#xff0c;经常会遇到使用 Tray&#xff08;托盘&#xff09;和设置上下文菜单&#xff08;ContextMenu&#xff09;导致窗口无法正常聚焦的问题。这会导致用户无法在带有输入框的窗口中进行输入&#xff0c;影响应用的用户体验。 tray.setContex…

Vue3-22-组件-插槽的使用详解

插槽是干啥的 插槽 就是 组件中的一个 占位符&#xff0c; 这个占位符 可以接收 父组件 传递过来的 html 的模板值&#xff0c;然后进行填充渲染。 就这么简单&#xff0c;插槽就是干这个的。要说它的优点吧&#xff0c;基本上就是可以使子组件的内容可以被父组件控制&#xf…

亚信科技AntDB数据库——深入了解AntDB-M元数据锁的实现(一)

锁的获取 5.1 锁的强弱 当线程已经持有的锁比新申请的锁更强时&#xff0c;认为已经持有了锁&#xff0c;无需再对申请锁类型加锁。锁的强弱指持有的锁与其他锁的不兼容集合大小&#xff0c;集合相同锁相同&#xff0c;集合更大锁更强&#xff0c;否则无强弱关系。通过锁的兼…

【Linux】基于框架编写驱动代码、驱动代码编译和测试

基于框架编写驱动代码 驱动代码编译和测试 ARM架构上进行Linux内核模块的交叉编译 总结 内核驱动框架基本驱动测试步骤 基于框架编写驱动代码 编写一个Linux设备驱动框架需要一些基本的步骤&#xff0c;以及一些特定于硬件的信息。由于你提到基于PIN4&#xff0c;我将提供…

JavaScript基础篇

目录 1.初始JavaScript 2.Js数据类型 2.1强制转换类型 1.转换为String类型 2.转换为Number类型 3.转换为 Boolean 4.转义符 2.2运算符 2.3分支结构 1.初始JavaScript <!-- 1. 文件引入 --> <!--<script src"./js/index.js"></script>-…

JVM-7-经典垃圾收集器

Serial收集器 这个收集器是一个单线程工作的收集器&#xff0c;但它的“单线程”的意义并不仅仅是说明它只会使用一个处理器或一条收集线程去完成垃圾收集工作&#xff0c;更重要的是强调在它进行垃圾收集时&#xff0c;必须暂停其他所有工作线程&#xff0c;直到它收集结束。…

普冉(PUYA)单片机开发笔记 [完结篇]:使用体会

失败的移植&#xff1a;FreeRTOS 当使用了 PY32F003 的各种接口和功能后&#xff0c;手痒痒想把 FreeRTOS 也搬到这个 MCU 上&#xff0c;参考 STM32 和 GD32 对 FreeRTOS 的移植步骤&#xff0c;把 FreeRTOS v202212.00 版本的源码搬到了 Keil 工程中&#xff0c;编译倒是通过…

sql服务无法启动 请键入net helpmsg 3534

然后 如果是管理员权限打开命令行输入操作的话 先清空 MySQL 下的 data 文件夹&#xff0c;然后确保系统环境变量中已经配置了 mysql 的 bin 目录到Path中&#xff0c;然后执行 sc delete mysql 得到 [SC] DeleteService 成功 后&#xff08;也可能不会有返回信息&#xff…

Oracle 中ROW_NUMBER() OVER()函数用法详解

select * from ( select t.data maxdata, datatime,s.xlmc,ROW_NUMBER() OVER (PARTITION BY s.xlmc ORDER BY datatime) AS rn from HISTORY_FH_ONEDAY t, CURRENT_FH_XL s where t.code s.code ) c where c.rn1

VSCode 常用的快捷键和技巧系列(2)

一、如何让VSCode工程树显示图标 第一步&#xff1a;安装 快捷键 CtrlP &#xff0c;输入 ext install vscode-icons &#xff0c;然后点击安装插件 第二步&#xff1a;配置 安装成功后&#xff0c;点击Reload重新加载。 然后配置&#xff0c;当前图标使用VsCode-Icons Go…

2023-12-18 AndroidR RK356X 新增一个分区,这个分区可写入读取,恢复出厂后数据也不会被删除。

一、整个过程需要修改的内容,不多解释,直接看源码吧 read the fuck code。 diff --git a/bootable/recovery/install/include/install/wipe_data.h b/bootable/recovery/install/include/install/wipe_data.h old mode 100644 new mode 100755 index c177f59274..6e1987d990…

nginx学习--2023-12-18

一 proxy_pass的作用 格式很简单&#xff1a; proxy_pass URL; proxy_pass http://www.xxx.com/; proxy_pass http://192.168.200.101:8080/uri; proxy_pass unix:/tmp/www.sock; 二 proxy_pass的注意案例 案例描述&#xff1a; 假设 nginx服务器的域名为&#xff1a;www.xxx…

喜报|亚数荣获“2023物联网场景应用品牌企业”奖项

12月5日至6日&#xff0c;以“物联中国 数智雄安”为主题的“千企雄安行&#xff1a;2023物联网产业品牌大会”在雄安新区举办。 大会由雄安新区管理委员会、中关村发展集团股份有限公司、物联中国团体组织联席会主办&#xff0c;雄安新区投资促进服务中心、北京物联网智能技术…

2023.12.16力扣每日一题

2023.12.16 题目来源我的题解方法一 线段树&#xff08;借鉴官方题解评论区 知白守黑&#xff09; 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2276 我的题解 方法一 线段树&#xff08;借鉴官方题解评论区 知白守黑&#xff09; 用一棵平衡二叉搜索树维护插入的区间…

开发语言:ArkTS

简介 ArkTS是华为为鸿蒙操作系统&#xff08;HarmonyOS&#xff09;开发的一种应用开发语言。这种语言在TypeScript&#xff08;简称TS&#xff09;的基础上进行了扩展&#xff0c;以更好地适应鸿蒙系统的特点和开发需求。ArkTS不仅继承了TS的所有特性&#xff0c;而且还对TS的…

Elasticsearch之ik中文分词篇

Elasticsearch之ik中文分词篇 ik分词器插件ik分词器安装ik分词模式es ik分词测试 ik分词器插件 es在7.3版本已经支持中文分词&#xff0c;由于中文分词只能支持到单个字进行分词&#xff0c;不够灵活与适配我们平常使用习惯&#xff0c;所以有很多对应中文分词出现&#xff0c…

【LeetCode刷题】-- 229.多数元素II

229.多数元素II 方法&#xff1a;使用哈希表 class Solution {public List<Integer> majorityElement(int[] nums) {HashMap<Integer,Integer> map new HashMap<>();for(int i 0;i< nums.length;i){map.put(nums[i],map.getOrDefault(nums[i],0) 1);}…

拾[10],局部可变形匹配,函数CreateLocalDeformableModel/FindLocalDeformableModel

函数CreateLocalDeformableModel 函数功能 创建局部的可变形匹配模板 C模式 LIntExport void CreateLocalDeformableModel( const HObject& Template, const HTuple& NumLevels, const HTuple& AngleStart, const HTuple& AngleExtent, const HTuple&a…

【K8S基础】-k8s的核心概念pod

一、Pod 是什么 1.1 Pod 的定义和概念 在Kubernetes中&#xff0c;Pod是创建或部署的最小/最简单的基本单位。一个Pod代表着集群上正在运行的一个进程&#xff0c;它封装了一个或多个应用容器&#xff0c;并且提供了一些共享资源&#xff0c;如网络和存储&#xff0c;每个Pod…