前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Struts2之获取请求参数

Struts2之获取请求参数

原创
作者头像
爱撒谎的男孩
发布2018-05-10 18:58:11
1.1K1
发布2018-05-10 18:58:11
举报
文章被收录于专栏:码猿技术专栏码猿技术专栏

获取请求参数

  • 本人独立博客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方法
代码语言:javascript
复制
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
代码语言:javascript
复制
    <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的属性名
代码语言:javascript
复制
<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 表单提交成功之后跳转的视图
代码语言:javascript
复制
<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方法
    • 必须有无参构造
代码语言:javascript
复制
/**
 * 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方法
    • 必须有一个无参构造
代码语言:javascript
复制
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表达式来设置其值
代码语言:javascript
复制
<%
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形式的取值方式
代码语言:javascript
复制
<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> 接口
代码语言:javascript
复制
//实现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属性即可,必须字段一样
代码语言:javascript
复制
<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形式的取值方式
代码语言:javascript
复制
    <h1>success</h1>
    <h1>${requestScope.user.name }</h1>
    <h1>${requestScope.user.password }</h1>

总结

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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 获取请求参数
    • 属性驱动
      • 实现
    • 域驱动
      • 实现
    • 模型驱动
      • 总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档