Struts2框架详解(二)

2023-11-17

Struts2结果页面配置

全局结果页面

场景:多个action,有相同的方法返回值,且都到同一个结果页面

需求:创建两个action,执行默认的方法execute方法,让两个action的方法都返回success,返回success之后,配置到同一个结果页面

(1)未使用全局结果页面,需要分别配置

创建两个action,并且默认方法execute都返回success

public class BookAction extends ActionSupport {
	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		return "success";
	}
}



public class UserAction extends ActionSupport {
	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		return "success";
	}
}

分别配置结果页面

<struts>
	<package name="demo" extends="struts-default" namespace="/">
		<action name="book" class="cn.itcast.action.BookAction">
			<result name="success">/index.jsp</result>
		</action>
		<action name="user" class="cn.itcast.action.UserAction">
			<result name="success">/index.jsp</result>
		</action>
	</package>
</struts>

(2)使用全局结果页面,只需要在package标签下,使用<golbal-results>标签和<result>标签即可

如果多个action,方法里面返回值是相同的,且到同一个结果页面,这个时候可以在package标签里面,使用全局结果页面配置。

<struts>
	<package name="demo" extends="struts-default" namespace="/">
	
		<global-results >
			<result name="success">/index.jsp</result>
		</global-results>
		
		<action name="book" class="cn.itcast.action.BookAction">	
		</action>

		<action name="user" class="cn.itcast.action.UserAction">	
		</action>
	</package>
</struts>

局部结果页面

在package标签下,配置的结果页面是全局结果页面

<global-results >
	<result name="success">/index.jsp</result>
</global-results>

在action标签下,配置的结果页面是局部结果页面

<action name="book" class="cn.itcast.action.BookAction">
	<result name="success">/index.jsp</result>
</action>

注意:既配置了全局页面,也配置了局部页面,最终以局部页面配置为准

result标签中type属性

(1)type属性表示如何到路径里面(转发还是重定向)

  • 转发(dispatcher),默认值
  • 重定向(redirect)

示例:两个action的execute方法,分别采用转发和重定向到结果页面

<struts>
	<package name="demo" extends="struts-default" namespace="/">
		
		<action name="book" class="cn.itcast.action.BookAction">
			<result name="success" type="dispatcher">/hello.jsp</result>
		</action>
		
		
		<action name="user" class="cn.itcast.action.UserAction">
			<result name="success" type="redirect">/hello.jsp</result>
		</action>
	</package>
</struts>

(2)上面两个值dispatcher,redirect这两个值一般针对跳转到页面中配置,配置到其他action里面使用chain,redirectAcion

  • chain:转发到action(一般不用,缓存问题)
  • redirectAction:重定向到action--------直接写action的访问名称,即要重定向的action的name属性值

示例:两个action(book和user)的execute方法,访问book的action时,将请求重定向到user的action

public class BookAction extends ActionSupport {
	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		System.out.println("book");
		return "success";
	}
}



public class UserAction extends ActionSupport {
	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		System.out.println("user");
		return "success";
	}
}
<struts>
	<package name="demo" extends="struts-default" namespace="/">
		
		<action name="book" class="cn.itcast.action.BookAction">
			<result name="success" type="redirectAction">/user</result>
		</action>
		
		
		<action name="user" class="cn.itcast.action.UserAction">
			<result name="success" type="redirect">/hello.jsp</result>
		</action>
	</package>
</struts>

 

在action中获取表单提交的数据

之前在web阶段,提交表单数据到Servlet中,在Servlet中使用request对象的getParameter方法获取。

现在提交表单数据到action中,但是action中没有request对象,所以不能直接使用request对象,需要先获取request对象。

使用一下几种方式,不需要得到request对象,即可获取表单数据。

(1)使用ActionContext类获取

使用这种方式,不需要得到request对象,即可获取表单数据。

使用ActionContext类中的getParameters()方法,获取包含所有HttpServletRequest参数信息的map对象

Map<String,Object> getParameters()   //返回一个包含所有HttpServletRequest参数信息的map对象

因为这个方法不是静态的,所以需要创建ActionContext类的对象。但是这个ActionContext类对象不可以采用new的方式来获取,需要使用getContext()方法获取ActionContext类对象

static ActionContext getContext()   //获取当前线程的ActionContext对象

示例:

书写form表单,并将form表单提交到对应的action中

  <body>
    <h1>表单提交demo</h1>
    <hr/>
    <form action="form" method="post">
            用户名:<input  type="text" name="uname" value=""/>
           密码:<input type="password" name="pwd" value=""/>
    <input type="submit" value="提交"/>
    </form>
  </body>

书写form表单处理的action

public class FormAction extends ActionSupport {
	@Override
	public String execute() throws Exception {
		//获取ActionContext对象
		ActionContext ac=ActionContext.getContext();
		
		
		//调用方法得到表单数据
		//key是表单输入项name属性值,value是表单输入项value属性值
		Map<String,Object> map=ac.getParameters();
		
		
		//遍历map
		Set<String> keys=map.keySet();
		for(String key:keys){
			//根据key得到value
			//value是数组形式,因为输入项里面可能由复选框的情况
			Object[] obj=(Object[]) map.get(key);
			System.out.println(Arrays.toString(obj));
		}
		
		return "none";
	}
}

配置struts.xml文件

<action name="form" class="cn.itcast.action.FormAction">
			
</action>

(2)使用ServletActionContext类获取

调用类里面的静态方法,即可得到request对象,response对象等

示例:

书写form表单,并将form表单提交到对应的action中

  <body>
    <h1>表单提交demo</h1>
    <hr/>
    <form action="form" method="post">
            用户名:<input  type="text" name="uname" value=""/>
           密码:<input type="password" name="pwd" value=""/>
    <input type="submit" value="提交"/>
    </form>
  </body>

书写form表单处理的action

public class FormAction extends ActionSupport {
	@Override
	public String execute() throws Exception {
		//使用ServletActionContext类获取request对象
		HttpServletRequest request=ServletActionContext.getRequest();
		//调用request对象里面的方法得到结果
		String unameString= request.getParameter("uname");
		String pwdString= request.getParameter("pwd");
		System.out.println(unameString+"---"+pwdString);
		return "none";
	}
}

配置struts.xml文件

<action name="form" class="cn.itcast.action.FormAction">
			
</action>

(3)使用接口注入方式获取(一般不用)

让action实现接口,为了得到request对象

示例:

书写form表单,并将form表单提交到对应的action中

  <body>
    <h1>表单提交demo</h1>
    <hr/>
    <form action="form" method="post">
            用户名:<input  type="text" name="uname" value=""/>
           密码:<input type="password" name="pwd" value=""/>
    <input type="submit" value="提交"/>
    </form>
  </body>

书写form表单处理的action

public class FormAction implements ServletRequestAware {
	
	HttpServletRequest request;
	
	@Override
	public void setServletRequest(HttpServletRequest request) {
		this.request=request;	
	}
	
	public String execute(){
		String uname=request.getParameter("uname");
		String pwd=request.getParameter("pwd");
		System.out.println(uname+"---"+pwd);
		return "none";
	}
}

配置struts.xml文件

<action name="form" class="cn.itcast.action.FormAction">
			
</action>

 

在action中操作域对象

在Servlet中,有三个域对象,分别是request域,session域,servletcontext域

使用ServletActionContext类来操作三个域对象:

public class FormAction {
	public String execute(){
		//request域
		HttpServletRequest request=ServletActionContext.getRequest();
		request.setAttribute("req", "reqValue");
		
		//session域
		HttpSession session=request.getSession();
		session.setAttribute("session", "sessionValue");
		
		//ServletContext域
		ServletContext context=ServletActionContext.getServletContext();
		context.setAttribute("context", "contextValue");
		
		return "none";
		
	}
}

 

Struts2提供获取表单数据的方式

原始方式获取表单数据封装到实体类对象(使用ServletActionContext类获取request对象,并获取表单数据)

示例:

实体类代码:

public class User {
	private String username;
	private String password;
	private String address;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public User(String username, String password, String address) {
		super();
		this.username = username;
		this.password = password;
		this.address = address;
	}
	public User() {
		
	}
	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password
				+ ", address=" + address + "]";
	}		
}

获取表单数据的action类:

public class UserAction extends ActionSupport {
	@Override
	public String execute() throws Exception {
		//获取表单数据
		HttpServletRequest request=ServletActionContext.getRequest();
		String username=request.getParameter("username");
		String password=request.getParameter("password");
		String address=request.getParameter("address");

        //封装到实体类对象中
        User user=new User();
		user.setUsername(username);
		user.setPassword(password);
		user.setAddress(address);
		System.out.println(user);
		return "none";
	}
}

(1)属性封装

直接把表单提交数据封装到action的属性里面

使用属性封装获取表单数据到属性里面,不能把数据直接封装到实体类对象里面

实现步骤:

  • 在action成员变量位置定义变量(变量名称和表单输入项的name属性值一样)
  • 生成变量的set方法(把set和get方法都写出来)

示例:

public class UserAction extends ActionSupport {
	
	//定义变量(变量名称与表单name属性值一样)
	private String username;
	private String password;
	private String address;
	
	//生成变量的set和get方法
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}


	
	@Override
	public String execute() throws Exception {
		System.out.println(username+"---"+password+"---"+address);
		return "none";
	}
}

(2)模型驱动封装(重点)

使用模型驱动方式,可以直接把表单数据封装到实体类对象里面

实现步骤:(前提要求:表单输入项name属性值和实体类属性名称一样)

  • action实现接口ModelDriver
  • 实现接口里面的方法getModel方法
  • 在action里面创建实体类对象

示例:

创建实体类:

public class User {
	private String username;
	private String password;
	private String address;
	
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public User(String username, String password, String address) {
		super();
		this.username = username;
		this.password = password;
		this.address = address;
	}
	public User() {
		
	}
	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password
				+ ", address=" + address + "]";
	}
}

创建action类,实现ModelDriver接口,重写getModel方法

public class UserAction extends ActionSupport implements ModelDriven<User> {	

	User user=new User();	
	
	@Override
	public String execute() throws Exception {
		System.out.println(user);
		return "none";
	}

	@Override
	public User getModel() {
		//返回创建的user对象
		return user;
	}
}

使用属性封装和模型驱动封装注意问题:

  • 在action中,获取表单数据可以使用属性封装,也可以使用模型驱动封装,但是不能同时使用属性封装和模型驱动封装获取同一个表单数据。

(3)表达式封装

使用表达式封装也可以把表单数据封装到实体类对象里面

实现步骤:

  • 在action里面声明实体类
  • 生成实体类变量的set和get方法
  • 在表单输入项的name属性值里面书写表达式形式

示例:

创建实体类:

public class User {
	private String username;
	private String password;
	private String address;
	
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public User(String username, String password, String address) {
		super();
		this.username = username;
		this.password = password;
		this.address = address;
	}
	public User() {
		
	}
	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password
				+ ", address=" + address + "]";
	}
}

创建action类,声明实体类,并书写实体类的get和set方法

public class UserAction extends ActionSupport {	
	//声明实体类
	User user;	

	//生成实体类变量的set和get方法
	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
	
	
	@Override
	public String execute() throws Exception {
		System.out.println(user);
		return "none";
	}	
}

在表单输入项的name属性值里面书写表达式形式

  <body>
    <h1>form表单提交demo</h1>
    <hr/>
    <form action="user" method="post">
    username:<input type="text" name="user.username" value=""/><br/>
    password:<input type="password" name="user.password" value=""/><br/>
    address:<input type="text" name="user.address" value=""/><br/>
    <input type="submit" value="提交"/>
    </form>
  </body>

比较表达式封装和模型驱动封装

相同点:

  • 使用表达式封装和模型驱动封装都可以把数据封装到实体类对象里面

不同点:

  • 使用模型驱动只能把数据封装到一个实体类对象里面,在一个action里面不能使用模型驱动把数据封装到不同的实体对象里面
  • 使用表达式封装可以把数据封装到不同的实体类对象里面

 

示例:使用表达式封装将表单数据封装到不同实体类对象里面,这里建立两个实体类,分别为User和Book。

创建实体类:

public class User {
	private String username;
	private String password;
	private String address;
	
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public User(String username, String password, String address) {
		super();
		this.username = username;
		this.password = password;
		this.address = address;
	}
	public User() {
		
	}
	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password
				+ ", address=" + address + "]";
	}
}
public class Book {
	private String bname;

	public String getBname() {
		return bname;
	}

	public void setBname(String bname) {
		this.bname = bname;
	}

	public Book(String bname) {
		super();
		this.bname = bname;
	}

	public Book() {
		
	}

	@Override
	public String toString() {
		return "Book [bname=" + bname + "]";
	}	
}

创建action类,声明实体类,并书写实体类的get和set方法

public class UserAction extends ActionSupport {	
	//声明实体类
	User user;	
	Book book;

	//生成实体类变量的set和get方法
	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
	
	
	public Book getBook() {
		return book;
	}

	public void setBook(Book book) {
		this.book = book;
	}


	@Override
	public String execute() throws Exception {
		System.out.println(user);
		System.out.println(book);
		return "none";
	}
}

在表单输入项的name属性值里面书写表达式形式

  <body>
    <h1>form表单提交demo</h1>
    <hr/>
    <form action="user" method="post">
    username:<input type="text" name="user.username" value=""/><br/>
    password:<input type="password" name="user.password" value=""/><br/>
    address:<input type="text" name="user.address" value=""/><br/>
    bookname:<input type="text" name=book.bname value=""/></br>
    <input type="submit" value="提交"/>
    </form>
  </body>

 

Struts2获取数据封装到集合中(会用)

(1)封装到list集合

实现步骤:

  • 在action中声明List
  • 生成List变量的set和get方法
  • 在表单输入项里面书写表达式

示例:

书写form表单,以提交多个用户的数据信息,在表单输入项的name属性值里面书写表达式形式(采用List集合)

<body>
    <h1>form表单提交demo</h1>
    <hr/>
    <form action="user" method="post">
    username:<input type="text" name="list[0].username" value=""/><br/>
    password:<input type="password" name="list[0].password" value=""/><br/>
    address:<input type="text" name="list[0].address" value=""/><br/>
    <hr/>


    username:<input type="text" name="list[1].username" value=""/><br/>
    password:<input type="password" name="list[1].password" value=""/><br/>
    address:<input type="text" name="list[1].address" value=""/><br/>
    <hr/>
    <input type="submit" value="提交"/>
    </form>
  </body>

创建action类,声明List集合类,并书写List类对象的get和set方法

public class UserAction extends ActionSupport {	
	
	private List<User> list;

	public List<User> getList() {
		return list;
	}

	public void setList(List<User> list) {
		this.list = list;
	}



	@Override
	public String execute() throws Exception {
		System.out.println(list);
		return "none";
	}	
}

(2)封装到map集合

实现步骤:

  • 在action中声明Map
  • 生成Map变量的set和get方法
  • 在表单输入项里面书写表达式

示例:

书写form表单,以提交多个用户的数据信息,在表单输入项的name属性值里面书写表达式形式(采用Map集合)

<body>
    <h1>form表单提交demo</h1>
    <hr/>
    <form action="user" method="post">
    username:<input type="text" name="map['one'].username" value=""/><br/>
    password:<input type="password" name="map['one'].password" value=""/><br/>
    address:<input type="text" name="map['one'].address" value=""/><br/>
    <hr/>


    username:<input type="text" name="map['one'].username" value=""/><br/>
    password:<input type="password" name="map['one'].password" value=""/><br/>
    address:<input type="text" name="map['one'].address" value=""/><br/>
    <hr/>
    <input type="submit" value="提交"/>
    </form>
  </body>

创建action类,声明Map集合类,并书写Map类对象的get和set方法

public class UserAction extends ActionSupport {	
	
	private Map<String, User> map;
	
	

	public Map<String, User> getMap() {
		return map;
	}


	public void setMap(Map<String, User> map) {
		this.map = map;
	}

	@Override
	public String execute() throws Exception {
		System.out.println(map);
		return "none";
	}

}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Struts2框架详解(二) 的相关文章

随机推荐

  • 精学JS:宏任务 & 微任务的运行机制

    首先分析宏任务和微任务的运行机制 并针对日常开发中遇到的各种宏任务 微任务的方法 结合一些例子来看看代码运行的顺序逻辑 把这部分知识点重新归纳和梳理 在日常开发中 例如 setTimeout和 promise都是经常会使用到的 JS方法 当
  • 操作系统【六】虚拟内存

    传统存储管理方式的不足 一次性 作业必须一次性全部装入内存后才能开始运行 这会造成 当作也很大时不能全部装入内存 当大量作业要求运行时 由于内存无法容纳所有作业 因此只有少量作业能够运行 导致多道程序并发度下降 驻留性 一旦作业被装入内存
  • 【计算机视觉】Visual Transformer (ViT)模型结构以及原理解析

    文章目录 一 简介 二 Vision Transformer如何工作 三 ViT模型架构 四 ViT工作原理解析 4 1 步骤1 将图片转换成patches序列 4 2 步骤2 将patches铺平 4 3 步骤3 添加Position e
  • Python——LSTM、GRU 时间序列股票数据预测(文末完整代码)

    GRU 是在 LSTM 基础上的简化 将 LSTM 内部的三个闸门简化成两个 往往 GRU 的计算效果会优于 LSTM 目录 1 导入工具包 2 获取数据集 3 数据预处理 4 时间序列滑窗 5 数据集划分 6 构造网络模型 7 网络训练
  • tracert命令返回的三个时间为什么有时会出现1个或2个星号?

    如图 三个时间里有1个或者2个显示星号 这是为什么呢 如果是配置了ACL丢弃了响应报文的话按理应该3个都显示星号呀 直接ping这个ip的话不会出现丢包 时延也很稳定 这个问题很诡异 演绎一下 仅供参考 首先traceroute 是利用 T
  • 后台系统切换主题颜色(换肤) Vue+ elementUi

    文章目录 前言 一 css color function 二 使用步骤 1 下载依赖项 2 引入 3 使用 定义data数据 3 定义方法 4 调用方法使用 5 模板 6 AllCode 总结 前言 不断学习demo中 有好的demo会记录
  • antd pro protable request请求有数据 页面不渲染或postdata里的data一直是undefined

    异常原因 protable的request请求默认的数据格式为 data pageSize 10 current 1 total 28 success true request请求如果返回的数据格式不是以上形式就会获取不到data page
  • STM32 DMA 应用之(二) DMA 串口 数据传输--发送

    一 DMA请求映像 由此我们知道如果需要使用串口1的发送功能需要用到的是DMA1 Channel4 使用串口1的接收功能需要用到的是DMA1 Channel5 二 怎样配置软件来使用DMA 把数据传到串口发送 1 配置dma 函数名称 Dm
  • vim退出时提示:q:未找到命令的解决办法

    有一天 我在WSL上快乐的用vim编游戏 可就在我输入 q时 bash提醒我 q 未找到命令 平常程序都在WSL上 cat不自动在行尾加换行违反了我的强迫症 然后我就开始修理vim了 然后我又试了 wq等等和q有关的命令 甚至连 q都没问题
  • C#编程,.NTE调用java类、jar包方法

    基本思路 用C 实现调用Java编写的类中的方法 重点是将Java编写的程序打包成Jar 然后使用开源工具IKVM将其转化成DLL控件 在 NET环境下调用 一 使用IKVM NET组件 首先到IKVM官网 http www ikvm ne
  • React学习(JSX+组件+state+表单)

    React JSX 声明元素 渲染元素 组件 练习 this props children PropTypes 默认值 获取真实的DOM节点 this state 表单 组件的生命周期 例子 JSX JSX是一种JavaScript语法的拓
  • 链式前向星存树图和遍历它的两种方法【dfs、bfs】

    目录 一 链式前向星存图 二 两种遍历方法 一 链式前向星存图 n个点 n 1条边 链式前向星把上面的树图存下来 输入 9 代表要存进去n个点 1 2 下面是n 1条边 每条边连接两个点 1 3 1 7 2 4 4 5 4 6 3 8 3
  • json-server在vscode终端运行文件报错

    错误 无法加载文件 D 因为在此系统上禁止运行脚本 json server 无法加载文件 D ruanjian nodejs node global json server ps1 因为在此系 统上禁止运行脚本 有关详细信息 请参阅 htt
  • 关于宝塔面板无法访问的解决方法

    前言 本篇文章主要介绍宝塔面板无法访问的几种情况以及如何解决 正文 1 没有开放相应端口 这种情况比较常见 服务商默认情况下会将所有的端口关闭 你需要使用哪个端口就得手动去打开这个端口 例如 http 47 8888 adminuser 中
  • ubuntu如何开放22端口 ubuntu22端口开启

    ubuntu开放22端口的操作步骤 1 打开终端命令行模式 2 依次输入以下命令进行开放22端口即可 输入以下命令打开22端口 sudo ufw allow 22 重启防火墙使其生效即可 sudo ufw reload 附加 sudo ap
  • 详解混合类型文件(Polyglot文件)的应用生成与检测

    1 引入 混合类型文件 Polyglot文件 是指一个文件 既可以是合法的A类型 也可以是合法的B类型 比如参考3中的文件 是一个html文件 可以用浏览器正常打开 它也是一个一个 jar文件 可以用JVM正常运行 参考4 如下图所示 这样
  • Spring源码:PropertyValues类及属性注入一

    概要 相关类 属性注入 概要 Spring获取Bean的实例时 需要把配置的属性值解析到PropertyValues 然后填充入BeanWrapper中 相关类 MutablePropertyValues类 PropertyValues接口
  • http://www.limodev.cn/blog/archives/category/gtk

    The linux mobile development gt http www limodev cn blog 致力于基于linux的嵌入式系统的学习和研究 包括内核 驱动 GUI MMI 软件设计和优化等 欢迎交换友情链接 代码请到Pr
  • Docker实战-NFS安装

    Docker安装 1 使用官方安装脚本自动安装 curl fsSL https get docker com bash s docker mirror Aliyun 2 启动 Docker 服务 systemctl start docker
  • Struts2框架详解(二)

    Struts2结果页面配置 全局结果页面 场景 多个action 有相同的方法返回值 且都到同一个结果页面 需求 创建两个action 执行默认的方法execute方法 让两个action的方法都返回success 返回success之后