struts2 学习小记(3)
1)访问Web元素
取得Map类型request,session,application,真实类型 HttpServletRequest, HttpSession, ServletContext的引用:
1.前三者:依赖于容器
2.前三者:IOC (只用这种)
3.后三者:依赖于容器
4.后三者:IOC
方法一:ActionContext方式
一般在Action类的构造方法、或execute()方法中获取。
private Map request;
private Map session;
private Map application;
public LoginAction1() {
request = (Map)ActionContext.getContext().get("request");
session = ActionContext.getContext().getSession();
application = ActionContext.getContext().getApplication();
}
方式二:Ioc(控制反转)—推荐使用
public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware {
private Map<String, Object> request;
private Map<String, Object> session;
private Map<String, Object> application;
........
}
方式三:获取原类型
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
public LoginAction3() {
request = ServletActionContext.getRequest();
session = request.getSession();
application = session.getServletContext();
}
方式四:获取原类型-控制反转
public class LoginAction4 extends ActionSupport implements ServletRequestAware {
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
this.session = request.getSession();
this.application = session.getServletContext();
}
2)Struts2配置文件模块化包含(include)
<include file="login.xml" />
3)默认的Action
当用户访问的namespace下一个不存在的Action,则会将使用默认的Action。
使用<default-action-ref name=”name”>标签 其中 name属性指向下面已经定义的Action名称了。
<struts>
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index"></default-action-ref>
<action name="index">
<result>/default.jsp</result>
</action>
</package>
</struts>
当前访问namespace=”/”下不存在的Action时,则返回自动转到访问/default.jsp页面。
Struts2-Result
1)Result类型 (type)
1、dispatcher
运用服务器跳转 jsp forward
不可以是Action,只可以跳转到视图
2、redirect
客户端跳转(重定向)-url发生变化
不可以是Action,只可以跳转到视图
3、chain
跳转到Action (forward action)
可以动用到Action
在访问Action时,Action前面不要加”/”
4、redirectAction
客户端跳转到Action――-url发生变化
5、freemarker
6、httpheader
发送一个http头
7、stream
下载
8、velocity
9、xslt
10、plaintext
返回页面的源码
11、titles
把页面分成几块,每个页面都可以动态的指定
<struts>
<constant name="struts.devMode" value="true" />
<package name="resultTypes" namespace="/r" extends="struts-default">
<action name="r1">
<result type="dispatcher">/r1.jsp</result>
</action>
<action name="r2">
<result type="redirect">/r2.jsp</result>
</action>
<action name="r3">
<result type="chain">r1</result>
</action>
<action name="r4">
<result type="redirectAction">r2</result>
</action>
</package>
</struts>
注:当访问不同的namespace下的Action时,则使用如下方式:
<result type="chain">
<param name="actionName">dashboard</param>//Action名称
<param name="namespace">/secure</param>//namespace值
</result>
2)全局结果集(Globle Result)
当有多个Action使用同一个结果集时,则可以使用全局结果集(Globle Result),如下:
<global-results>
<result name="mainpage">/main.jsp</result>
</global-results>
3)动态的结果集(dynamic result)
<struts>
<constant name="struts.devMode" value="true" />
<package name="user" namespace="/user" extends="struts-default">
<action name="user" namespace="/user" extends="struts-default">
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result type="redirect">/user_success.jsp?t=${type}</result>
</action>
</package>
UserAction类:
public class UserAction extends ActionSupport {
private int type;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
@Override
public String execute() throws Exception {
return "success";
}
}
因为当执行Action后,已经将Action的成员属性写入了值堆栈了,因此可以在配置文件中使用${type}取出type的值。
但是只有Action才具有值堆栈的。Jsp是没有什么值堆栈的。因为当result重新定向到/user_success.jsp?t=${type}后,是不能从值堆栈中取出t的值。但是有ActionContext的,所以可以从中取出t的值。JSP代码如下:
<body>
User Success!
from valuestack: <s:property value="t"/><br/>
from actioncontext: <s:property value="#parameters.t"/>
<s:debug></s:debug>
</body>
注:<s:property value="t"/>取不到值,因为jsp不是一个Action没有值堆栈。
<s:property value="#parameters.t"/>可以取出t的值,因为#方式是从ActionContext中取属性值。
ActionContext堆栈中具有parameters这个属性是用于存储传入的参数。所以可以取出。