Struts2基础部分

1、struts2是一个mvc框架,是struts1与xwork的结合体
2、struts2的配置文件
1、文件类型
最常用的配置文件有
default.properties
struts.i18n.encoding=UTF-8 设置默认的编码字符集
struts.multipart.maxSize=2097152 默认文件上传的大小
struts.action.extension=action 默认的扩展名
struts.devMode = false 是否是开发模式
struts.ui.theme = simple 配置struts2的简单样式
struts.custom.i18n.resources 自定义资源文件
struts-default.xml
bean的配置用于静态注入
package
resulttype
interceptor
struts-plugin.xml

struts.xml
用户最常用的配置文件
2、详细描述
1、配置文件中package的机制
1、继承
在配置文件中,package元素有一个属性为name,name的值是唯一的,是包的名称
现在有如下的配置
<package name="a" extends="struts-default">
</package>
<package name="b" extends="a"></package>
这样包b中就有了包a的内容
所以这样也可以推出:
包a拥有struts-default包中的内容
2、命名空间
在package中有一个属性为namespace
<package name="c" namespace="/user" extends="struts-default">
<action name="userAction_*">
</package>
这个时候在浏览器发出的请求:
http://localhost:8080/struts2/user/userAction_a.action可以找到action
http://localhost:8080/struts2/user/a/b/userAction_b.action可以找到action
http://localhost:8080/struts2/userAction_c.action不能够找到action
struts2容器在找action时,会采用这样的策略:
第一个URL正好和命名空间匹配,所以能够找到
第二个URL,当查找user/a/b时,并没有找到相应的action,则会查找user/a,如果找不到则会找user,这样就能找到了
第三个URL,当查找userAction时,并没有找到,因为userAction最低层的路径是user
2、action的配置
在action中,可以采用通配符的配置方式进行
<action name="userAction_*" method="{1}" class=".....UserAction">
<action name="*_*" method="{2}" class="cn.ithema03.struts.{1}">
3、result的配置
1、每一个result代表一个结果集,result中属性name的值和action中方法的返回值保持一致
2、struts2中最常用的结果集是dispatcher,redirect,redirectAction(见struts-default.xml内容)
3、result元素中type属性的值为结果集类型
4、在action的配置中,class属性可以不写,如果不写默认执行ActionSupport中execute中的内容,从struts-default.xml文件中可以看出
<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
5、拦截器的配置
1、interceptor只能配置在package中,所以不能配置全局的拦截器
2、struts2中关于interceptor有两个概念:interceptor,interceptors
这两个内容的声明都放在interceptors标签中
<interceptors>
//声明一个interceptor
<interceptor name="imageInterceptor" class="cn.itheima03.struts2.interceptor.MyInterceptor"></interceptor>
//声明一个interceptor stack
<interceptor-stack name="myInterceptor">
//自定义的interceptor
<interceptor-ref name="imageInterceptor"></interceptor-ref>
//struts2默认的执行的interceptor stack
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
//引用myInterceptor的interceptor stack
<default-interceptor-ref name="myInterceptor"></default-interceptor-ref>
3、从上述的配置可以说明:
1、在struts2内部有默认的执行的interceptor stack
<default-interceptor-ref name="defaultStack"/>
如果一个interceptor不在这个interceptor stack中,那么将不执行该interceptor
2、可以把默认的interceptor stack变成自己的interceptor stack
3、在interceptor stack中可以指向(ref)一个interceptor,也可以指向(ref)一个interceptor stack
4、如果一个package要用到另外一个package中的interceptor,只需要通过package的继承机制就可以了
3、属性驱动
1、概念
可以利用属性驱动获取页面表单元素的内容
2、步骤
1、在action中声明属性,属性的名称和页面元素中name属性的值保持一致
2、action中的属性必须有set和get方法
4、模型驱动
1、如果页面上元素内容太多,用属性驱动实现,action中代码就会很庞大,这个时候可以考虑用模型驱动来实现
2、步骤
1、action实现一个接口ModelDriver
2、在action中声明一个属性,该属性会封装页面中的数据,并且用new的方法给该属性创建对象
3、填充接口中的方法getModel,返回该属性的值

public class UserAction implements ModelDriver<User>{
private User model = new User();
public User getModel(){
return this.model;
}
}

5、在struts2中action是多实例的,每一次请求都会为action创建一个对象
6、valueStack
1、valueStack是struts2中存放数据的一种数据结构
2、valueStack分为两种内存结构:对象栈、map栈
3、可以通过以下几种方法获取valueStack
1、ValueStack valueStack = ActionContext.getContext().getValueStack();
2、ValueStack valueStack2 = ServletActionContext.getValueStack(ServletActionContext.getRequest());
3、ValueStack valueStack3 = (ValueStack)ServletActionContext.getRequest().getAttribute("struts.valueStack");
以上三种方法获取的valueStack都是同一个对象
4、对map栈的操作
1、request,response,parameters,application等都在map栈中,分别的数据结构为
{"request",RequestMap} {"session",SessionMap} {"application",ApplicationMap}
2、可以通过如下方法把数据存放在request,session,application域中
ServletActionContext.getRequest().setAttribute("msg_request", "msg_request");
ServletActionContext.getServletContext().setAttribute("msg_application", "msg_application");
ServletActionContext.getRequest().getSession().setAttribute("msg_session", "msg_session");
3、可以通过如下方法吧数据直接存放在map栈中
ActionContext.getContext().put("aaaa", "aaaaa");
valueStack.getContext().put("bbb", "bbb");
5、对对象栈的操作
1、把一个数据存放在对象栈的尾部
valueStack.getRoot().add("aaaaa");
2、把一个数据存放在对象栈的栈顶
valueStack.getRoot().add(0,"adsf");
valueStack.push("rtrt");
3、把一个数据封装成map,把map放入到栈顶
valueStack.set("aaasdf", "asfd");
4、获取对象栈栈顶的元素
valueStack.peek();
valueStack.getRoot().get(0);
5、移除对象栈栈顶的元素
valueStack.getRoot().remove(0);
valueStack.pop();
7、ognl表达式
1、把一个数据放入到valueStack中,在页面上可以利用ognl表达式把该数据提取出来
2、ognl表达式总体的规则:如果一个数据存放在map栈中,则加#访问,如果一个数据在对象栈中,则不用加#访问
3、详细说明
1、s:property标签
1、如果没有value属性,则默认输出对象栈的栈顶的元素
2、<s:property value="#session.aa">输出map栈中session域中aa的值
2、s:iterator标签
1、迭代遍历集合
1、集合的类型:List,Set,Map,Object[]
2、value属性的值能直接跟ognl表达式
3、当前正在迭代的元素在栈顶存放
4、要熟练使用该标签迭代二重或者三重集合
2、属性var="a"表示当前正在迭代的元素在map栈中存放一份,key值为"a"
3、当迭代map的时候,当前正在迭代的元素是Entry
<s:iterator value="#map">
<s:property value="key"/>,<s:property value="value.pid"/>
<s:property value="key"/>,<s:property value="value.username"/>
</s:iterator>
4、属性status,代表当前迭代元素的一些性质
int getCount() 返回当前迭代的元素个数
int getIndex() 返回当前迭代元素的索引
boolean isEven() 返回当前迭代元素的索引是否是偶数
boolean isOdd() 返回当前迭代元素的索引是否是奇数
boolean isFirst() 返回当前迭代元素是否为第一个元素
boolean isLast() 返回当前迭代元素是否为最后一个元素
3、s:debug标签可以输出valueStack的内存快照
8、struts2的校验机制
struts2提供了两种校验机制
代码校验
步骤:
1、在页面上
<s:textfield name="username" label="用户名"></s:textfield>
<s:textfield name="password" label="密码"></s:textfield>
<s:fielderror fieldName="username"></s:fielderror>

说明:
<s:fielderror fieldName="username"></s:fielderror>
在这里fileldName="username"会把后台username的报错信息显示到前台
<s:fielderror></s:fielderror>
把所有的字段的错误信息显示到前台的页面中
2、在action中(action必须继承ActionSupport类,该类实现了Validateable接口),可以有两种写法
1、重写validate方法就可以了
public void validate() {
/**
* 验证用户名和密码是否为空
*/
if("".equals(this.getUsername())){
this.addFieldError("username", "用户名不能为空");
}
if("".equals(this.getPassword())){
this.addFieldError("password", "密码不能为空");
}
}
2、如果action中的几个方法都需要校验,在action中必须写这样的方法
例如:对如下方法进行校验
public String testValidate(){

}
那么校验方法为:(validate+被校验的方法名称(方法的第一个字母大写))
public void validateTestValidate(){
//校验逻辑
}
说明:
this.addFieldError("username", "用户名不能为空");该方法中username和页面上的fieldName字段对应,而value的值就是报错信息
3、在struts2的配置文件中
如果校验没有通过,则指向input所指向的页面
<result name="input">validate/validate.jsp</result>
而在这个页面中,<s:fielderror fieldName="username"></s:fielderror>该标签将显示
this.addFieldError("username", "用户名不能为空");的错误信息
xml校验
9、action的说明
1、当前请求的action的方法别用get开头,会有安全性的隐患

posted @ 2014-02-27 18:06  教程学习  阅读(85)  评论(0)    收藏  举报