Struts2之获取请求参数

获取请求参数

  • 本人独立博客https://chenjiabing666.github.io
  • 在Servlet中可以调用HttpServletRequest的getParameter()的方法接收传递过来的请求参数,但是在struts2中对这种方式进行了三种封装
  • 我们一般发出请求都是通过表单传递的,但是在服务端如果获取表单传递过来的值,其中有三种不同的方式

属性驱动

  • 属性驱动就是将一个Action类作为一个POJO类,在类中定义表单的请求参数的name属性,但是还要为这些成员变量设置get,set方法。因为在获取请求参数的时候自动调用的是set方法,获取参数的时候调用的是get方法。
  • 当表单提交的时候,实际上是提交了表单元素的值,之后会给ACtion类中的属性设置值(set),因此这里的属性需要添加set方法
  • 当表单请求成功的时候,实际上是先经过Action类,然后跳转到指定的视图,这个过程都是转发(ddispatcher),因此会保留request域中的键值对,此时在success.jsp页面中使用EL表达式取值即可(get方法),取值使用的是属性的get方法,因此需要添加get方法

实现

  • SimpleAction类,其中定义了属性
    • 为每一个属性都需要添加get,set方法
    • 表单提交之后会自动调用属性的set方法为其赋值
    • 跳转到指定视图之后,使用EL表达式取值时会调用属性的get方法
public class SimpleAction implements Action {
    private String name;  //姓名
    private String password;  //密码
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public String getPassword() {
        return password;
    }
​
    public void setPassword(String password) {
        this.password = password;
    }
​
    @Override
    public String execute() {
        System.out.println(name+"----"+password);
        return SUCCESS;
    }
}
​
  • struts.xml 配置Action
    <action name="simple" class="com.jsnu.struts2.controller.SimpleAction">
            <result name="success">/jsp/success.jsp</result>
            <result name="input">/jsp/input.jsp</result>
    </action>
​
  • index.jsp 提价表单
    • input中的属性name对应的是SimpleAction的属性名
<body>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<form action="<%=basePath %>simple" method="post">
    name:<input type="text" name="name">
    password:<input type="text" name="password">
    <input type="submit" value="提交">
</form>
​
</body>
  • success.jsp 表单提交成功之后跳转的视图
<body>
    <h1>success</h1>
    <h1>${name }</h1>
    <h1>${password }</h1>
</body>

域驱动

  • 域驱动是将表单中name属性抽象出一个JavaBean类成为一个modle,并不是Action类成为modle了,只需要在Action类引用JavaBean的对象即可(作为成员变量,get,set,方法都有)
  • 既然Action类中的成员变量已经是JavaBean的对象了,那么表单的中name属性的设置就要使用OGNL形式的取该对象中的属性了,而不是像属性驱动一样直接设置的属性

实现

  • JavaBean实体类
    • 必须为每一个属性设置get,set方法
    • 必须有无参构造
/**
 * POJO类,model 其中必须为每一个属性设置get,set方法
 */
public class User {
    private String name; // 姓名
    private String password; // 密码
​
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public String getPassword() {
        return password;
    }
​
    public void setPassword(String password) {
        this.password = password;
    }
​
}
​
  • Action类
    • JavaBean对象作为其成员变量,必须为这个成员变量设置get,set方法
    • 必须有一个无参构造
public class SimpleAction implements Action {
    private User user; // POJO类对象,必须有set,get方法,和无参构造方法
​
    public User getUser() {
        return user;
    }
​
    public void setUser(User user) {
        this.user = user;
    }
​
    @Override
    public String execute() {
        System.out.println(user.getName() + "--->" + user.getPassword());
        return SUCCESS;
    }
}
  • struts.xml配置同上
  • index.jsp 表单提交
    • input中的name属性使用OGNL表达式来设置其值
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<form action="<%=basePath %>simple" method="post">
    name:<input type="text" name="user.name">
    password:<input type="text" name="user.password">
    <input type="submit" value="提交">
</form>
​
  • success.jsp页面
    • 此时使用EL表达式取值,也是使用OGNL形式的取值方式
<body>
    <h1>success</h1>
    <h1>${requestScope.user.name }</h1>
    <h1>${requestScope.user.password }</h1>
</body>

模型驱动

  • 模型驱动和域驱动比较相似,都是用一个JavaBean类作为model,但是模型驱动必须实现ModelDriven<>这个接口,这个可以指定一个泛型,其中泛型类为JavaBean的类,必须实现的方法是getmodel()方法
  • Type getModel(){} 返回一个Type对象,这个对象是在实现接口的时候定义泛型类(JavaBean类)
  • 使用模型驱动,那么表单中的name属性值就不需要使用OGNL表达式了,而是直接使用属性字段即可,这个和属性驱动一样的
  • JavaBean类,这个和上面的一样
  • Action类,实现了ModelDriver<JavaBean> 接口
//实现ModelDriven接口<>指定的泛型为JavaBean类
public class SimpleAction implements Action,ModelDriven<User> {
    private User user; // POJO类对象,必须有set,get方法,和无参构造方法
​
    public User getUser() {
        return user;
    }
​
    public void setUser(User user) {
        this.user = user;
    }
​
    @Override
    public String execute() {
        System.out.println(user.getName() + "--->" + user.getPassword());
        return SUCCESS;
    }
​
    @Override
    public User getModel() {
        System.out.println("调用了getModel方法");
        // 如果对象为空,就创建一个对象,然后返回
        if (user == null) {
            this.user = new User();
        }
        return user;
    }
}
​
  • struts.xml 同上
  • index.jsp 表单提交
    • 这里name属性值直接使用JavaBean属性即可,必须字段一样
<form action="<%=basePath %>simple" method="post">
    name:<input type="text" name="name">
    password:<input type="text" name="password">
    <input type="submit" value="提交">
</form>
  • success.jsp
    • 取值仍然使用的是OGNL形式的取值方式
    <h1>success</h1>
    <h1>${requestScope.user.name }</h1>
    <h1>${requestScope.user.password }</h1>

总结

  • 根据我的经验,在框架整合的基础上,我们必须使得单独的实体类对应一张表,那么此时就需要使得Action类和JavaBean分离,因此我推荐使用第二种方式,第三种方式还需要实现接口,对类的污染比较严重

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏康怀帅的专栏

Bash 条件判断与流程控制相关语句详解

介绍 if case 等语句。 条件判断语句 字符串判断 str1 = str2    当两个字符串有相同内容、长度时为真 str1 != str2   当字符...

2614
来自专栏Ryan Miao

java中byte, iso-8859-1, UTF-8,乱码的根源

Post@https://ryan-miao.github.io 测试代码https://github.com/Ryan-Miao/someTest/comm...

5557
来自专栏web前端教室

JavaScript ES6 模板字符串

偶然发现这个新东西,ES6也有模板了,是使用反引号`,来表示的。 这个新东西被称为字符串字面量,就是模板字符串。它使JS也有了简单的字符串插值特性。 为什么说是...

2549
来自专栏小樱的经验随笔

C/C++中int128的那点事

最近群友对int128这个东西讨论的热火朝天的。讲道理的话,编译器的gcc是不支持__int128这种数据类型的,比如在codeblocks 16.01/Dev...

3031
来自专栏Java帮帮-微信公众号-技术文章全总结

Java设计模式-组合模式

组合模式: 将对象组合成树形结构以表示‘部分-整体’的层次结构, 使得用户对单个对象和组合对象的使用具有一致性. 解析 组合模式描述了如何将容器和叶子节点进行...

3696
来自专栏java初学

spring框架(1)— 依赖注入

46412
来自专栏C/C++基础

获取C++类成员虚函数地址

[1]print address of virtual member function [2]动态联编实现原理分析

1011
来自专栏desperate633

Java动态代理与静态代理静态代理动态代理

我们先看一个简单的例子,当我们需要程序中加入方法执行的日志信息的时候,很显然我们最容易想到的实现方法,就是在方法前后插入日志记录信息。

1512
来自专栏Java成神之路

Spring_总结_03_装配Bean(三)之XML配置

用来装配bean的最基本的XML元素包含在spring-beans模式中,在上面这个XML文件中,它被定义为根命名空间。

603
来自专栏ppjun专栏

Android十八章:从Android看Binder

Binder是android上的一个类 继承了IBinder,用作Ipc进程间通讯,同是帮助Serivermanager连接各种manager(activity...

582

扫码关注云+社区

领取腾讯云代金券