Struts2中常用的接收参数的方法
1.提供属性set方法的方式
-
1).在Action当中提供对应属性的set方法就会自动接收参数,并且会自动将类型转换为在Action类中设置属性时候所设置的属性的类型。
-
2).编写方式
//将接收表单中的参数设置为对应的属性(表单中name属性所对应的值) //设置属性的类型的时候就已经做了数据类型的转换了(框架内部自动就做了类型的转换) private String username; private Integer age; //接收同一字段有多个值的时候可以使用list集合的方式 private List hobby; //为设置的属性提供set方法(可以用lombok代替,但是注意要打开注解) public void setUsername(String username) { this.username = username; } public void setAge(Integer age) { this.age = age; } public void setHobby(List hobby) { this.hobby = hobby; } //设置完之后,再点击表单进行提交的时候 //这个类就会自动接收这些内容,并封装成相应的包装类 public String execute(){ //接收完参数过后就可以直接在执行方法(默认execute)中进行打印了 System.out.println(username); System.out.println(age); System.out.println(hobby); return null; }
-
3).缺点:接收少量数据可以使用,如果使用大量数据就会太麻烦,最好封装成对象操作
2.页面中提供表达式的方式
-
1).建立form表单
<form action="${pageContext.request.contextPath}/myform4.action"> 用户名:<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>
-
2).创建domain包并创建与表单中的提交内容相对应的值(符合javaBean规范)的类(User)
-
3).编写Action方法
- 创建User类的属性
- 为这个属性提供get和set方法
- 编写execute方法
//创建User属性 private User user; //为User提供get和set方法 public User getUser() { return user; } public void setUser(User user) { this.user = user; } //在页面当中提供表达式的方式 public String execute (){ System.out.println(user); return null; }
-
4).配置struts.xml文件(添加相应的action)
-
5).修改表单(user.+ “user为创建的类的属性名”)
<form action="${pageContext.request.contextPath}/myform4.action"> 用户名:<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>
-
6).操作完毕,提交表单的时候就会自动将表单中提交的内容封装到对象当中
3.采用模型驱动的方式
-
1).创建表单
``` <form action="${pageContext.request.contextPath}/myform5.action"> 用户名:<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> ```
-
2).创建一个接收表单的domain模型
-
3).创建Action+execute方法
- 创建的类要的实现接口ModelDriver<>将注解设置为创建的domain模型所对应的的类
- 实现接口中的方法
- 创建封装接口的对象即domain中创建的类(new一个对象)
- 在实现 接口方法中返回创建的对象
public class MyformAction5 extends ActionSupport implements ModelDriven<User> { private User user = new User(); @Override public User getModel() { return user; } public String execute (){ System.out.println("user===="+user); return null; }
-
4).操作完毕之后就可以自动封装user这个对象了,然后在execute方法中就可以直接使用new的这个对象了
接收参数的错误
- 任何一个拦截器在执行的过程当中,都会向错误信息中添加错误消息
- 最后workflow会检查其中的错误信息是否有错误消息
- 如果没有错误消息,就会调用invoke()直接到目标action
- 如果有错误,就跳转到input
- 所以在开发的时候,可以自己配置一个input逻辑视图(在struts.xml中设置一个全局变量【global-results中的result中添加name=“input” 返回界面为自己设定的一个界面】) 错误的时候就可以跳转到指定的界面,在页面中显示错误信息。
接收复杂类型的封装到list集合中
-
1).创建jsp页面
<form action="${pageContext.request.contextPath}/myform6.action"> 名称:<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> <input type="submit" value="提交"> </form>
-
2).创建页面对象的模型(在domain中创建表单中提交参数字段属性(符合javaBean规范))
-
3).创建对象的action
//设置一个Goods属性(domain中创建的符合javaBean规范的类) private List<Goods> goodslist; //提供list集合的get和set方法 public List<Goods> getGoodslist() { return goodslist; } public void setGoodslist(List<Goods> goodslist) { this.goodslist = goodslist; } public String execute(){ System.out.println(goodslist); return null; }
-
4).在jsp中添加表达式
name="goodslist[0].name"在名称前面添加goodslist[0],表示相同表单的第几个重复部分(下标从0开始)。(前面的表单已写好了)
-
5).操作完毕,运行结果为
运行结果示例: [Goods{name='goods1', price=11.0}, Goods{name='goods2', price=22.0}]
接收复杂类型封装到Map集合
- Map集合操作方式基本上和List操作一致
- 不同的地方为:
-
Action中方法的设置方式:
//使用map集合来接收 private Map<String,Goods> goodsMap;//键是String类型,所以在表单中“[]”中也是字符串方式。 //提供get和set方法 public Map<String, Goods> getGoodsMap() { return goodsMap; } public void setGoodsMap(Map<String, Goods> godsMap) { this.goodsMap = godsMap; } public String execute(){ System.out.println(goodsMap); return null; }
-
jsp中表单name后面名称的设置([代表键])
<form action="${pageContext.request.contextPath}/myform7.action"> 名称:<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>
-
运行结果示例为:
{one=Goods{name='goods1', price=11.0}, two=Goods{name='goods2', price=null}}
-