Struts2学习笔记(四)

来源:互联网 发布:弱矩阵型 项目经理 编辑:程序博客网 时间:2024/06/13 11:14

1.在struts2中,如何通过action传值?如有

<action name="user" class="com.bjsxt.action.UserAction"><result type="redirect">/user_success.jsp?t=${type}</result><!--这是ognl表达式--></action>
而在user_success.jsp接收传值时如下:

<body>from valueStack:   <s:property value="t" />from actionContext:   <s:property vakue="#parameters.t"></body>
结果为从valueStack取不到值,actionContext可以取到。
那么可得出结论:
若想接收从结果集里传递的参数,需要从actionContext(ac容器)获取,即需要在前边加“#作用域”,并且这种方式只适合于result type为redirect,即客户端跳转时才需要传递参数,为dispatcher时不需要。

2.ognl表达式${}是从value stack中取值,虽然这跟el表达式很像,但不是。

3.struts配置文件中的package name属性不是解决重名问题的,而是用来实现继承,namespace才是用来解决重名的。如一个项目的前后台可以这样分

<package name="front" namespace="/front" extends="struts-default"><package name="back" namespace="/back" extends="struts-default">
这样在两个包里都有TestAction时就可以在url中用"/front/test"或“/back/test”区分。另外继承时也可以用extends="front"表示继承自前台,默认继承是struts-default.若父包里有公共的拦截器或其他,子包也可以用。但子包的action不能和父包的相同。

4.ognl表达式可以直接获取value stack中的内容,但前提是要在实体类内添加get/set方法。如

username=<s:property value="username">
ognl表达式指的是value里边的内容,s:property是标签。

5.#,%{}在ognl表达式中的作用
#:从actionContext中取值(ac容器获取),前边要加#,相当于ActionContext.getContext().即#是取得ActionContext的值
%:%{#username}百分号的作用就是强制将大括号中的值作为ognl表达式(即将原本的文本属性解析为ognl,对于本来就是ognl的属性不起作用)。以后在比较${}到底是el还是ognl,可以用这个判断。一旦出错了,在往ognl表达式前边加%{}。

6.自定义拦截器不重要,只要理解就行。它有两种实现方式:

①实现一个接口interceptor②继承一个类AbstractInterceptor。

因为我们的大部分需求struts2都已经封装好了。自定义时只要模仿官方的代码就行。举一个例子

public class MyInterceptor implements Interceptor {public void destroy() {}public void init() {}public String intercept(ActionInvocation invocation) throws Exception {long start = System.currentTimeMillis();String r = invocation.invoke();long end = System.currentTimeMillis();System.out.println("action time = " + (end - start));return r;}}
然后在struts.xml中配置

<package name="default" namespace="/" extends="struts-default"><interceptors><interceptor name="my" class="com.bjsxt.interceptor.MyInterceptor"></interceptor></interceptors><action name="test" class="com.bjsxt.action.TestAction"><result>/test.jsp</result><interceptor-ref name="my"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref><!--defaultStack是默认的,虽然有了自定义的,这个还必须引入--></action></package>
拦截器类只有一个对象实例,即采用单例模式,所有引用该拦截器的action都共享这一拦截器的实例,它体现的编程思想就是AOP,面向切面编程(在spring会提到)

关于拦截器,还可以应用到权限控制。以前判断某人有没有访问jsp页面的权限,需要在jsp页面头添加session里有没有用户的判断,如果有多个页面,则判断需要添加多次。这时要使用拦截器的话,只需要查看要访问的地址在数据库中是否能被访问即可达到拦截目的。而这种权限控制有专门的框架——acegi(也就是spring security)

7.拦截器(interceptor)和过滤器(filter)区别
①过滤器属于web容器,可以拦截一切请求,包括action、servlet、jsp、html等
②拦截器属于struts2框架,只能拦截action,无法拦截jsp
③过滤器内部采用函数回调来实现。拦截器采用动态代理来实现。

8.类似于

<s:textfield label="用户名" name="uname"></s:testfield>
这样的叫UI标签,在实际开发中并不常用。因为有的UI标签带有样式,可能和整体的样式不统一。

9.struts2的UI标签中,属性分为两类①默认ognl执行②默认字符串执行。如:

<s:textfield label="用户名" name="uname"></s:testfield>
中的label就默认以string执行。若改为

<s:textfield label="getText('msg')" name="uname"></s:testfield>
原意是让获取msg的内容,但仍会按照字符串处理,原样显示。此时就必须加%{},变成

<s:textfield label=%{"getText('msg')"} name="uname"></s:testfield>
才能达到原意。

10. ActionContext对象是什么,里面包括了哪些信息?ActionContext的设计为开发带来了什么好处? 

ActionContext是action执行的上下文数据环境,即ac容器,包括request,session,application,parameter,attr,action
actionContext采用threadLocal模式, 为我们共享信息, 这样我们可以在线程的任何地方获取到想要的数据。好处就是结合ognl表达式,获取信息更加方便。
11.通过属性驱动注入值时,需要把set/set方法写好,并且此时在页面要使用类似于user.name等属性,而不只是写一个name,这样struts2会找不到属性

12.对于删除前需要确认,可以用类似于下边的

<input type="button" value="删除" onclick="window.confirm('确定要删除?')">