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" class="com.bjsxt.struts2.user.action.UserAction">
    <result>${r}</result>
    </action>    
    </package>
</struts>
注:${}:作用是用于在配置文件中从Value stack(值栈)中取值。注意这个成员属性必需具有
注:此处的${}不是el表达式。

public class UserAction extends ActionSupport {
private int type;
private String r;
public String getR() {
return r;
}
public void setR(String r) {
this.r = r;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
@Override
public String execute() throws Exception {
if(type == 1) r="/user_success.jsp";
else if (type == 2) r="/user_error.jsp";
return "success";
}
}


4)带参数的结果集
也就是向结果集传参数
服务器forward共享一个值栈(Value stack)
客户端跳转则不共享
例如:
<package 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这个属性是用于存储传入的参数。所以可以取出。






你可能感兴趣的:(java,struts)