实验四:Struts2_访问Web元素
后台的Action跟我们前台的页面来通讯的时候,由于它拿不到request,session,servletContext比如当我们有人登陆了,我们要在session中设一个值,表示它登陆了,但是如果你Action访问不到session,你如何把相关的数据设到session里面,response不用访问它,因为我们的结果是通过result返回的。
取得Map类型request,session,application,真实类型 HttpServletRequest, HttpSession, ServletContext的引用:
前三者:依赖于容器 前三者:IOC (只用这种) 后三者:依赖于容器
后三者:IOC
Strust.xml
第一种方式:(忘记) 取值的方法:可以在构造方法LoginAction1里面取值,也可以在execute方法取值。 就是说:下面三行“取值”代码可以写在任意两个方法里面! request = (Map)ActionContext.getContext().get(\); session = ActionContext.getContext().getSession(); application = ActionContext.getContext().getApplication(); 16 public class LoginAction1 extends ActionSupport { private Map request; private Map session; private Map application; public LoginAction1() { //取值 request = (Map)ActionContext.getContext().get(\); } public String execute() { request.put(\, \);//这里就不能用setAttribute()了,因为这里是session = ActionContext.getContext().getSession(); application = ActionContext.getContext().getApplication(); Map类型的。用put session.put(\, \); } request = (Map)ActionContext.getContext().get(\); ActionContext.getContext() Context直接翻译过来是:”上下文”,在西方人写的程序特别多,但是中国人很少用,因为不理解它是什么东西;Context就是当前执行的环境,就比如同学们在这里学习,实际上是有一个Context,代表了你周围的情况,机器的情况,空调的情况,等等,它会把周围环境帮你封转到Context这个对象里面,当你想访问这些东西的时候,通过Context去取。 原来学习过得ServletContext代表的就是servlet的运行环境,原来我们写程序就用ServletContext拿到各种各样的配置,ActionContext也就是Action周边运行的情况,Action运行的时候,首先接收到请求接收到request,response等等后面再接着调你的处理过程,Action处理的过程中,比如说那些配置怎么配的,执行环境怎么样等等都要通过ActionContext来拿。 原先我们在页面中都是通过HttpResquest,HttpResponse拿到我们的值,现在我们通过 request = (Map)ActionContext.getContext().get(\); session = ActionContext.getContext().getSession(); application = ActionContext.getContext().getApplication(); } application.put(\, \); return SUCCESS; 拿到我们的request,response,application。 User_login_success.jsp
User Login Success!u
17
我们的后台放了request,session,application但是这三个东西都是map,但是它反馈到前台之后居然用request,session,application可以拿到,所以struts2一定帮我们在Map和HttpRequest之间建立某种联系,对于我们自己设定的map类型的request这里面的属性在处理的过程中会全都复制到Http对象里边去。
第一种访问request里面的值:<%=request.getAttribute(\原始的方式 第二种访问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 18 private Map } public void setRequest(Map public void setSession(Map public void setApplication(Map } Struts2 LoginAction 1 2 3 Action总结 1. 实现一个Action最常用的方式,从ActionSupport继承 2. DMI动态方法调用 3. 通配符*{1}{2} 4. 接收参数的方法(一般用属性或者DomainModel来接收) 5. 简单参数验证addFieldError 一般不使用Struts2的UI标签 6. 访问Web元素 1) Map类型 1. IOC 19 2. 以来Struts2 2) 原始类型(忘记) 7. 包含文件配置 8. 默认action处理 实验五:Struts2_结果类型 Result类型 1. dispatcher 2. redirect 3. chain 4. redirectAction 5. freemarker 6. httpheader 7. stream 8. velocity 9. xslt 10.plaintext 11.tiles 前面四个要掌握,只要用前两个。 ResultType是chain的时候,跳转到一个Action那边去处理,如果Action是在另外一个包p1该怎么办呢? 查Struts2文档的路劲---guides----resultTypes-----chain--- 20