Struts2---第三篇

Struts2


  • 文章内容:
  • 结果页面配置
  • action获取表单提交数据
  • 扩展–表达式封装和模型驱动比较
  • 数据封装到集合中

一、结果页面配置

1.全局结果页面

背景:一个package里面多个action的结果页面,都是同一个页面。

以前情况,会生成多个result标签,容易混乱,可以package里面定义一个global-results标签

<!--全局结果页面-->
<package name="" extends="">
	<global-results>
 		<result name="success">/xx.jsp</result>
	</global-results>
	<action ...></action>
	<action ...></action>
</package>

2.局部结果页面

<action> 内的页面。如果即配置了全局页面,也配置了局部页面,结果以局部页面为准

3.result标签和type属性

  • type属性:如何到路径里面去,转发还是重定向

  • type属性值

    • 默认值–做的操作是转发操作 值为dispatcher

    • 做重定向操作,值 是redirect

    • 上面的两个一般都是针对页面配置的

    • chain :转发到action ,但是一般不建议使用,用缓存问题 <result name="success" type="chain">

    • redirectAction :重定向到action <result name="success" type="redirectAction ">

    •  <action name="xxx" class...>
       	<result name="ok" type="redirectAction">orders</results>
       </action>
       <action name="orders" class...></action>
      

二、action 获取表单提交数据

之前的方法,都是提交表单到servlet里面,在servlet里面使用request对象里面的方法获得,getParameter,getParameterMap

现在提交表单是到action里面,action里面没有request中对象.

获取数据有以下3中方式

1.使用ActionContext类获取–官方推荐

ActionContext类来访问Servlet API,ActionContext 是Action执行的上下文对象,保存了Action的执行的所需对象,包括parameters,request,Session,application

ActionContext context = ActionContext.getContext();
Map<String,Object> map = context.getParameters();
Set<String> keys = map.keySet();
for(String key:keys){
    // 根据key得到value
    Object[] obj = (Object[])map.get(key);// 有的表单如复选框,会有多个值,所以用集合接收
    System.out.println(Arrays.toString(obj));// Arrays.toString() 可以输出数组内容
}

用的人不是很多

2.使用ServletActionContext类获取

ServletActioncontext 类里面的静态方法

static HttpServletRequest getRequest(); //获取web应用的HttpServletRequest 对象
static HttpServletResponse getResponse(); // 获取web应用的HttpServletResponse 对象
static ServletContext getServletContext(); // 获取web应用的ServletContext对象
static PageContext getPageContext();// 获取web应用的PageContext对象
  • 调用类里面的静态方法,得到request对象
// 使用ServletActionContext 类获取
HttpServletRequest request = ServletActionContext.getRequest();
String username = request.getparameter("xxx");

使用action 操作域对象

request . session . servletContext 域对象

具体操作方法,同上,先获取request对象,然后在获取Session对象

3.使用接口注入方式获取

让action实现接口,为了得到request对象

在类中,定义成员变量,然后调用

// 实现以下接口
implements ServletRequestAware
implements ServletResponseAware
implements SessionAware
implements ServletContextAware

三、Struts2 提供获取表单

原始操作方法:取得request对象,提取出相应的parameter值,然后用javabean 对象的get和Set方法赋值

如果内容过多,代码实现十分复杂

1.属性封装 —(会用)

  1. 直接把表单提交的属性,封装到action的属性中
    1. 在action中的成员变量位置定义变量,与表单输入项的名称一样
    2. 生成变量的Set方法
    3. 表单提交的时候,action实现了ActionSupport类,会自动将表单中的数据封装。

提示:该方法只是把数据封装到属性里面,没有封装到实体类对象里面

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

@Override
public String execute() throws Exception {
    // TODO Auto-generated method stub
    System.out.println(this.username+this.password);
    return NONE;
}

有的表达式封装也被分到了属性封装里面

  1. 在action中,声明实体类,就是定义对象,但是没有new出来
  2. 生成实体类里面的Set get 方法
  3. 在表当输入项的name值里面写表达式形式
private User user;
public User getUser(){
    return user;
}
public void setUser(User user){
    this.user = user;
}
public String execute(){ return NONE;}
---------- 表单输入项------------
<input type="text" name="user.username"> // 表示封装到user类的username中
<input type="text" name="user.password"> // 表示封装到user类的password中

2.模型驱动封装—(重点、常用)

可以直接把数据封装到对象中。

  1. action 实现接口 ModelDriven
  2. 实现接口里面的方法 getModel ---- 把创建对象返回
  3. 在 action 里面创建实体类对象 new JavaBean();
public class DataAction02 extends ActionSupport implements ModelDriven<User>{
	private User user= new User(); // 这里必须new一个新的对象
	@Override
	public User getModel() {
		return user;
	}
	@Override
	public String execute() throws Exception {
		System.out.println(user);
		return NONE;
	}
	
}

提示:两个方法不能同时在一个action中,获取一个表单提交的数据。否则,属性封装会为null。执行驱动封装

3.表达式和模型驱动对比

  1. 使用模型驱动,只能把数据封装到一个实体类对象里面

    在一个action里面,不能把模型驱动封装到不同的实体类对象里面

  2. 使用表达式封装,可以把数据封装到不同的实体类对象中

    表单项里面,该项的name写入新的类对象.属性


四、Struts2 获取数据封装到集合中

1.封装到list集合

  1. 在action中声明list;
  2. 生成list变量的set和get方法
  3. 在表单输入项里面写表达式
<input type="text" name="list[0].username"/>
<input type="text" name="list[0].password"/>
<input type="text" name="list[1].username"/>
<input type="text" name="list[1].password"/>

2.封装到MAP集合

  1. 声明Map集合
  2. 生成get和set方法
  3. 在表单输入项的name值里写表达式
<input type="text" name="map['one'].username">
<input type="text" name="map['one'].password">
<input type="text" name="map['two'].username">
<input type="text" name="map['two'].password">

最后更新:2018.10.31

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值