struts2笔记(入门)(7)

2019-08-30 21:49

查询请求已提交,正在查询数据,请等待...

在此页面中,我们指定了每隔1秒便发送请求到login.action中去。这样,客户端便可以及时获取查询结果。结合此实例,我们简要分析流程:当我们发出请求到此Login.Action中去时,首先会被exeAndWait拦截器拦截到,这样它便跳转到wait.jsp页面,在wait.jsp页面中每隔1秒我们会继续发送此Action的请求,当再次请求到达LoginAction时,如果它已经返回,则会跳到此Action返回的页面,如果LoginAction未返回,则继续停留在wait.jsp中,再隔1秒又再次发送请求到LoginAction中去。 其实如果服务器能很快查询出结果,我们则不需要用到wait.jsp页面,我们只需在中增加如下一段配置: 6000 这样便延迟请求到达wait.jsp页面,这样当请求到达时它会在LoginAction中执行6秒时间再到wait.jsp,而6秒LoginAction足以执行完并返回结果,所以当拦截器 执行时首先检查到此Action已经返回结果。则拦截器会直接用此返回页面,如果此时发现LoginAction并未执行完,它便会把wait resutl指定的页面返回。需要说明的是,通常我们设定的延迟最多一秒,这里为了演示,设置的很长。图示此拦截器原理:

返回其中一个 execAndWait拦截器 或 返回的结果 Wait Result 是否配置了延迟 配置延迟 未配置 未返回 延迟时间结束 检查Action是否返回结果 关于此拦截器的详细的配置及文档说明可以参看ExecuteAndWaitInterceptor类的api信息。 5. TokenInterceptor防止表单重复提交。

由于某些原因,用户在进行类似表单提交的操作后,以为表单未被提交,会进行多次的重复提交。为了避免用户多次提交给服务器带来负荷。我们会对表单提交这样的操作进行一些处理,以告诉用户不要重复提交。下面我们建立struts2token项目,使用struts2的token拦截器来实现此案例。 步骤一,编写login.jsp页面,内容如下:

<%@ page language=\pageEncoding=\%> <%@ taglib uri=\prefix=\%>

31

说明,此登录页面中的关键技术就是使用了标签库中的标签,它的作用就是在用户访问此页面时会生成一个sessionId,在提交时会服务器会据此验证表单是否已提交。“To set a token in your form, you should use the token tag. This tag is required and must be used in the forms that submit to actions protected by this interceptor”,这句话的大概意思就是我们必须要在提交的表单中使用这个token tag,这样提交到的Action便能配置TokenInterceptor拦截器验证表单是否重复提交。 步骤二,编写LoginAction,主要代码如下:

package com.asm;

public class LoginAction extends ActionSupport { }

public String execute() throws Exception { }

System.out.println(\执行execute方法...\); return SUCCESS;

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

/success.jsp

/subError.jsp

说明:在此Action下,我们配置了token拦截器,另注意到在此Action下我们还配置了一个“invalid.token”result,因为“This interceptor uses a fairly primitive technique for when an invalid token is found: it returns the result invalid.token, which can be mapped in your action configuration”。它的大概意思就是:提交时服务器如果根据token标签产生的sessionId判断出表单已提交,它则返回invalid.token指向的视图。比如这里,如果重复提交则会转到.../subError.jsp中去。另不要忘记了引入默认的拦截器栈。补充:关于token拦截器更多细节可以访问org.apache.struts2.interceptor.TokenInterceptor类的api说明。 步骤四,编写配置中所用到jsp页面,这些页面编写简单,在此省去。

步骤五、发布测试,请注意访问login.jsp页面时,查看源文件时会发现增加了两个隐藏域信息。 步骤六、更换拦截器:我们还可以使用tokenSession拦截器,它的功能比上面的增强,它能保证持有相同sessionId的并发请求等待第一个完成之后才能被提交处理,但是它返回的是action执行后的result.接着上例,我们只需要在配置中作如下修改:把上面的token拦截器改成 即可。随后便可以测试,测试时会发现如果我们重复提交,它总是返回到上一次的success.jsp页面,但是它并不是经过LoginAction中的execute处理后返回(我们System.out.print语句在重复提交时并未打印出来),而是此拦截器判断出是重复后直接返回上一次提交转向的页面。 6.使用拦截器实现权限验证

为了说明此问题,我们建立struts2auth项目,流程图如下:

32

main.jsp 试图访问:note.action 由login直接登录到main.jsp 拦截器:判断是否登录 .../WEB-INF/note.jsp配置了note.action,并配置了拦截器 未登录 登录 login.jsp 简短说明:当我们访问main.jsp页面,并试图通过此页面中的链接地址:note.action来访问

到.../WEB-INF/note.jsp页面时,由于访问的note.action配置了拦截器,所以会被拦截,如果拦截器判断登录则可以访问,否则会跳到登录页面。如果我们从登录页面直接到main.jsp页面,再来访问note.action时,同样被拦截但是由于登录过,所以可以访问到此action对应的内容。由这里的分析可以看出关键点就登录成功时给出标志提供给拦截器判断是否成功登录。

步骤一,搭建好相关的开发环境,并准备好登录页面login.jsp,代码如下:

步骤二,建立相应的Action:LoginAction。代码如下:

package com.asm;

public class LoginAction extends ActionSupport {

private String username; Map session;

public String execute() throws Exception { }

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

if(username.equals(\)){ }

session = ActionContext.getContext().getSession(); session.put(\, \); return SUCCESS; return LOGIN;

}else{

说明:我们这里是设定了只有登录用户名为admin时,此Action才设置登录标志。另这里获取Session对象采取的是“与Servlet解耦合的非IOC方式”。 步骤三,编写拦截器类,代码如下:

package com.asm.interceptor;

33

public class AuthInterceptor extends AbstractInterceptor { }

public String intercept(ActionInvocation invocation) throws Exception { }

Map session = invocation.getInvocationContext().getSession(); // session=ActionContext.getContext().getSession(); if (session.get(\) == null) { }

return \;

String result = invocation.invoke(); return result; } else {

步骤四,配置此Action相关,主要配置内容如下:

/WEB-INF/note.jsp /login.jsp

class=\>

/main.jsp /login.jsp

说明:结合前面的一些代码来看,当我们为note.action配置了前面写所的AuthInterceptor拦截器时,如果我们要访问note.action,拦截器会首先判断是否登录,如果登录则继续把请求传递下去,如果没有登录则会返回到登录页面。

步骤五、编写相关的其它jsp页面,然后发布测试。此实例应重点是进一步掌握拦截器的配置使用。作为“实现资源权限访问”,此实例不具参考价值。 7.拦截器中的注解

AnnotationWorkflowInterceptor:Invokes any annotated methods on the action。意思是此拦截器可以调用在Action中任何有注解的方法。下面我们来演示它的使用,具体步骤如下: 步骤一,建立struts2annotationInt项目,并建立LoginAction类,代码如下:

package com.asm; ...省略导入的包

34

public class LoginAction extends ActionSupport { }

private String username; @Before

public String myBefore() { } @After

public void myAfter() throws InterruptedException {

Thread.sleep(5000);

System.out.println(\调用myAfter方法\); }

@BeforeResult

public void myBeforeResult() {

System.out.println(\调用myBeforeResult方法\); }

public String execute() throws Exception { }

public String getUsername() { }

public void setUsername(String username) { }

System.out.println(\调用set方法\ + username); this.username = username; return username;

System.out.println(\调用execute方法\); return SUCCESS;

System.out.println(\调用myBefore方法\); return LOGIN;

说明:要想使用方法成为被拦截器监视的注解方法,只需在方法关加上@...这样的形式并导入相关的类即可。

步骤二,编写相关的jsp及配置该Action,主要配置内容如下:

class=\

nterceptor\>

/success.jsp /login.jsp

35


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

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

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

马上注册会员

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