结果页面配置
全局结果页面
- (1)
result标签配置action方法的返回值到不同的路径里面。
- (2) 创建两个
action,同时继承ActionSupport执行默认的方法execute方法,让两个action的方法都返回success,返回success之后,配置到同一个页面里面。
- 如果多个
action,方法里面返回值相同的,到页面也是相同的,这个时候可以使用全局结果页面配置
<!-- struts.xml -->
<package name="demo1" extends="struts-default" namespace="/">
<action name="book" class="com.day2.action.BookAction">
<result name="success">/hello.jsp
</result>
</action>
<action name="orders" class="com.day2.action.OrdersAction">
<result name="success">/hello.jsp
</result>
</action>
</package>
<!-- struts.xml -->
<!-- 全局结果页面配置 -->
<package name="demo1" extends="struts-default" namespace="/">
<global-results>
<result name="success">/hello.jsp</result>
</global-results>
</package>
局部结果页面
<package name="demo1" extends="struts-default" namespace="/">
<action name="book" class="com.day2.action.BookAction">
<result name="success">/hello.jsp
</result>
</action>
</package>
<package name="demo1" extends="struts-default" namespace="/">
<global-results>
<result name="success">/hello.jsp</result>
</global-results>
<action name="book" class="com.day2.action.BookAction">
<result name="success">/world.jsp
</result>
</action>
</package>
result标签type属性
- (1) 标签里面除了
name属性之外,还有一个属性type属性。
- (2)
type属性值。
- 默认值,做转发操作,值是
dispatcher
- 做重定向操作,值是
redirect
- (3) 上面两个值
dispatcher、redirect,这两个值一般针对到页面中配置,配置到其他action里面。
chain:转发到action,一般不用,缓存问题。
redirectAction:重定向到action
在action获取表单提交数据
- 概念: 之前
web阶段,提交表单到servlet里面,在servlet里面使用request对象里面的方法获取,getParameter,getParameterMap。
- 提交表单到
action,但是action没有request对象,不能直接使用request对象。
使用ActionContext类获取
Map<String,Objcct> gctParamcters(): 返回一个包含所有HttpServletRequest参数信息。
- (1) 因为方法不是静态的方法,需要创建
ActionContext类的对象
- (2) 这个
ActionContext类对象不是new出来的,
static ActionContext getContext(): 获取当前线程的ActionContext对象。
- 具体演示
- (1) 因为方法不是静态的方法,需要创建
ActionContext类的对象
- (2) 这个
ActionContext类对象不是new出来的,
<form action="${pageContext.request.contextPath }/form1.action"
method="post">
us.ername : <input type="text" name="username" /> <br />
password : <input type="text" name="password" /> <br />
address :<input type="text" name="address" /> <br />
<input type="submit"value="提交" />
</form>
public class Form1DemoAction extends ActionSupport {
@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));
}
return NONE;
}
}
<package name="demo2" extends="struts-default" namespace="/">
<action name="form1" class="com.day2.form.Form1DemoAction">
</action>
</package>
使用ServletActionContext获取
static HttpServletRequest getRequest():获取Web应用的HttpServletRequest对象。
static HttpServletResponse getResponse():获取Web应用的HttpServletResponse对象。
static ServletContext getServletContext():获取Web应用的servletContext对象。
static PageContext getPageContext():获取Web应用的PageContext对象。
- 1: 具体演示
- (1) 创建表单,提交表单到
action里面。
- (2) 在
action使用ActionContext获取数据
<form action="${pageContext.request.contextPath }/form1.action"
method="post">
us.ername : <input type="text" name="username" /> <br />
password : <input type="text" name="password" /> <br />
address :<input type="text" name="address" /> <br />
<input type="submit"value="提交" />
</form>
public class Form2DemoAction extends ActionSupport {
@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");
System.out.println(username+" : "+password+" : "+address);
return NONE;
}
}
<package name="demo3" extends="struts-default" namespace="/">
<action name="form1" class="com.day2.form.Form2DemoAction">
</action>
</package>
使用接口注入方式获取(了解)
public class Form3DemoAction extends ActionSupport implements ServletRequestAware {
private HttpServletRequest request;
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
@Override
public String execute() throws Exception {
request.getParameter("");
return NONE;
}
}
在action操作域对象
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute( "req", "reqValue");
HttpSession session = request.getSession();
session. setAttribute( "sess" , "sessValue" );
ServletContext context = ServletActionContext.getServletContext();
context.setAttribute("contextname", "contextValue");
public class User {
private String username;
private String password;
private String address;
}
public class Form4DemoAction extends ActionSupport {
@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);
return NONE;
}
}
<form action="${pageContext.request.contextPath }/form4.action"
method="post">
us.ername : <input type="text" name="username" /> <br />
password : <input type="text" name="password" /> <br />
address :<input type="text" name="address" /> <br />
<input type="submit"value="提交" />
</form>
<package name="demo2" extends="struts-default" namespace="/">
<action name="form4" class="com.day2.form.Form4DemoAction">
</action>
</package>
struts2提供获取表单数据方式
属性封装
- (1) 直接把表单提交属性封装到
action的属性里面
- (2) 实现步骤
- 在
action成员变量位置定义变量
- 生成变量的
set方法(把set和get方法都写出来)
- (3) 使用属性封装获取表单数据到属性里面,不能把数据直接封装到实体类对象里面。
public class DataDemo1Action extends ActionSupport {
private String username;
private String password;
private String address;
@Override
public String execute() throws Exception {
System.out.println(username + " : " + password + " : " + address);
return NONE;
}
}
<form action="${pageContext.request.contextPath }/data1.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="提交" />
</form>
<package name="demo2" extends="struts-default" namespace="/">
<action name="form4" class="com.day2.form.Form4DemoAction">
</action>
</package>
模型驱动封装(重点)
- (1): 使用模型驱动方式,可以直接把表单数据封装到实体类对象里面。
- (2): 实现步骤
- 1.
action实现接口ModelDriven
- 2.实现接口里面的方法
getModel方法·
- 3.在
action里面创建实体类对象
- (3): 使用模型驱动和属性封装注意问题:
- 在一个
action中,获取表单数据可以属性封装,使用模型驱动封装,不能同时使用属性封装和模型驱动封装获取同一个表单数据
- 如果同时使用,之后执行模型驱动
public class DataDemo2Action extends ActionSupport implements ModelDriven<User> {
private User user = new User();
@Override
public User getModel() {
return user;
}
@Override
public String execute() throws Exception {
System.out.println(user);
return NONE;
}
}
<form action="${pageContext.request.contextPath }/data2.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="提交" />
</form>
<package name="demo2" extends="struts-default" namespace="/">
<action name="data2" class="com.day2.data.DataDemo2Action">
</action>
</package>
表达式封装(会用)
- (1): 实现步骤
- 1.使用表达式封装可以把表单数据封装到实体类对象里面
- 第一步在
action里面声明实体类
- 第二步生成实体类变量的
set和get方法
- 第三步在表单输入项的
name属性值里面写表达式形式
public class User {
private String username;
private String password;
private String address;
}
public class DataDemo3Action extends ActionSupport {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
System.out.println(user);
return NONE;
}
}
<form action="${pageContext.request.contextPath }/data3.action"
method="post">
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="提交" />
</form>
<package name="demo2" extends="struts-default" namespace="/">
<action name="data3" class="com.day2.data.DataDemo3Action">
</action>
</package>
扩展-表达式封装和模型驱动比较
- 1: 使用表达式封装和模型驱动封装都可以把数据封装到实体类对象里面
- 2: 不同点
- (1): 使用模型驱动只能把数据封装到一个实体类对象里面
- 在一个
action里面不能使用模型驱动把数据封装到不同的实体类对象里面。
- (2): 使用表达式封装可以把数据封装到不同的实体类对象里面
struts2获取数据封装到集合中(会用)
封装到list集合
- (1): 实现步骤
- 第一步在
action声明List
- 第二步生成
list变量的set和get方法
public class User {
private String username;
private String password;
private String address;
}
public class ListAction extends ActionSupport {
private List<User> list;
public List<User> getList() {
return list;
}
public void setList(List<User> list) {
this.list = list;
}
@Override
public String execute() throws Exception {
System.out.println(list);
return NONE;
}
}
<form action="${pageContext.request.contextPath }/list.action"
method="post">
<!-- list[e]:表示list集合中第一个user对象 -->
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 /> <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 />
<input type="submit"value="提交" />
</form>
<package name="demo2" extends="struts-default" namespace="/">
<action name="list" class="com.day2.data.ListAction">
</action>
</package>
封装到map集合
- (1): 实现步骤
- 第一步在
action声明Map集合。
- 第二步生成
set和get方法。
- 第三步在表单输入项的
name属性值里面写表达式。
public class User {
private String username;
private String password;
private String address;
}
public class MapAction extends ActionSupport {
private Map<String,User> map;
public Map<String, User> getMap() {
return map;
}
public void setMap(Map<String, User> map) {
this.map = map;
}
@Override
public String execute() throws Exception {
System.out.println(map);
return NONE;
}
}
<form action="${pageContext.request.contextPath }/map.action"
method="post">
<!--设置key值 map[ ' key值'] -->
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/> <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="提交" />
</form>
<package name="demo2" extends="struts-default" namespace="/">
<action name="map" class="com.day2.data.MapAction">
</action>
</package>