struts2笔记(入门)(4)

2019-08-30 21:49

public class LoginAction extends ActionSupport {

private String username;

public String execute() throws Exception { }

if (username.equals(\)) {

throw new ClassNotFoundException(\类未被找到\); } else if (username.equals(\)) { throw new Exception(\全局异常\); } else { }

return SUCCESS;

...省力get/set方法 }

步骤三、struts.xml配置文件如下:

exception=\>

/globalException.jsp

exception=\>

/exception.jsp /main.jsp

分析:异常处理机制较为简单,所以在此只略作说明。当登录时输入“exception”时,在LoginAction中会抛出会一个ClassNotFoundException异常,此异常我们采取的局部异常处理的方式,如果登录时输入“globla”,则会抛出Exception异常,此异常我们采取的是全局异常的处理方式,在ex包中我们继承了全局异常所在的包。提示:中的result属性的值来源于元素中的name属性的值。从实例可以看出,我们一般把这种全局性的异常放在一个抽象包中供其实包继承。

三、在Action获取Scope对象

引言:在前面的Action操作中,关键就是Action中的exectue方法,但是此方法并没有request、session、application等对象作为参数,自然就不能利用这些对象来操作。下面我们建立struts2scope项目,并用四种方式来获取这些对象:

方式一、与Servlet解耦合的非IOC方式

16

获取的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 { }

context=ActionContext.getContext(); request=(Map) context.get(\); session=context.getSession();

application=context.getApplication();

request.put(\, \属性\); session.put(\, \属性\);

application.put(\, \属性\); return SUCCESS;

...省略username的get/set方法 }

struts.xml配置如下:

/loginSuc.jsp

login.jsp内容如下:

loginSuc.jsp的主要内容如下:

${requestScope.req} ${sessionScope.ses} ${applicationScope.app}

以下使用scope.getAttribute的形式来接受

request: <%=request.getAttribute(\) %>
session: <%=session.getAttribute(\) %>

application:<%=application.getAttribute(\) %>

分析:通过ActionContext的getContext静态方法得到ActionContext对象,然后ActionContext对象调用get方法来获取一个存储在request范围中的对象。我们使用el或通过request.getAttribute这样的方式均可以获取对象值,这说明了这些Map request对象实际是存储在request范围内的对象。 方式二、与Servlet解耦合的IOC方式

17

我们建立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 request) { }

public void setSession(Map session) { }

public void setApplication(Map application) { }

this.application=application; this.session=session; this.request=request;

request.put(\, \属性\); session.put(\, \属性\);

application.put(\, \属性\); return SUCCESS;

...省略username的get/set方法 }

注册此Action的name为login2,随后修改登录提交为.../login2.action。便可以发布测试。说明:此方法其实和方式一很相似,只是在方式一中我们需要手动的为Map request赋值,但是在方式二中它是通过实现接口,在重写接口中的方法中完成对Map requset的赋值,所以称之IOC方式。借助此例,略谈下依赖注入与控制反转:所谓依赖注入就是一个对象自己本身的初始化是依赖其它对象。比如这里Map request这些对象会依赖struts2来给其初始化,称为依赖注入,而依赖注入的就表示,这些对象的控制权不再由此类本身掌握,而是交给了别的对象,即是控制权反转了。 强调:方式二是开发中主要用的方式,应重点掌握

方式三、与Servlet耦合的非IOC方式 建立Login3Action,代码如下:

package com.asm;

public class Login3Action extends ActionSupport {

private String username; HttpServletRequest request; HttpSession session;

ServletContext application;

public String execute() throws Exception {

request = ServletActionContext.getRequest(); session = request.getSession();

application = ServletActionContext.getServletContext(); request.setAttribute(\, \属性\); session.setAttribute(\, \属性\);

18

}

application.setAttribute(\, \属性\); return SUCCESS;

...省略username的get/set方法。 }

此方法获取的纯粹的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 { context=ActionContext.getContext(); session=request.getSession();

request.setAttribute(\, \属性\); session.setAttribute(\, \属性\);

application.setAttribute(\, \属性\); return SUCCESS;

}

public void setServletRequest(HttpServletRequest request) { System.out.println(\测试:\+request); this.request=request;

}

public void setServletContext(ServletContext application) { System.out.println(\测试:\+application); this.application=application;

}

...省略username的get/set方法 }

同样只需要注册此Action并修改登录页面便可发布测试

四、OGNL与VS

1.值栈入门

下面我们建立struts2ognl项目来练习ognl的使用。 步骤一、搭建strust2的开发环境

步骤二、建立LoginAction,主要代码如下:

package com.asm;

public class LoginAction extends ActionSupport{ private User user;

public String execute() throws Exception {

return SUCCESS;

19

}

...省略user的get/set方法 }

步骤三、配置此Action,struts.xml的主要内容如下:

/loginSuc.jsp

步骤四、编写login.jsp页面,主要代码如下:

步骤五、编写loginSuc.jsp页面,主要代码如下:

调试:

获取值栈中的username属性:

步骤六、发布测试及说明

当我们输入用户名并成功跳到logSuc.jsp页面后,会得到登录时输入的用户名信息。下面简要说明这一过程:

(1).login.jsp登录提交登录信息给login.action

(2).struts2监听到客户端的login.action请求,按配置文件要求,把此请求交给LoginAction处理。这表示会去new LoginAction(), 当struts2 new出此Action对象后会把这个对象放在context map中,只是这个Action非常特殊,所以放在值栈中,而放在值栈中的对象是可以直接引用的,放在其它context map中的对象引用时会要求加#。

(3).当new LoginAction时,表示它也会初始化此类中的对象,比如这里会去初始化User对象,但是要注意的是如果我们在用户名和密码什么都不输,再来用debug来看值栈中的user是,发现它仍会new此对象,因为尽管我们没用输入值,但是后台的set方法还是要被调用,所以会new出此对象,但是如果我们直接输入.../struts2ognl/login.action时我们会发现跳转到loginSuc.jsp页面时,用debug来看值栈中此User user,发现它的值为null。第二点要注意的是我们必须为User类提供默认的构造方法,否则将会出现如下错误: java.lang.InstantiationException: com.asm.vo.User 总结:1.Action会在请求时被创建,且会把创建的对象放到值栈中。

2.Action中的对象字段只有在需要时才会以new 的形式初始化,而且这些对象字段必须提供默认的构造方法。

3.ValueStack对象贯穿整个Action的生命周期(每个Action类的对象实例会拥有一个ValueStack对象)。当Struts 2接收到一个.action的请求后,会先建立Action类的对象实例,但并不会调用Action方法,而是先将Action类的相应属性放到ValueStack对象的顶层节点(vs对象相当于一个栈)。 补充:值栈(根)对象也可以直接使用EL表达式访问,比如这里可以直接通过${user.username}来获取username的值,我们知道el表达式只能访问四种scope范围内的对象,那为什么这里能访问到值栈

20


struts2笔记(入门)(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:11种蒙氏数学教具的使用方法 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: