Java struts2

1.结果页面配置
(1)全局结果页面
解决在不同的action返回相同的字符串,且跳转的页面相同时,需要重复代码的问题。通过<global-result><result name = "hello">/hello.jsp</result></golbal-result>,这个全局结果在当前package生效。
(2)局部结果页面
在action中配置的result为局部结果,如果同时有全局和局部,以局部为准。
(3)result标签的type属性
指定如何跳转到路径中去。可取值有redirect、dispatcher、chain(一般不用)、redirectAction,前两个跳转到页面,后两个跳转到action,默认为dispatcher。
<result name="add" type = "redirectAction">hello</result>,其中hello为action的name。
2.在action中获取表单提交方式
(1)使用ActionContext类获取
Map<String, Parameter> map = ActionContext.getContext().getParameters();
(2)使用ServletActionContext类获取
HttpServletRequest request = ServletActionContext.getRequest();
通过该类的静态方法可以得到Servlet的request、session、response和ServletContext对象。
(3)使用接口注入方式获取(一般不用)
实现ServletResultAware接口,重写setServletRequest(HttpServletRequest request)方法,提供私有request属性。
private HttpServletRequest request;
@Override
public void setServletRequest(HttpServletRequest request){
this.request = request;
}
然后在方法中就可以使用request了
3.struts2提供的表单提交方式
(1)属性封装
直接把表单提供的数据封装到action的属性中。action中的成员变量名字包含和表单中input的name,并为这些变量生成set方法,当表单提交后就可以直接使用这些变量了。
(2)模型封装(常用)
可以直接将表单中的数据封装到实体类的对象中。首先实现ModelDriven<T>接口,其中T为实体类类型,实现getModel方法(返回实体类对象),在action中创建实体类对象。要求实体类中的属性必须包含表单中input的name。
注意:不能同时使用模型封装和属性封装来获取同一个表单的数据,若同时使用只会进行模型封装!!!
(3)表达式封装
通过在jsp中的表达式将表单中的数据封装到实体类的对象中。首先声明实体类对象,然后为其创建set和get方法,最后将input中的name设置为”对象名.属性名“的格式。
4.struts2获取数据封装到集合中
(1)List封装
步骤:在action中定义List对象——为List对象生成get和set方法——页面中通过表达式进行封装。表达式写法name = "list[0].username"
(2)Map封装
步骤:在action中定义Map对象——为Map对象生成get和set方法——页面中通过表达式进行封装。表达式写法name = "map['keyname'].username"
5.表达式封装和模型驱动比较
相同点:都可以将数据封装到对象中
不同点:在一个action中模型驱动只能将数据封装到一个实体类的对象中,如果需要为多个对象封装数据可以使用表达式封装。
6.ognl表达式和值栈
在struts2中用来操作值栈中的内容,与struts2的标签一起使用;ognl不是struts2的一部分,是一个单独的项目,可以单独使用。
(1)struts2标签库的使用
<%@ taglib uri = "/struts-tags" prefix = "s" %>
(2)值栈是什么
struts2内置的一种存储机制,类似jsp的域对象。可以在action中将数据放入值栈,在页面中取出来。
(3)servlet和action的区别
Servlet:只在访问时创建一次,单例对象
action:每次访问都重新创建,多例对象
(4)值栈储存位置
存储在action对象中,每个action中都有一个值栈对象,所以现有action对象才有值栈对象。
(5)获取值栈对象
i:通过ActionContext获取
ActionContext.getContext.getValueStack();
(6)值栈的结构
分为root和context两部分,root继承arraylist类,context实现map接口;一般使用root里面的数据。
通过struts2的标签<s:debug>可以查看值栈的结构和其中的数据。
(7)向值栈中放入数据
i:set方法——在值栈中添加一个Map集合
ii:put方法——在值栈中添加一个数据对应的类型
iii:在action中声明变量,并提供get方法——直接放在action中,不需开辟额外空间(常用)
(8)在页面中从值栈中获取数据
i:获取字符串
<s:property value = "str"/>
ii:获取对象的值
<s:property value = "obj.field"/>
iii:获取list中的值
--<s:property value = "list[0].username" />
--<s:iterator value = "list">
 <s:property value = "username"/>
</s:iterator>
--<s:iterator value = "list" var = ""user>
 <s:property value = "#user.username"/>
</s:iterator>
该种方式会将取出的list对象临时放在context中,取出时需要加上特殊符号#,能提高取值效率
7.为什么通过EL表达式可以取得值栈中的值?
EL表达式可以取得域对象中的值,在底层对request的getAttrbute方法有增强,如果在与对象中没有找到指定值的话就会在值栈中去寻找,找到的话会将该值放入与对象中,在返回该值。
8.OGNL中#、%的使用
(1)#的使用
获取context中的数据
<s:property value = "#request.req"/>
(2)%的使用
在struts2标签库中除了s:property的其他标签中如果需要使用OGNL表达式的话需要加上%,例如:<s:textfield name = "username" value = "%{#request.req}"></s:textfield>
9.拦截器的使用
(1)什么是拦截器
拦截器中封装了框架提供的很多功能
(2)拦截器什么时候执行
在创建action对象之后,在action中的方法执行之前。
(3)拦截器的底层原理
主要使用AOP思想和责任链模式
AOP:面向切片编程,不通过修改源代码为增加方法功能,应用场景:功能模块化
责任链模式:类似于过滤链,执行一系列操作,当前一个操作执行完后需要放行才能执行下一个操作。
(4)AOP思想和责任链模式在拦截器中的使用
通过AOP思想在action的方法前添加各个拦截器,以责任链模式执行各个拦截器。
(5)拦截器与过滤器的区别
过滤器可以过滤任意内容(html、jsp、servlet、图片路径),而拦截器只会拦截action。
(6)自定义拦截器
i:继承MethodFilterInterceptor类
ii:重写doIntercept方法
return invocation.invoke()代表放行
return "";代表直接放回
iii:配置拦截器(注册拦截器)
---声明拦截器
在action所在的package标签下,添加<interceptors>标签
<interceptors>
 <interceptor> name = "loginintercept" class = "拦截器的全限定名"></interceptor>
</interceptors>
---在action中使用自定义拦截器
<interceptor-ref name = "loginintercept"></interceptor-ref>
这样的话会对当前action中所有方法进行拦截,通过以下配置可以不对某些方法拦截
<interceptor-ref name = "loginintercept">
 <param name = "excludeMethods">不拦截的方法名</param>,其中excludeMethods为固定值。
</interceptor-ref>
---如果在action中配置自定以拦截器,默认拦截器不会执行;解决方案:把默认拦截器手动使用
<interceptor-ref name = "defaultStack"></intereptor-ref>
10.struts2常用标签

posted on 2018-11-27 20:12  -Yoda-  阅读(80)  评论(0编辑  收藏  举报

导航