Struts2_14_Struts2访问Web元素

来源:互联网 发布:淘宝指数网站 编辑:程序博客网 时间:2024/05/19 17:56

后台的Action跟我们前台的页面来通讯的时候,由于它拿不到request,sessionservletContext比如当我们有人登陆了,我们要在session中设一个值,表示它登陆了,但是如果你Action访问不到session,你如何把相关的数据设到session里面,response不用访问它,因为我们的结果是通过result返回的。

[html] view plaincopyprint?
  1. 取得Map类型request,session,application,真实类型 HttpServletRequest, HttpSession, ServletContext的引用:  
  2.     <li>前三者:依赖于容器</li>  
  3.     <li>前三者:IOC</li> (只用这种)  
  4.     <li>后三者:依赖于容器</li>  
  5.     <li>后三者:IOC</li>  
  6. <form name="f" action="" method="post">  
  7. 用户名:<input type="text" name="name"/>  
  8. 密码:<input type="text" name="password"/>  
  9. <input type="button" value="submit1" onclick="javascript:document.f.action='login/login1';document.f.submit(); " />  
  10. <input type="button" value="submit2" onclick="javascript:document.f.action='login/login2';document.f.submit();" />  
  11. <input type="button" value="submit3" onclick="javascript:document.f.action='login/login3';document.f.submit();" />  
  12. <input type="button" value="submit4" onclick="javascript:document.f.action='login/login4';document.f.submit();" />  
  13. </form>  
  14. </body>  
  15. Strust.xml  
  16. <struts>  
  17.     <constant name="struts.devMode" value="true" />  
  18.     <package name="login" extends="struts-default" namespace="/login">  
  19.         <action name="login* " class="com.bjsxt.struts2.user.action.LoginAction{1} ">  
  20.             <result>/user_login_success.jsp</result>  
  21.         </action>  
  22.     </package>  
  23. </struts>  


 

document.f就取到form了,.action='login/login1'也就是把它的actionJavaScript动态地指定,然后当你按完这个按钮之后用document.f.submit()动态submint

第一种方式:(忘记)

取值的方法:可以在构造方法LoginAction1里面取值,也可以在execute方法取值。

就是说:下面三行“取值”代码可以写在任意两个方法里面!

[java] view plaincopyprint?
  1. request = (Map)ActionContext.getContext().get("request");  
  2.         session = ActionContext.getContext().getSession();  
  3.         application = ActionContext.getContext().getApplication();  
  4.   
  5. public class LoginAction1 extends ActionSupport {  
  6.     private Map request;  
  7.     private Map session;  
  8.     private Map application;  
  9.     public LoginAction1() {  
  10. //取值  
  11. request = (Map)ActionContext.getContext().get("request") ;  
  12.         session = ActionContext.getContext().getSession();  
  13.         application = ActionContext.getContext().getApplication();  
  14.     }  
  15.     public String execute() {  
  16.         request.put("r1""r1");//这里就不能用setAttribute()了,因为这里是Map类型的。用put  
  17.         session.put("s1""s1");  
  18.         application.put("a1""a1");  
  19.         return SUCCESS;   
  20.     }  
  21. }  
  22.     request = (Map)ActionContext.getContext().get("request");  
  23. ActionContext.getContext()  


 

Context直接翻译过来是:上下文,在西方人写的程序特别多,但是中国人很少用,因为不理解它是什么东西;Context就是当前执行的环境,就比如同学们在这里学习,实际上是有一个Context,代表了你周围的情况,机器的情况,空调的情况,等等,它会把周围环境帮你封转到Context这个对象里面,当你想访问这些东西的时候,通过Context去取。

原来学习过得ServletContext代表的就是servlet的运行环境,原来我们写程序就用ServletContext拿到各种各样的配置,ActionContext也就是Action周边运行的情况,Action运行的时候,首先接收到请求接收到requestresponse等等后面再接着调你的处理过程,Action处理的过程中,比如说那些配置怎么配的,执行环境怎么样等等都要通过ActionContext来拿。

原先我们在页面中都是通过HttpResquest,HttpResponse拿到我们的值,现在我们通过

[html] view plaincopyprint?
  1. request = (Map)ActionContext.getContext().get("request");  
  2.         session = ActionContext.getContext().getSession();  
  3.         application = ActionContext.getContext().getApplication();  
  4. 拿到我们的request,response,application。  
  5. User_login_success.jsp  
  6. <body>  
  7.     User Login Success!u  
  8. <s:property value="#request.r1"/> | <%=request.getAttribute("r1") %>   
  9. <s:property value="#session.s1"/> | <%=session.getAttribute("s1") %>   
  10. <s:property value="#application.a1"/> | <%=application.getAttribute("a1") %>   
  11.     <s:property value="#attr.a1"/>   
  12.     <s:property value="#attr.s1"/>  
  13.     <s:property value="#attr.r1"/>  
  14.     <s:debug></s:debug>  
  15. </body>  


 

我们的后台放了requestsessionapplication但是这三个东西都是map,但是它反馈到前台之后居然用requestsessionapplication可以拿到,所以struts2一定帮我们在MapHttpRequest之间建立某种联系,对于我们自己设定的map类型的request这里面的属性在处理的过程中会全都复制到Http对象里边去。

 

第一种访问request里面的值:<%=request.getAttribute("r1") //原始的方式

第二种访问request里面的值:<s:property value="#request.r1"/>

第二种是用标签的方式取值,查看debug模式,

Stack Context

These items are available using the #key notation

。。。略

These items are available using the #key notation :下面的items是供你使用的,只要你用#key访问它,所以你用#request就可以访问到request

上面的Value Stack是可以直接拿的

ActionContext要拿的话加#就能拿。

 

第二种方式这种方式是最常用的,其他的都可以忘记

其实request我们也很少去拿它,因为我们Action的成员变量默认会起到request的作用,它自己会放到valueStack里面, valueStack本身就是放到request里面,所以根本不用去拿request.

[java] view plaincopyprint?
  1. import org.apache.struts2.interceptor.ApplicationAware;  
  2. import org.apache.struts2.interceptor.RequestAware;  
  3. import org.apache.struts2.interceptor.SessionAware;  
  4. public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware  {  
  5.     //第二种方式区别于第一种方式的不同点是:第一种方式还要在构造函数中进行“取值”,第二种方式直接就能用了!!这个就是IOC(控制反转)的设计思想,依赖注入DI  
  6. private Map<String, Object> request;  
  7.     private Map<String, Object> session;  
  8.     private Map<String, Object> application;  
  9.         public String execute() {  
  10.         request.put("r1""r1");  
  11.         session.put("s1""s1");  
  12.         application.put("a1""a1");  
  13.         return SUCCESS;   
  14.     }  
  15.     public void setRequest(Map<String, Object> request) {  
  16.         this.request = request;  
  17.     }  
  18.     public void setSession(Map<String, Object> session) {  
  19.         this.session = session;  
  20.     }  
  21.     public void setApplication(Map<String, Object> application) {  
  22.         this.application = application;  
  23.     }  
  24. }  


 

第二种方式实现了三个接口,这三个接口分别要求你一定要实现三个对应的方法。”aware”知道,得知的意思,所以实现了这几个接口之后,你就应该知道request的存在了,既然知道存在了,就应该把它保存起来了。所以一定有人传递给你了,这里就体现了IOC依赖注入的设计模式。

1.       一个请求过来Strutsnew出一个Action出来;2.new完之后它会检查Action是否实现了RequestAware接口.3如果Action实现了RequestAware接口,就可以调用RequestAware接口的setRequest()方法.

Struts2是一个filter开始的,部署在servlet容器里的filter当然可以拿到HttpRequest对象,然后会把里面的内容拿出来放到一个Map,也起一个名字叫request。也就是把原始类型HttpRequest转成Map类型的request.

总结:现在的Request由容器管理了----IOC

这种方式是最常用的,其他的都可以忘记。而且其实request我们也很少去拿它,因为我们Action的成员变量默认会起到request的作用,它自己会放到valueStack里面, valueStack本身就是放到request里面,所以根本不用去拿request.

来源: <http://blog.csdn.net/zsm653983/article/details/8039292>

 

 

访问web元素 

struts.xml:
<package name="login" extends="struts-default" namespace="/login">
        <action name="login*" class="com.bjsxt.struts2.user.action.LoginAction{1}">
            <result>/user_login_success.jsp</result>
        </action>
    </package>
 

jsp:
<form name="f" action="" method="post">
用户名:<input type="text" name="name"/>
密码:<input type="text" name="password"/>
<br />
<input type="button" value="submit1" onclick="javascript:document.f.action='login/login1';document.f.submit();" />
<input type="button" value="submit2" onclick="javascript:document.f.action='login/login2';document.f.submit();" />
<input type="button" value="submit3" onclick="javascript:document.f.action='login/login3';document.f.submit();" />
<input type="button" value="submit4" onclick="javascript:document.f.action='login/login4';document.f.submit();" />
</form>
 

result jsp:
    User Login Success!
    <br />
    <s:property value="#request.r1"/> | <%=request.getAttribute("r1") %> <br />
    <s:property value="#session.s1"/> | <%=session.getAttribute("s1") %> <br />
    <s:property value="#application.a1"/> | <%=application.getAttribute("a1") %> <br />
    <s:property value="#attr.a1"/><br />
    <s:property value="#attr.s1"/><br />
    <s:property value="#attr.r1"/><br />
    <s:debug></s:debug>
    <br />

注意:#attr表示模糊查找属性值,在request>session>application三个范围中查找属性。

 

 

访问request等三种方式: 
1、从上下文中取得,直接赋值 
    public LoginAction1() { 
        request = (Map)ActionContext .getContext().get("request"); 
        session = ActionContext.getContext().getSession(); 
        application = ActionContext.getContext().getApplication(); 
    } 


2、 实现RequestAware,SessionAware, ApplicationAware三个接口,依赖注入(控制反转)   最常用 
public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware {
    private Map<String, Object> request;
    private Map<String, Object> session;
    private Map<String, Object> application;
    
    //DI dependency injection
    //IoC inverse of control
    public String execute() {
        request.put("r1", "r1");
        session.put("s1", "s1");
        application.put("a1", "a1");
        return SUCCESS; 
    }

    @Override
    public void setRequest(Map<String, Object> request) {
        this.request = request;
    }

    @Override
    public void setSession(Map<String, Object> session) {
        this.session = session;
    }

    @Override
    public void setApplication(Map<String, Object> application) {
        this.application = application;
    }
}
 

3、直接从ServletActionContext中获取 
    public LoginAction3() {
        request = ServletActionContext .getRequest();
        session = request.getSession();
        application = session.getServletContext();
    }
 

4、实现ServletRequestAware接口,实现setServletRequest方法 
public class LoginAction4 extends ActionSupport implements ServletRequestAware {
    private HttpServletRequest request;
    private HttpSession session;
    private ServletContext application;
    
    public String execute() {
        request.setAttribute("r1", "r1");
        session.setAttribute("s1", "s1");
        application.setAttribute("a1", "a1");
        return SUCCESS; 
    }
    @Override
    public void setServletRequest(HttpServletRequest request) {
        this.request = request;
        this.session = request.getSession();
        this.application = session.getServletContext();
    }
    
}
 

结论: 
取得Map类型request,session,application,真实类型 HttpServletRequest, HttpSession, ServletContext的引用: 
1.前三者:依赖于容器 
2.前三者:IOC (只用这种) 
3.后三者:依赖于容器 
4.后三者:IOC

来源: <Struts2 学习笔记6--访问web元素-模块包含 - shaxianwei - ITeye技术网站>

 

0 0
原创粉丝点击