首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

struts2 学习初记(3)

2012-12-21 
struts2 学习小记(3)1)访问Web元素取得Map类型request,session,application,真实类型 HttpServletRequest,

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这个属性是用于存储传入的参数。所以可以取出。






热点排行