Struts2入门教程(全新完整版) 联系客服

发布时间 : 星期五 文章Struts2入门教程(全新完整版)更新完毕开始阅读1fd042cc376baf1ffd4fad14

说明,此登录页面中的关键技术就是使用了标签库中的标签,它的作用就是在用户访问此页面时会生成一个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项目,流程图如下:

37

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,代码如下:

/login.action\method=\>

姓名:
密码:

步骤二,建立相应的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;

38

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; ...省略导入的包

39

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

40