## struts.xml配置信息
package标签
A、name属性:
属性值与功能无关系
B、extends属性:
属性值固定,赋予package中的类action功能
extends = ”struts - default“
C、namespace属性
默认值为“/”,与action标签中name属性值构成访问路径
action标签
A、name属性
构成访问路径
package中不同action不可同名
B、class属性
action全路径(包名.类名)
C、method属性
action中默认执行execute()方法,通过method可以让action中多个方法执行
result标签
A、name属性
与方法返回值一样
B、type属性
配置如何到路径中(转发或者重定向),默认转发。
转发(dispatcher)
重定向(redirect)
C、配置到其他的action当中
<result name = "success" type = "redirectAction">orders</result>
<result name = "success" type = "chain">orders</result>
分别对应重定向和转发“(chain存在缓存问题,一般不用)
orders为另一个action的name值”
<result name="success">/success.jsp</result>
action三种创建方式
1、创建普通类,不继承,不实现接口
2、创建类,实现Action接口
package action_e;
import com.opensymphony.xwork2.Action;
public class ModelAction implements Action {
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return null;
}
}
3、创建类,继承ActionSupport类(常用)
package action_e;
import com.opensymphony.xwork2.ActionSupport;
public class ModelAction extends ActionSupport{
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return super.execute();
}
}
注:ActionSupport本身实现了Action接口
***对Action中方法的访问方式
1、第一种方式
使用action标签的method属性,在这个属性里面写执行的方法
2、使用通配符方式实现
示例:
<!-- 这里的“{1}”与通配符第一个“*”对应。同理,若是对应第二个通配符为“{2}”,以此类推 -->
<action name="Book_*_Action" class="action_e.BookAction" method="{1}">
3、动态访问实现(一般不用)
Action获取表单提交数据
1、提交表单到action当中,action中无request对象,要先获取request对象
action获取表单提交数据的主要三种方式
1、使用ActionContext类
A、创建ActionContext类对象
public String execute() throws Exception {
/* 第一种方式
* 第一步:获取ActionContext对象
*/
ActionContext context = ActionContext.getContext();
Map<String, Object> map = context.getParameters(); //key是表单输入项name属性值,value是输入的值
Set<String> keys = map.keySet();
for (String key : keys) {
//根据key得到value
Object[] o = (Object [])map.get(key); //数组形式,防止复选框
System.out.println(Arrays.toString(o));
}
return NONE;
}
2、使用ServletActionContext类
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("req", "reqValue");
3、使用接口注入方式
实现ServletRequestAwae接口,在方法中直接获取request对象
在Action中操作域对象
域对象
request, session,ServletContext(不常用)
//request域
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("req", "reqValue");
//session域
HttpSession session = request.getSession();
session.setAttribute("sess", "sessValue");
//ServletContext域
ServletContext context = ServletActionContext.getServletContext();
context.setAttribute("context", "contextValue");
Struts2封装获取表单数据
属性封装
步骤:
A、在action成员变量位置定义变量
变量名称与表单输入项的name属性值一致
B、生成变量的get,set方法
****: 不能直接把数据封装到实体类对象中
模型驱动封装
(1)action实现接口ModelDriven
(2)实现接口中的getModel方法
把创建的对象返回
(3)在action中创建实体类对象
private User user = new user();
public User getModel(){
return user;
}
表达式封装
(1)声明实体类
(2)生成实体类变量的get和set方法
(3)修改表单输入项name属性值
如:user.password
ognl表达式
功能:
在Struts2中操作值栈数据
一般ognl和Struts2标签一起使用
在jsp页面中引入标签库
<%@ taglib uri="/struts-tags" prefix="s"%>
eg1:
<!-- 使用ognl+struts2标签实现计算字符串长度
value属性值:ognl表达式
-->
<s:property value="'haha'.length()"/>
值栈
A、在struts2里面提供本身一种存储机制,类似于域对象,称为值栈,可以存值和取值
(1)在action里面把数据放到值栈里面,在页面中获取到值栈数据
B、servlet和action区别
(1)Servlet:默认在第一次访问时候创建,创建一次,单实例对象
(2)Action:访问时候创建,每次访问action时候,都会创建action对象,创建多次,多实例对象
C、值栈存储位置
(1)每次访问action时候,都会创建action对象,
(2)在每个action对象里面都会有一个值栈对象(只有一个)
值栈内部结构
主要结构
root(list集合)**经常访问的内容
context(map集合)
获取值栈对象
(1)使用ActionContext类中的方法获取
public String execute() throws Exception {
// 1 获取ActionContext类对象
ActionContext context = ActionContext.getContext();
//2 获取值栈对象
ValueStack stack1 = context.getValueStack();
ValueStack stack2 = context.getValueStack();
//每个action对象里面都只有一个值栈对象
System.out.println(stack1==stack2);
return NONE;
}
向值栈中放对象(三种方法)
(1)获取值栈对象,调用set方法(map对象)
ActionContext context = ActionContext.getContext();
ValueStack stack = context.getValueStack();
//
stack.set(“itcast”, “itcastitheima”);
//
(2)获取值栈对象,调用push方法(String对象)
ActionContext context = ActionContext.getContext();
ValueStack stack = context.getValueStack();
//
stack.set("itcast", "itcastitheima");
//
//
stack.push("abcd");
(3*最常用)再action中定义变量,生成变量的get方法
private String name;
public String getName() {
return name;
}
@Override
public String execute() throws Exception {
name = " ";
//第三种方法可以减少空间浪费
从值栈中获取数据
1 使用struts2的标签+ognl表达式获取值栈数据
<s:property value=”ognl表达式”/>
获取对象的值:
<br/>
<s:property value="user.username"/>
<s:property value="user.password"/>
<s:property value="user.address"/>
OGNL的 ‘#’ 和 ‘%’ 的使用
<!-- 获取context里面数据,写ognl时候,首先添加符号
#context的key名称.域对象名称
-->
<%-- <s:property value="#request.req"/> --%>
1 在struts2标签中表单标签
(1)在struts2标签里面使用ognl表达式,如果直接在struts2表单标签里面使用ognl表达式不识别,只有%之后才会识别。
<s:textfield name="username" value="%{#request.req}"></s:textfield>
Struts2拦截器