Struts2 (下)

Posted xzh0717

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2 (下)相关的知识,希望对你有一定的参考价值。

接收参数

当发送一个请求时,除了使用RequestApi来接收参数之外,Struts2内部提供了3种接收参数的方式

接收参数的方式

1. 提供属性set方法的方式

在Action当中提供对应属性的set方法,会自动接收参数,并且会自动做类型转换

使用方式

index.jsp

<form action="${pageContext.request.contextPath }/myform.action"
    method="get">
    用户名:<input type="text" placeholder="请输入用户名..." name="username"><br />
    年龄:<input type="text" placeholder="请输入年龄..." name="age"><br />
    爱 好: 
    <input type="checkbox" value="足球" name="hobby">足球 
    <input type="checkbox" value="篮球" name="hobby">篮球 
    <input type="checkbox" value="乒乓球" name="hobby">乒乓球<br /> 
    <input type="submit" value="提交">
</form>

struts.xml

<struts>
    <package name="struts" extends="struts-default" namespace="/">
        <action name="myform" class="com.xzh.struts2.MyFormAction">
            <!-- 结果页 -->
            <result name="success">/myxq.jsp</result>
        </action>
    </package>
</struts>

MyFormAction.java

public class MyFormAction extends ActionSupport {
    private String username;
    private int age;
    private List hobby;

    public void setUsername(String username) {
        this.username = username;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setHobby(List hobby) {
        this.hobby = hobby;
    }
    
    public String execute() {
        System.out.println(username);
        System.out.println(age);
        System.out.println(hobby);
        return null;
    }
}

缺点:接收少量数据可以,如果大量数据,还得要自己手动封装成对象

2. 页面中提供表达式方式

  • 创建一个接收参数的domain模型
  • 在Action当中提供一个对象属性,并要提供该对象属性的get/set方法
  • 在jsp页面当中发送参数时要带上Action当中的对象属性名称

使用方式

User.java

public class User {

    private String username;
    private Integer age;
    private List hobby;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public List getHobby() {
        return hobby;
    }

    public void setHobby(List hobby) {
        this.hobby = hobby;
    }

    @Override
    public String toString() {
        return "User{" + "username='" + username + '\\'' + ", age=" + age + ", hobby=" + hobby + '}';
    }

}

index.jsp

<form action="${pageContext.request.contextPath }/myform.action"
    method="get">
    用户名:<input type="text" placeholder="请输入用户名..." name="user.username"><br />
    年龄:<input type="text" placeholder="请输入年龄..." name="user.age"><br />
    爱 好: 
    <input type="checkbox" value="足球" name="user.hobby">足球 
    <input type="checkbox" value="篮球" name="user.hobby">篮球 
    <input type="checkbox" value="乒乓球" name="user.hobby">乒乓球<br /> 
    <input type="submit" value="提交">
</form>

struts.xml

<struts>
    <package name="struts" extends="struts-default" namespace="/">
        <action name="myform" class="com.xzh.struts2.myform.MyFormAction">
            <!-- 结果页 -->
            <result name="success">/myxq.jsp</result>
        </action>
    </package>
</struts>

MyFormAction.java

public class MyFormAction extends ActionSupport {
    private User user;
    
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String execute() {
        System.out.println(user);
        return null;
    }
}

3. 采用模型驱动方式

  • 创建一个接收参数的domain模型
  • 在Action当中实现ModelDriven接口
  • 实现接口方法getModel()
  • 创建一个模型对象,在接口方法中返回

使用方式

User.java

public class User {

    private String username;
    private Integer age;
    private List hobby;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public List getHobby() {
        return hobby;
    }

    public void setHobby(List hobby) {
        this.hobby = hobby;
    }

    @Override
    public String toString() {
        return "User{" + "username='" + username + '\\'' + ", age=" + age + ", hobby=" + hobby + '}';
    }

}

index.jsp

<form action="${pageContext.request.contextPath }/myform.action"
    method="get">
    用户名:<input type="text" placeholder="请输入用户名..." name="username"><br />
    年龄:<input type="text" placeholder="请输入年龄..." name="age"><br />
    爱 好: 
    <input type="checkbox" value="足球" name="hobby">足球 
    <input type="checkbox" value="篮球" name="hobby">篮球 
    <input type="checkbox" value="乒乓球" name="hobby">乒乓球<br /> 
    <input type="submit" value="提交">
</form>

struts.xml

<struts>
    <package name="struts" extends="struts-default" namespace="/">
        <action name="myform" class="com.xzh.struts2.myform.MyFormAction">
            <!-- 结果页 -->
            <result name="success">/myxq.jsp</result>
        </action>
    </package>
</struts>

MyFormAction.java

public class MyFormAction extends ActionSupport implements ModelDriven<User>{
    private User user = new User();
    
    @Override
    public User getModel() {
        return user;
    }
    
    public String execute() {
        System.out.println(user);
        return null;
    }
}

接收参数错误

  • 只要任何一个拦截器在执行的过程当中,都会向错误信息中去添加错误消息。
  • 最后workflow会检查错误信息当中是否有错误的消息
  • 如果没有,就直接到目标action
  • 如果有,就会跳转到input逻辑视图

技术图片

在开发时,可以配置一个input逻辑视图,错误时,可以在跳转到自己指定的页面, 在页面中可以显示错误信息

技术图片

技术图片

接收复杂类型封装到List集合

创建jsp页面

<form action="${pageContext.request.contextPath }/myform.action"
    method="get">
    商品名称:<input type="text" placeholder="请输入商品名称..." name="name"><br />
    商品价格:<input type="text" placeholder="请输入商品价格..." name="price"><br />
    <hr>
    商品名称:<input type="text" placeholder="请输入商品名称..." name="name"><br />
    商品价格:<input type="text" placeholder="请输入商品价格..." name="price"><br />
    <hr>
    商品名称:<input type="text" placeholder="请输入商品名称..." name="name"><br />
    商品价格:<input type="text" placeholder="请输入商品价格..." name="price"><br />
    <input type="submit" value="提交">
</form>

创建页面对象模型

public class Goods {
    private String name;
    private Double price;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Goods{" + "name='" + name + '\\'' + ", price=" + price + '}';
    }
}

编写struts.xml

<struts>
    <package name="struts" extends="struts-default" namespace="/">
        <action name="myform" class="com.xzh.struts2.myform.MyFormAction">
            <!-- 结果页 -->
            <result name="success">/myxq.jsp</result>
        </action>
    </package>
</struts>

创建对应Action

public class MyFormAction extends ActionSupport {
    private List<Goods> goodsList;
    
    public List<Goods> getGoodsList() {
        return goodsList;
    }
    
    public void setGoodsList(List<Goods> goodsList) {
        this.goodsList = goodsList;
    }

    public String execute() {
        System.out.println(goodsList);
        return null;
    }
}

在jsp当中添加表达式

<form action="${pageContext.request.contextPath }/myform.action"
    method="get">
    商品名称:<input type="text" placeholder="请输入商品名称..." name="goodsList[0].name"><br />
    商品价格:<input type="text" placeholder="请输入商品价格..." name="goodsList[0].price"><br />
    <hr>
    商品名称:<input type="text" placeholder="请输入商品名称..." name="goodsList[1].name"><br />
    商品价格:<input type="text" placeholder="请输入商品价格..." name="goodsList[1].price"><br />
    <hr>
    商品名称:<input type="text" placeholder="请输入商品名称..." name="goodsList[2].name"><br />
    商品价格:<input type="text" placeholder="请输入商品价格..." name="goodsList[2].price"><br />
    <input type="submit" value="提交">
</form>

接收复杂类型封装到Map集合

基本上与List相同。

创建对应Action

public class MyFormAction extends ActionSupport {
    private Map<String,Goods> goodsMap;

    public Map<String, Goods> getGoodsMap() {
        return goodsMap;
    }

    public void setGoodsMap(Map<String, Goods> goodsMap) {
        this.goodsMap = goodsMap;
    }

    public String execute() {
        System.out.println(goodsMap);
        return null;
    }
}

jsp

<form action="${pageContext.request.contextPath }/myform.action"
    method="get">
    商品名称:<input type="text" placeholder="请输入商品名称..." name="goodsMap['one'].name"><br />
    商品价格:<input type="text" placeholder="请输入商品价格..." name="goodsMap['one'].price"><br />
    <hr>
    商品名称:<input type="text" placeholder="请输入商品名称..." name="goodsMap['two'].name"><br />
    商品价格:<input type="text" placeholder="请输入商品价格..." name="goodsMap['two'].price"><br />
    <input type="submit" value="提交">
</form>

key值为自己取的一个值

以上是关于Struts2 (下)的主要内容,如果未能解决你的问题,请参考以下文章

有人知道下面的代码片段是啥意思吗?

S2-053:Apache Struts2远程代码执行漏洞(中危)

struts2 之 struts2数据校验

struts2如何验证文本框大于0但不等于0

Struts2 action 跳转到web-inf下,

Struts2之result中标准结果代码