当前位置:首页 > 马士兵 - struts3
分析:异常处理机制较为简单,所以在此只略作说明。当登录时输入“exception”时,在LoginAction中会抛出会一个ClassNotFoundException异常,此异常我们采取的局部异常处理的方式,如果登录时输入“globla”,则会抛出Exception异常,此异常我们采取的是全局异常的处理方式,在ex包中我们继承了全局异常所在的包。提示:
三、在Action获取Scope对象
引言:在前面的Action操作中,关键就是Action中的exectue方法,但是此方法并没有request、session、application等对象作为参数,自然就不能利用这些对象来操作。下面我们建立struts2scope项目,并用四种方式来获取这些对象:
方式一、与Servlet解耦合的非IOC方式
获取的scope对象与容器无关,通过ActionContext获取。 LoginAction代码如下:
package com.asm;
public class LoginAction extends ActionSupport { }
private String username; ActionContext context; Map request; Map session; Map application;
public String execute() throws Exception { }
...省略username的get/set方法
context=ActionContext.getContext(); request=(Map) context.get(\session=context.getSession();
application=context.getApplication();
request.put(\, \属性\); session.put(\, \属性\);
application.put(\, \属性\); return SUCCESS;
struts.xml配置如下:
login.jsp内容如下:
loginSuc.jsp的主要内容如下:
${requestScope.req} ${sessionScope.ses} ${applicationScope.app}
request: <%=request.getAttribute(\) %>
session: <%=session.getAttribute(\) %>
application:<%=application.getAttribute(\) %>
分析:通过ActionContext的getContext静态方法得到ActionContext对象,然后ActionContext对象调用get方法来获取一个存储在request范围中的对象。我们使用el或通过request.getAttribute这样的方式均可以获取对象值,这说明了这些Map request对象实际是存储在request范围内的对象。
方式二、与Servlet解耦合的IOC方式 我们建立Login2Action,主要代码如下:
package com.asm;
public class Login2Action extends ActionSupport implements RequestAware,SessionAware,ApplicationAware { }
private String username; Map request; Map session; Map application;
public String execute() throws Exception { }
public void setRequest(Map
public void setSession(Map
public void setApplication(Map
...省略username的get/set方法
this.application=application; this.session=session; this.request=request;
request.put(\, \属性\); session.put(\, \属性\);
application.put(\, \属性\); return SUCCESS;
注册此Action的name为login2,随后修改登录提交为.../login2.action。便可以发布测试。说明:此方法其实和方式一很相似,只是在方式一中我们需要手动的为Map request赋值,但是在方式二中它是通过实现接口,在重写接口中的方法中完成对Map requset的赋值,所以称之IOC方式。借助此例,略谈下依赖注入与控制反转:所谓依赖注入就是一个对象自己本身的初始化是依赖其它对象。比如这里Map request这些对象会依赖struts2来给其初始化,称为依赖注入,而依赖注入的就表示,这些对象的控制权不再由此类本身掌握,而是交给了别的对象,即是控制权反转了。 强调:方式二是开发中主要用的
18
方式,应重点掌握
方式三、与Servlet耦合的非IOC方式 建立Login3Action,代码如下:
package com.asm;
public class Login3Action extends ActionSupport { }
}
...省略username的get/set方法。
request.setAttribute(\, \属性\); session.setAttribute(\, \属性\);
application.setAttribute(\, \属性\); return SUCCESS; private String username; HttpServletRequest request; HttpSession session;
ServletContext application;
public String execute() throws Exception {
request = ServletActionContext.getRequest(); session = request.getSession();
application = ServletActionContext.getServletContext();
此方法获取的纯粹的Scope对象,它与容器相关,这些Scope对象操作更强。同样只需要注册此Action并修改登录页面便可进行测试。 方式四、与Servlet耦合的IOC方式 建立Login4Action,代码如下:
package com.asm;
public class Login4Action extends ActionSupport implements ServletRequestAware,ServletContextAware{
private String username; ActionContext context; HttpServletRequest request; HttpSession session;
ServletContext application;
public String execute() throws Exception { }
public void setServletRequest(HttpServletRequest request) { }
19
context=ActionContext.getContext(); session=request.getSession();
request.setAttribute(\, \属性\); session.setAttribute(\, \属性\);
application.setAttribute(\, \属性\); return SUCCESS;
System.out.println(\测试:\+request); this.request=request;
}
public void setServletContext(ServletContext application) { }
...省略username的get/set方法
System.out.println(\测试:\+application); this.application=application;
同样只需要注册此Action并修改登录页面便可发布测试
四、OGNL与ValueStack(VS)
1.值栈入门
下面我们建立struts2ognl项目来练习ognl的使用。 步骤一、搭建strust2的开发环境
步骤二、建立LoginAction,主要代码如下:
package com.asm;
public class LoginAction extends ActionSupport{ }
private User user;
public String execute() throws Exception { }
...省略user的get/set方法
return SUCCESS;
步骤三、配置此Action,struts.xml的主要内容如下:
步骤四、编写login.jsp页面,主要代码如下:
步骤五、编写loginSuc.jsp页面,主要代码如下:
调试:
获取值栈中的username属性:
步骤六、发布测试及说明
当我们输入用户名并成功跳到logSuc.jsp页面后,会得到登录时输入的用户名信息。下面简要说明这一过程:
(1).login.jsp登录提交登录信息给login.action
20
共分享92篇相关文档