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 
随机推荐
- 关于新中新二代身份证读卡器DKQ-A16D的一些问题
			今天拿到了新中新DKQ-A16D,随机光盘里有以下文件: 我遇到的问题是,如果直接打开\二代征SDK开发包\DLL\测试程序\C#_2008\WindowsFormsApplication1\目录下的 ... 
- 51 NOD 1384 全排列(STL    搜索)
			1384 全排列 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出一个字符串S(可能又重复的字符),按照字典序 ... 
- 【C语言】二维指针做形参
			转自:http://hi.baidu.com/gpmzccqceabimqq/item/f499f057aa1520404eff208b 关键: 传入时强制类型转换 + 使用时自己手工寻址 今天写程序 ... 
- 【python】为什么修改全局的dict变量不用global关键字
			转自:http://my.oschina.net/leejun2005/blog/145911?fromerr=qnPCgI19#OSC_h4_8 为什么修改字典d的值不用global关键字先声明呢? ... 
- iOS - iPhone开发 UILocalNotification的使用
			OS下的Notification的使用 Notification 是智能手机应用编程中非常常用的一种传递信息的机制,而且可以非常好的节省资源,不用消耗资源来不停地检查信息状态(Pooling),在iO ... 
- AFNetworking request failed unacceptable content type text/html
			今天体验AFNetwork 3.1.0 进行数据解析,但是解析数据控制台一直都输出这样的 error 结果: 于是,照着以前AFN2.+版本的进行设置: 结果发现在新版本的 AFN 上不能设置了.既然 ... 
- C#复制、粘贴文本信息到剪贴板
			复制:private void button1_Click(object sender, System.EventArgs e) { // Takes the selected text from a ... 
- spring集成activeMQ
			1.安装activehttp://activemq.apache.org/activemq-5140-release.html2.运行D:\apache-activemq-5.14.0\bin\win ... 
- 利用android来赚钱
			看了一篇fenger 大神写的文章,受益匪浅,在此做一下记录 转载地址:http://bbs.csdn.net/topics/370249613 其他参考地址: http://bbs.gfan.com ... 
- Mac 下查看 Android Studio 的 SHA1的方法
			cmd -> ->cd .android ->keytool -v -list -keystore debug.keystore 默认口令:android ************* ... 
