学习笔记之Struts2—浅析接收参数
最近自己通过视频与相关书籍的学习,对action里面接收参数做一些总结与自己的理解。
0.0、接收参数的(主要)方法
- 使用Action的属性接收参数
- 使用DomainModel接收参数
- 使用ModelDriven接收参数
1.1、使用Action的属性接收参数
本文以最简单的表单提交为例:
1.1.1.建立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="loginAction.action" method="post">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit">
</form>
</body>
</html>
1.1.2.创建loginAction
package com.zzh.action;
import com.opensymphony.xwork2.ActionSupport;
public class loginAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private String username;
private String password;
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 login(){
System.out.println(username);
return SUCCESS;
}
}
注意:System.out.println(username);后面可以做一些逻辑处理
1.1.3.配置struts.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="login" extends="struts-default" namespace="/">
<action name="loginAction" method="login" class="com.zzh.action.loginAction">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
1.1.4.创建success.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>
你好!六月的余晖
</body>
</html>
1.1.5.启动tomcat服务器,测试是否能接收
打开网页输入http://localhost:8080/zzh/login.jsp

输入用户名与密码提交。。。
这时后台显示用户名

页面跳转为

1.2、使用DomainModel接收参数
对于java而言,它是一种面向对象的语言,我们会发现将大量的属性直接放在loginaction中显得太过臃肿,于是,我们需要用一个对象来作为这些属性的容器,也就是将这些属性放在对象中,这时我们便可以使用DomainModel来进行。
1.2.1.新建对象User
将loginaction.java中的属性username与password删去,相应的getter和setter方法也删去。
然后在User.java中
package com.zzh.us;
public class User {
private String username;
private String password;
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;
}
}
接着在LoginAction中声明User
注意login()方法中要用user.getUsername()
package com.zzh.action;
import com.zzh.us.User;
import com.opensymphony.xwork2.ActionSupport;
public class loginAction extends ActionSupport{
private static final long serialVersionUID = 1L;
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String login(){
System.out.println(user.getUsername());
return SUCCESS;
}
}
1.2.2.指定login.jsp页面需要明确属性所属对象
当我们有多个对象时,每个对象都有参数,而login.jsp传过来的参数没有明确对象,这时便会出现混乱。
所以我们在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="loginAction.action" method="post">
用户名:<input type="text" name="user.username">
密码:<input type="password" name="user.password">
<input type="submit">
</form>
</body>
</html>
1.2.3.重启服务器,测试
结果与上个方法所得 一致。
1.3、使用ModelDriven接收参数
ModelDriven也叫模型驱动,通过实现ModelDriven接口来接收表单数据,首先Action类必须实现ModelDriven接口,同样把表单传过来的数据封装起来,Acting类中必须实例化该对象,并且要重写getModel()方法,这个方法返回的就是Action所使用的数据模型对象。
1.3.1.Action类中实现ModelDriven接口
实现ModelDriven接口,将我们需要赋值转换的类(User)设置为ModelDriven的泛型,然后添加实现此接口的方法getModel()。此时,getModel()中返回的是我们需要转换的对象(user)。当然,使用了ModelDriven,我们的对于user对象的getter,setter方法需要去掉,并将user对象实例化即:user = new User();
package com.zzh.action; import com.zzh.us.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven; public class loginAction extends ActionSupport implements ModelDriven<User>{ private static final long serialVersionUID = 1L; private User user = new User(); public String login(){
System.out.println(user.getUsername());return SUCCESS;
} @Override
public User getModel() { return user;
} }
1.3.2.login.jsp中去除属性前缀
注意:使用了ModelDriven的方式,一个Action只能对应一个Model,因此在login.jsp中不需要添加user前缀,页面上的username对应到这个Model的username属性。
<%@ 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="loginAction.action" method="post">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit">
</form>
</body>
</html>
1.3.2.重启服务器,测试
结果与前面一致。
2.0 传递数据集
在通常情况下,我们需要传递的参数不只是单一的字符串,更多的是数据集。
2.0.1.User中添加属性List<String>
package com.zzh.us;
import java.util.List;
public class User {
private String username;
private String password;
private List<String> bookList;
public List<String> getBookList() {
return bookList;
}
public void setBookList(List<String> bookList) {
this.bookList = bookList;
}
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;
}
}
2.0.2.login.jsp中增加两条记录给List<String>赋值
我们可以通过booklist[0]与booklist[1]来作为name。
<%@ 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="loginAction.action" method="post">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
书籍1:<input type="text" name="bookList[0]">
书籍2:<input type="text" name="bookList[1]">
<input type="submit">
</form>
</body>
</html>
2.0.3.在Action类中添加后台打印验证接收到的参数
package com.zzh.action; import com.zzh.us.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven; public class loginAction extends ActionSupport implements ModelDriven<User>{ private static final long serialVersionUID = 1L; private User user = new User(); public String login(){
System.out.println(user.getUsername());
System.out.println(user.getBookList().get(0));
System.out.println(user.getBookList().get(1));
return SUCCESS;
} @Override
public User getModel() { return user;
} }
2.0.4.重启服务器,验证后台是否接收

跳转至 你好!六月的余晖页面,控制台输出:

2.1.1.User中添加属性List<User>
如果将泛型中的字符串改为对象,也就是说不再是一个简单的类型
package com.zzh.us;
import java.util.List;
public class User {
private String username;
private String password;
private List<User> bookList;
public List<User> getBookList() {
return bookList;
}
public void setBookList(List<User> bookList) {
this.bookList = bookList;
}
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;
}
}
2.1.1.更改login.jsp页面的name值
此时的bookList【】中已经不是字符串,而是一个对象,也就是说书籍的名称在bookList中的一个属性,所以需要加后缀.username
<%@ 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="loginAction.action" method="post">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
书籍1:<input type="text" name="bookList[0].username">
书籍2:<input type="text" name="bookList[1].username">
<input type="submit">
</form>
</body>
</html>
2.1.2.Action类中的后台输出
此时后台输出user.getBookList().get(0)得到的是User对象,所以还需要增加后缀.getUsername()。
package com.zzh.action; import com.zzh.us.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven; public class loginAction extends ActionSupport implements ModelDriven<User>{ private static final long serialVersionUID = 1L; private User user = new User(); public String login(){
System.out.println(user.getUsername());
System.out.println(user.getBookList().get(0).getUsername());
System.out.println(user.getBookList().get(1).getUsername());
return SUCCESS;
} @Override
public User getModel() { return user;
} }
2.1.3.启动服务器,测试

3.小结 总之三种方法给有优缺点,应根据不同情况选择使用。总算是写完了,自己第一篇博客,如果你觉得对你有帮助的话,请麻烦点赞或关注我,谢谢观看!
学习笔记之Struts2—浅析接收参数的更多相关文章
- struts2学习笔记(4)接收参数
①用action属性接收 登录界面例子 在webroot下创建login.jsp和success.jsp login.jsp中加入表单: <form action="LoginActi ...
- 第七篇——Struts2的接收参数
Struts2的接收参数 1.使用Action的属性接收参数 2.使用Domain Model接收参数 3.使用ModelDriven接收参数 项目实例 1.项目结构 2.pom.xml <pr ...
- Tornado学习笔记(一) helloword/多进程/启动参数
前言 当你觉得你过得很舒服的时候,你肯定没有在进步.所以我想学习新的东西,然后选择了Tornado.因为我觉得Tornado更匹配目前的我的综合素质. Tornado学习笔记系列主要参考<int ...
- struts2 Action 接收参数的三种方法
刚学Struts2 时 大家可能遇到过很多问题,这里我讲一下Action 接收参数的三种方法,我曾经在这上面摔过一回.所以要警醒一下自己..... 第一种:Action里声明属性,样例:account ...
- SpringMVC学习笔记:数据的接收与返回
SpringMVC的定义:Spring Web MVC is the original web framework built on the Servlet API and included in t ...
- Struts2学习笔记(六)——Action处理请求参数
在struts2框架中关于Action处理请求参数有两种方案(三个方式),表单属性的名称应该和在Action类中定义的成员属性或者在JavaBean中定义的成员属性名称一样: 1.属性驱动 1)直接在 ...
- SpringMVC学习笔记:表单提交 参数的接收
SpringMVC可以接收原生form表单和json格式数据 有一个名为Book的model,其中的属性如下: 字符串类型的name,数字类型的price,数组类型的cover,集合类型的author ...
- 【学习笔记】Struts2 类型转换
为什么需要类型转换 在基于HTTP协议的Web应用中 客户端请求的所有内容(表单中提交的内容等)都以文本编码的方式传输到服务器端但服务器端的编程语言(如Java)有着丰富的数据类型 如 int boo ...
- 【学习笔记】Struts2之配置处理结果
Action只是Struts2控制器的一部分,所以它不能直接生成对浏览者的响应.Action只负责生成响应的视图组件,通常是JSP页面,而Action会为JSP页面提供显示数据. Ac ...
随机推荐
- TCP/IP协议详解之广播和多播
广播和多播仅应用于 U D P,它们对需将报文同时传往多个接收者的应用来说十分重要.T C P是一个面向连接的协议,它意味着分别运行于两主机(由 I P地址确定)内的两进程(由端口号确定)间存在一条连 ...
- Redis实战——简单介绍
出自:https://www.cnblogs.com/moonlightL/p/7364107.html Redis简单介绍 Redis是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能, ...
- Java实现主线程等待子线程
本文介绍两种主线程等待子线程的实现方式,以5个子线程来说明: 1.使用Thread的join()方法,join()方法会阻塞主线程继续向下执行. 2.使用Java.util.concurrent中的C ...
- Spring PropertyPlaceholderConfigurer占位符用法
1.PropertyPlaceholderConfigurer是一个bean工厂后置处理器的实现,也就是BeanFactoryPostProcessor接口的一个实现.PropertyPlacehol ...
- guestfs-python 手册
Help on module guestfs: NAME guestfs - Python bindings for libguestfs FILE /usr/lib64/python2.7/site ...
- Linux实战教学笔记53:开源虚拟化KVM(一)搭建部署与概述
一,KVM概述 1.1 虚拟化概述 在计算机技术中,虚拟化意味着创建设备或资源的虚拟版本,如服务器,存储设备,网络或者操作系统等等 [x] 虚拟化技术分类: 系统虚拟化(我们主要讨论的反向) 存储虚拟 ...
- Reducing File Size
[Reducing File Size] 1.Unity strips out unused assets. The amount of assets in your project folder d ...
- NormalMapping
[NormalMapping] 法线贴图内的数据是法线,高度贴图内的数据是高度,不是一个东西.在ShaderLab中,UnpackNormal()分析的是法线贴图(注意不是高度贴图). 可以看到,在G ...
- Spark Streaming原理简析
执行流程 数据的接收 StreamingContext实例化的时候,需要传入一个SparkContext,然后指定要连接的spark matser url,即连接一个spark engine,用于获得 ...
- jquery入门 动态调整div大小,使其宽度始终为浏览器宽度
有时候我们需要设置宽度为整个浏览器宽度的div,当然我们可以使用相对布局的方式做到这一点,不过我们也可以用jquery来实现. <!doctype html> <html> & ...