Action处理请求参数
第一种 :Action 本身作为model对象,通过成员setter封装 (属性驱动 )
第一种方式:<br>
<form action="${pageContext.request.contextPath}/MyAction1" method="post">
username:<input type="text" name="username"><br>
password:<input type="password" name="password"><br>
<input type="submit"><hr>
</form>
public class MyAction1 extends ActionSupport{
private String username;
private String password;
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public String execute() throws Exception {
System.out.println(username+" "+password);
return null;
}
}
问题: Action封装数据,会不会有线程问题 ?
struts2 Action 是多实例 ,为了在Action封装数据 (struts1 Action 是单例的 )
缺点:需要单独定义javaBean,将action中属性copy到javaBean中。
优点:简单。
第二种 :创建独立model对象,页面通过ognl表达式封装 (属性驱动)
第二种方式:<br>
<form action="${pageContext.request.contextPath}/MyAction2" method="post">
username:<input type="text" name="user.username"><br>
password:<input type="password" name="user.password"><br>
<input type="submit"><hr>
</form>
public class MyAction2 extends ActionSupport{
private User user;
public void setUser(User user) {
this.user = user;
}
public User getUser() {//不写这个密码获取不到?不懂..希望知道的人留言告知,感谢
return user;
}
public String execute() throws Exception {
System.out.println(user.getUsername()+" "+user.getPassword());
return null;
}
}
问题: 谁来完成的参数封装
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
优点:简单,解决了第一种封装的问题
缺点:在页面上使用了ognl表达式,页面不通用了
第三种 :使用ModelDriven接口,对请求数据进行封装 (模型驱动 ) ----- 主流,最常用
第三种方式:<br>
<form action="${pageContext.request.contextPath}/MyAction3" method="post">
username:<input type="text" name="username"><br>
password:<input type="password" name="password"><br>
<input type="submit"><hr>
</form>
public class MyAction3 extends ActionSupport implements ModelDriven<User>{
private User user=new User();
public String execute() throws Exception {
System.out.println(user.getUsername()+" "+user.getPassword());
return null;
}
@Override
public User getModel() {
return user;
}
}
优点:解决了属性驱动存在的问题
缺点:一次只能封装一个model对象.
struts2 有很多围绕模型驱动的特性
<interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/> 为模型驱动提供了更多特性
对比第二种、第三种 : 第三种只能在Action中指定一个model对象,第二种可以在Action中定义多个model对象
<input type="text" name="user.username" />
<input type="text" name="product.info" />
public class StrutsFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
// 1.强转
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
// 2.操作
// 2.1 得到请求资源路径
String uri = request.getRequestURI();
String contextPath = request.getContextPath();
String path = uri.substring(contextPath.length() + 1);
// 2.2 使用path去struts.xml文件中查找某一个<action name=path>这个标签
SAXReader reader = new SAXReader();
try {
// 得到struts.xml文件的document对象。
Document document = reader.read(new File(this.getClass().getResource("/struts.xml").getPath()));
Element actionElement = (Element) document
.selectSingleNode("//action[@name='" + path + "']"); // 查找<action
// name='hello'>这样的标签
if (actionElement != null) {
// 得到<action>标签上的class属性以及method属性
String className = actionElement.attributeValue("class"); // 得到了action类的名称
String methodName = actionElement.attributeValue("method");// 得到action类中的方法名称。
// 2.3通过反射,得到Class对象,得到Method对象
Class actionClass = Class.forName(className);
Method method = actionClass.getDeclaredMethod(methodName);
// 处理请求参数封装:
Object actionObj = actionClass.newInstance();
// 模型驱动
if (actionObj instanceof MyModelDriven) {
MyModelDriven mmd = (MyModelDriven) actionObj;
BeanUtils.populate(mmd.getModel(),request.getParameterMap());
} else {
// 属性驱动
BeanUtils.populate(actionObj, request.getParameterMap());//
}
// 2.4 让method执行.
String returnValue = (String) method.invoke(actionObj); // 是让action类中的方法执行,并获取方法的返回值。
// 2.5
// 使用returnValue去action下查找其子元素result的name属性值,与returnValue做对比。
Element resultElement = actionElement.element("result");
String nameValue = resultElement.attributeValue("name");
if (returnValue.equals(nameValue)) {
// 2.6得到了要跳转的路径。
String skipPath = resultElement.getText();
request.getRequestDispatcher(skipPath).forward(request,response);
return;
}
}
} catch (Exception e) {
e.printStackTrace();
}
// 3.放行
chain.doFilter(request, response);
}
public void destroy() {}
}
模拟Struts2属性驱动和模型驱动
public interface MyModelDriven<T> {
public T getModel();
}
MyModelDriven
封装数据到Collection和Map
1) 封装数据到Collection 对象
第四种方式(list):<br>
<form action="${pageContext.request.contextPath}/MyAction4" method="post">
username:<input type="text" name="users[0].username"><br>
password:<input type="password" name="users[0].password"><br>
username:<input type="text" name="users[1].username"><br>
password:<input type="password" name="users[1].password"><br>
<input type="submit"><hr>
</form>
public class MyAction4 extends ActionSupport{
private List<User>users;
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
public String execute() throws Exception {
System.out.println(users);
return null;
}
}
2) 封装数据到Map 对象
第五种方式(map):<br>
<form action="${pageContext.request.contextPath}/MyAction5" method="post">
username:<input type="text" name="users['zs'].username"><br>
password:<input type="password" name="users['zs'].password"><br>
username:<input type="text" name="users['ls'].username"><br>
password:<input type="password" name="users['ls'].password"><br>
<input type="submit"><hr>
</form>
public class MyAction5 extends ActionSupport{
private Map<String, User>users;
public Map<String, User> getUsers() {
return users;
}
public void setUsers(Map<String, User> users) {
this.users = users;
}
public String execute() throws Exception {
System.out.println(users);
return null;
}
}
Action处理请求参数的更多相关文章
- Struts系列笔记(6)---action接收请求参数
action接收请求参数 在web开发中,去接收请求参数来获得表单信息非常的常见,自己也总结整理了有关Struts2通过action接收请求参数的几种方法. Struts2 提供三种数据封装的方式: ...
- Struts2学习笔记(六)——Action处理请求参数
在struts2框架中关于Action处理请求参数有两种方案(三个方式),表单属性的名称应该和在Action类中定义的成员属性或者在JavaBean中定义的成员属性名称一样: 1.属性驱动 1)直接在 ...
- struts2 action接收请求参数和类型转换
1,action接收请求参数 在struts2中action是什么?(struts2是一个mvc框架) V:jsp M:action C:action ...
- Struts框架(6)---action接收请求参数
action接收请求参数 在web开发中,去接收请求参数来获得表单信息非常的常见,自己也总结整理了有关Struts2通过action接收请求参数的几种方法. Struts2 提供三种数据封装的方式: ...
- Struts2之Action接收请求参数和拦截器
技术分析之在Struts2框架中使用Servlet的API 1. 在Action类中也可以获取到Servlet一些常用的API * 需求:提供JSP的表单页面的数据,在Ac ...
- action接收请求参数
一.采用基本类型接收请求参数(get/post)在Action类中定义与请求参数同名的属性,struts2便能接收自动接收请求参数并赋给同名属性. action的代码: public class Pa ...
- Action获取请求参数的3中方式
方式一:Action本身作为Model对象,通过属性注入(Setter)方法讲参数数据封装到Action中 具体为:在Action中,提供和参数名相同的几个属性,并为其提供set方法,那么,该参数会被 ...
- jsp或Action获取请求参数中文乱码
普通情况下,中文字符会被自动转换成iso-8859-1的编码格式通过网络传输,而这种格式是没办法直接表示出我们认识的中文字符的,所以还要手动将他转换回之前的字符集. 一般在servlet或者actio ...
- struts2之Action获取请求参数与web元素
文章思路清晰 http://blog.csdn.net/zeqblog/article/details/8665052
随机推荐
- C#导入Exel
; try { ]; string[] NoExPrentFile = new string[] { "xls", "xlsx" }; ] || fileTyp ...
- SVN客户端以及使用 for windows
1.首先我们需要下载 "svn小乌龟"后,进行安装.比如我下载如下的: 安装完成后,比如在我的项目在qiandaun1中,我右键就可以看到如下: 说明snv已经安装成功了! 2:c ...
- win7下安装openpyxl
想使用python来操作Excel,看资料据说openpyxl非常好用,于是到https://pypi.python.org/pypi/openpyxl下载了安装包.下面就来说说安装步骤,也算是对自己 ...
- iOS 中CoreData的简单使用
原文链接:http://www.jianshu.com/p/4411f507dd9f 介绍:本文介绍的CoreData不在AppDelegate中创建,在程序中新建工程使用,即创建本地数据库,缓存数据 ...
- 汉企学习4个半月的target and plan
我自从大学毕业以后,工作飘忽不定,其中也不乏有我自己的原因.IT是我向往的行业,几经波折,我来到了汉企. 9月4号,算是正式与汉企接触的第一天.在这里,我看到了学员的上进,老师的责任心,让我感受颇深. ...
- asp.net 图片下载
string fileName = "123.jpg";//图片名字 string filePath = Server.MapPath(&qu ...
- 阿里云CentOS配置全过程
1. 安装基本依赖包 yum install gcc gcc-c++ autoconf automake 2. 升级所有 yum update 3.安装mongodb 1. 配置mongodb- ...
- springmvc中RedirectAttributes的作用
RedirectAttributes在重定向的时候可以传参,不能跨站传参,因为参数是保存在服务器端
- cocospod 安装和使用 podfile 问题解决
Podfile 不识别 usr_framework!,系本地Pods版本太低,要在0.36以上. 以下转自:http://blog.csdn.net/eqera/article/details/393 ...
- core
http://blog.csdn.net/xiaoxiaoniaoer1/article/details/7740820 1.core文件的生成开关和大小限制--------------------- ...