Struts2访问Web元素

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

取得Map类型request,session,application,真实类型 HttpServletRequest, HttpSession, ServletContext的引用:
	
  • 前三者:依赖于容器
  • 前三者:IOC
  • (只用这种)
  • 后三者:依赖于容器
  • 后三者:IOC
  • 用户名: 密码:
    Strust.xml /user_login_success.jsp


     

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

    第一种方式:(忘记)

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

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

    request = (Map)ActionContext.getContext().get("request");
    		session = ActionContext.getContext().getSession();
    		application = ActionContext.getContext().getApplication();
    
    public class LoginAction1 extends ActionSupport {
    	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();
    	}
    	public String execute() {
    		request.put("r1", "r1");//这里就不能用setAttribute()了,因为这里是Map类型的。用put
    		session.put("s1", "s1");
    		application.put("a1", "a1");
    		return SUCCESS; 
    	}
    }
    	request = (Map)ActionContext.getContext().get("request");
    ActionContext.getContext()
    


     

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

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

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

    request = (Map)ActionContext.getContext().get("request");
    		session = ActionContext.getContext().getSession();
    		application = ActionContext.getContext().getApplication();
    拿到我们的request,response,application。
    User_login_success.jsp
    
    	User Login Success!u
     | <%=request.getAttribute("r1") %> 
     | <%=session.getAttribute("s1") %> 
     | <%=application.getAttribute("a1") %> 
     	 
    	
    	
    	
    
    


     

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

     

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

    第二种访问request里面的值:/>

    第二种是用标签的方式取值,查看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.

    import org.apache.struts2.interceptor.ApplicationAware;
    import org.apache.struts2.interceptor.RequestAware;
    import org.apache.struts2.interceptor.SessionAware;
    public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware  {
    	//第二种方式区别于第一种方式的不同点是:第一种方式还要在构造函数中进行“取值”,第二种方式直接就能用了!!这个就是IOC(控制反转)的设计思想,依赖注入DI
    private Map request;
    	private Map session;
    	private Map application;
    		public String execute() {
    		request.put("r1", "r1");
    		session.put("s1", "s1");
    		application.put("a1", "a1");
    		return SUCCESS; 
    	}
    	public void setRequest(Map request) {
    		this.request = request;
    	}
    	public void setSession(Map session) {
    		this.session = session;
    	}
    	public void setApplication(Map application) {
    		this.application = application;
    	}
    }
    


     

    第二种方式实现了三个接口,这三个接口分别要求你一定要实现三个对应的方法。”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.

     

    你可能感兴趣的:(Struts2,笔记)