一、result结果集配置
1.当返回结果一样时,可以配置一个全局结果标签:
<package name="default" extends="struts-default" namespace="/">
<global-results>
<result name="success">/hello.jsp</result>
</global-results>
</package><action name="form1" class="com.edu.action.Form1Action"> </action> <action name="form2" class="com.edu.action.Form2Action"> </action> <action name="form3" class="com.edu.action.Form3Action"> </action>
在Action中,返回的结果都为success时,会跳转到页面hello.jso。二、result的type属性
1.dispatcher:做转发操作,地址栏地址不变(默认)
2.redirect:做重定向操作,地址栏地址会变
3.redirectAction:重定向到Action,举例如下:
当resul的type属性是redirectAction时,result标签里的值是action的name,如上面的order。<action name="book" class="com.edu.action.BookAction"> <result name="success" type="redirectAction">order</result> </action> <action name="order" class="com.edu.action.OrderAction"> <result name="success" type="redirect">/hello.jsp</result> </action>
三、Action访问Web资源
1.使用ServletActionContext类;
调用静态方法得到request对象:
@Override public String execute() throws Exception{ HttpServletRequest request = ServletActionContext.getRequest(); String username=request.getParameter("username"); String password=request.getParameter("password"); String address=request.getParameter("address");
2.使用ActionContext类;
@Override public String execute() throws Exception{ ActionContext context = ActionContext.getContext(); Map<String, Object> map = context.getParameters(); Set<String> keys = map.keySet(); for(String key:keys){ Object[] obj = (Object[])map.get(key); System.out.println(Arrays.toString(obj)); }
3.使用接口注入方式。
四、封装获取数据方式
1.通过request对象获取到数据封装到实体类:
2.属性封装@Override public String execute() throws Exception{ HttpServletRequest request = ServletActionContext.getRequest(); String username=request.getParameter("username"); String password=request.getParameter("password"); String address=request.getParameter("address"); User user = new User(); user.setUsername(username); user.setPassword(password); user.setAddress(address); System.out.println(user);
(1)在action中定义成员变量,成员变量的名称和表单里的name属性值一样;
(2)生成变量的getter、setter方法;
private String username; private String password; private String address; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; }
3.模型驱动封装(只能把数据封装到一个实体类里面)
(1)Action实现接口ModelDriven;
(2)实现接口的getModel()方法并返回实体类对象;
private User user = new User(); @Override public User getModel() { // TODO Auto-generated method stub return user; }
用这种方法时,实体类的属性要和表单里的name属性值一致。
4.表达式封装(可以把数据封装到不同的实体类里面)
(1)在action里面声明实体类变量;
(2)生成变量的getter、setter方法;
使用这种方式时,表单里的name属性值要在属性前加book:private Book book; public Book getBook() { return book; } public void setBook(Book book) { this.book = book; }
五、封装数据到list集合
1.在action里声明List;
2.生成List的getter、setter方法;
3.在表单里写表达式:private List<User> list; public List<User> getList() { return list; } public void setList(List<User> list) { this.list = list; }
<input type="text" name="list[0].username"/>
六、封装数据到Map集合
(1)声明Map集合;
(2)生成setter、getter方法;
(3)在表单里写表达式:private Map<String,User> map; public Map<String, User> getMap() { return map; } public void setMap(Map<String, User> map) { this.map = map; }
username:<input type="text" name="map['one'].username"/> password:<input type="text" name="map['one'].password"/> address:<input type="text" name="map['one'].address"/>