Struts2_day02
Struts2课程安排
第一天 struts2 入门 2017年10月27日
第二天 struts2 数据 2017年10月28日
第三天 struts2 值栈 2017年10月29日
第四天 struts2拦截器 2017年10月30日
1.结果页面配置
1.1全局结果页面
result标签配置action方法的返回值到不同的路径里面
-
创建两个action,执行默认的方法execute方法,让两个action的方法都返回success,返回success之后,配置到同一个页面里面
public class BookAction extends ActionSupport { public String execute() throws Exception { return "success"; } } public class OrdersAction extends ActionSupport { public String execute() throws Exception { return "success"; } }
(1)如果多个action,方法里面返回值相同的,到页面也是相同的,这个时候可以使用全局结果页面配置
(2)在package标签里面配置
<package name="action1" extends="struts-default" namespace="/"> <action name="book" class="com.ghw.action.BookAction"> <result name="success" type="redirect">/hello.jsp</result> </action> <action name="order" class="com.ghw.action.OrdersAction"> <result name="success">/hello.jsp</result> </action> </package>
1.2局部结果页面
<package name="action1" extends="struts-default" namespace="/">
<global-results>
<result name="success">/hello.jsp</result>
</global-results>
<action name="book" class="com.ghw.action.BookAction">
<result name="success">/world.jsp</result>
</action>
<action name="order" class="com.ghw.action.OrdersAction"></action>
</package>
- 配置全局页面,也配置了局部页面,最终以局部配置为准,比如上面配置,执行book.action会跳转到world.jsp页面
1.3result标签type属性
- 默认值dispatcher做转发,转发地址不变,内容变
- redirect做重定向,重定向地址和内容都变
- 上面两个值dispatcher、redirect,这两个值一般针对到页面中配置
- 配置到其他的action里面
- chain:转发到action
- redirectAction:重定向到action
<action name="book" class="com.ghw.action.BookAction">
<result name="success" type="redirectAction">order</result>
</action>
<action name="book" class="com.ghw.action.BookAction">
<result name="success" type="chain">order</result>
</action>
2.在action获取表单提交数据
- 之前web阶段,提交表单到servlet里面,在servlet里面使用request对象里面的方法获取,getParameter,getParameterMap
- 提交表单到action,但是action没有request对象,不能直接使用request对象
2.1使用ActionContext类获取
(1)因为方法不是静态的方法,需要创建ActionContext类的对象
(2)这个ActionContext类对象不是new出来的,
- 具体演示
(1)创建表单,提交表单到action里面
<form action="${pageContext.request.contextPath }/form4.action" method="post">
username:<input type="text" name="username"/>
<br/>
password:<input type="text" name="password"/>
<br/>
address:<input type="text" name="address"/>
<br/>
<input type="submit" value="submit"/>
</form>
(2)在action使用ActionContext获取数据
public class FormAction extends ActionSupport {
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));
}
return "success";
}
}
2.2使用ServletActionContext类获取
public class FormAction extends ActionSupport {
public String execute() throws Exception {
// 1.使用Servlet类获取request对象
HttpServletRequest httpServletRequest = ServletActionContext.getRequest();
// 2.使用request里面的方法得到结果
String username = httpServletRequest.getParameter("username");
String password = httpServletRequest.getParameter("password");
String address = httpServletRequest.getParameter("address");
System.out.println("username:" + username + " password:" + password + " address" + address);
return "success";
}
}
2.3使用接口注入方式获取(了解)
让action实现ServletRequestAware接口,得到request对象
package com.ghw.action;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.interceptor.ServletRequestAware;
import com.opensymphony.xwork2.ActionSupport;
public class FormAction extends ActionSupport implements ServletRequestAware {
private HttpServletRequest request;
public HttpServletRequest getRequest() {
return request;
}
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public String execute() throws Exception {
// 1.使用Servlet类获取request对象
// 2.使用request里面的方法得到结果
String username = request.getParameter("username");
String password = request.getParameter("password");
String address = request.getParameter("address");
System.out.println("username:" + username + " password:" + password + " address" + address);
return "success";
}
}
2.4在action操作域对象
- request、session、servletContext域对象
- 使用ServletActionContext类操作
3.获取表单数据方式
3.1原始方式(了解)
原始方式获取表单封装到实体类对象,2.1-2.3方法中只是把表单内容获取
public String execute() throws Exception {
// 1.获取表单数据
HttpServletRequest request = ServletActionContext.getRequest();
String username = request.getParameter("username");
String password = request.getParameter("password");
String address = request.getParameter("address");
// 2.封装到实体类中
User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setAddress(address);
System.out.println(
"username:" + user.getUsername() + " password:" + user.getPassword() + " address:" + user.getAddress());
return "success";
}
3.2属性封装(会用)
直接把表单内容封装到action的属性里面,只能封装到类属性里面,不能封装到对象里面
实现步骤:
- 在action中定义成员变量,变量名称和表单输入项name属性值一样
- 生成变量的get和set方法
package com.ghw.action;
import com.opensymphony.xwork2.ActionSupport;
public class FormAction extends ActionSupport {
// 1.定义与表单name相同的变量名
private String username;
private String password;
private String address;
// 2.生成setter和getter方法
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String execute() throws Exception {
System.out.println("username:" + username + " password:" + password + " address" + address);
return "success";
}
}
3.3模型驱动封装(重点)
- 使用模型驱动方式,可以直接把表单数据封装到实体类对象里面
- 要求:实体类里面的成员属性名和表单name名一样
- 实现步骤:
(1)action
实现接口ModelDriven
public class FormAction extends ActionSupport implements ModelDriven<User>
泛型要写封装数据的类的类型
(2)实现接口里面的方法 getModel方法把创建对象返回
// 返回创建的user对象
public User getModel() {
return user;
}
(3)在action里面创建实体类对象
// 创建对象
private User user = new User();
- 使用模型驱动和属性封装注意问题:
- 在一个action中,获取表单数据可以属性封装,也可以使用模型驱动封装,但不能同时使用属性封装和模型驱动封装获取同一个表单数据,如果同时使用,只会执行模型驱动
3.4表达式封装(会用)
- 实现过程
(1)使用表达式封装可以把表单数据封装到实体类对象里面
(2)把表达式封装归类到属性封装里面
第一步 在action里面声明实体类
// 1.声明实体类
private User user;
第二步 生成实体类变量的set和get方法
// 2.生成实体类的setter和getter方法
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
第三步 在表单输入项的name属性值里面写表达式形式
<form action="${pageContext.request.contextPath }/form4.action" method="post">
<!-- 3.在表单输入项的name属性值里面写表达式形式 -->
username:<input type="text" name="user.username"/>
<br/>
password:<input type="text" name="user.password"/>
<br/>
address:<input type="text" name="user.address"/>
<br/>
<input type="submit" value="submit"/>
</form>
3.5表达式封装和模型驱动封装比较
-
相同点:
可以把数据封装到实体类对象里面
-
不同点:
表达式封装可以封装到不同的实体类里面
使用模型驱动只能把数据封装到一个实体类对象里面
private User user; private Book book; public User getUser() { return user; } public Book getBook() { return book; } public void setBook(Book book) { this.book = book; } public void setUser(User user) { this.user = user; }
username:<input type="text" name="user.username"/> <br/> password:<input type="text" name="book.password"/> <br/> address:<input type="text" name="user.address"/> <br/>
4.数据封装到集合中(会用)
4.1封装到list集合
第一步 在action声明List
第二步 生成list变量的set和get方法
// 1.声明list变量
private List<User> list;
// 2.生成list的set,get方法
public List<User> getList() {
return list;
}
public void setList(List<User> list) {
this.list = list;
}
第三步 在表单输入项里面写表达式
<!-- 3.在表单输入项的name属性值里面写表达式形式 -->
username:<input type="text" name="list[0].username"/>
<br/>
password:<input type="text" name="list[0].password"/>
<br/>
address:<input type="text" name="list[0].address"/>
<br/>
username:<input type="text" name="list[1].username"/>
<br/>
password:<input type="text" name="list[1].password"/>
<br/>
address:<input type="text" name="list[1].address"/>
<br/>
4.2封装到map集合
第一步 在action声明Map
// 1.声明map变量
private Map<String, User> map;
第二步 生成map变量的set和get方法
// 2.生成map的set,get方法
public Map<String, User> getMap() {
return map;
}
public void setMap(Map<String, User> map) {
this.map = map;
}
第三步 在表单输入项里面写表达式
<!-- 3.在表单输入项的name属性值里面写表达式形式 -->
username:<input type="text" name="map['one'].username"/>
<br/>
password:<input type="text" name="map['one'].password"/>
<br/>
address:<input type="text" name="map['one'].address"/>
<br/>
username:<input type="text" name="map['two'].username"/>
<br/>
password:<input type="text" name="map['two'].password"/>
<br/>
address:<input type="text" name="map['two'].address"/>
<br/>
<input type="submit" value="submit"/>