SSH框架——Struts2篇
Posted 夕冰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSH框架——Struts2篇相关的知识,希望对你有一定的参考价值。
拦截器
拦截器几乎完成了Struts2框架70%的工作,包括解析请求参数,将请求参数赋值给Action属性,执行数据校验,文件上传……,这些拦截器以name-class对的形式配置在struts-default.xml文件中,其中name是拦截器的名字,是使用该拦截器的唯一标识,class指定了该拦截器的实现类。
登录Action实现类
public class LoginAction extends ActionSupport{ private String username; private String password;
public String execute(){ if(getUsername().equals("admin") && getPassword().equals("123")){ ActionContext.getContext().getSession().put("user", getUsername()); return "success"; }else{ return "fail"; } } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }
}
|
自定义拦截器类,继承自
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class SimpleInterceptor extends AbstractInterceptor {
//用于设置拦截器的名字 private String name; //为拦截器设置名字的setter方法 public void setName(String name) { this.name = name; }
/** * 拦截器实现功能代码 */ @Override public String intercept(ActionInvocation invocation) throws Exception { //取得被拦截的action实例 LoginAction action = (LoginAction) invocation.getAction(); //打印开始执行的时间 System.out.println(name+"拦截器的动作------------"+"开始执行Action的时间"+new Date()); //取得开始执行Action的时间 long start = System.currentTimeMillis(); //执行该拦截器后一个拦截器 //如果该拦截器后没有其他拦截器,则直接执行Action的被拦截方法 String result = invocation.invoke(); //打印执行结束时间 System.out.println(name+"拦截器的动作------------"+"执行完登录Action的时间为:"+new Date()); long end = System.currentTimeMillis(); System.out.println(name+"拦截器的动作------------"+"执行完该Action的时间为:"+(end-start)+"毫秒");
return result; } } |
在struts.xml中配置使用自定义拦截器
<!-- 配置本系统所使用的包 --> <package name="test" extends="struts-default">
<!-- 应用所需使用的拦截器都在该元素下配置 --> <interceptors> <!-- 配置mySimple拦截器 --> <interceptor name="mySimple" class="org.cgx.in.SimpleInterceptor"> <!-- 为拦截器指定参数 --> <param name="name">简单拦截器</param> </interceptor> </interceptors> <action name="login" class="org.cgx.vo.LoginAction"> <result name="success">/welcome.jsp</result> <result name="fail">/error.jsp</result> <!-- 配置系统的默认拦截器 --> <interceptor-ref name="defaultStack"></interceptor-ref> <!-- 应用自定义的拦截器 --> <interceptor-ref name="mySimple"> <param name="name">改名后的拦截器===</param> </interceptor-ref> </action> </package> |
登录表单界面代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <%@taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <s:form action="/login" method="post"> <s:textfield name="username" key="user"/> <s:textfield name="password" key="pass"/> <s:submit key="login"/> </s:form> </body> </html> |
在struts.xml应用自定义拦截器时,可以通过excludeMethods属性指定不被拦截的方法;通过includeMethods属性指定被拦截的方法
<!-- 应用自定义的拦截器 --> <interceptor-ref name="mySimple"> <param name="name">改名后的拦截器</param> <!-- 指定不需要拦截的方法 --> <param name="excludeMethods">execute</param> <!-- 指定需要拦截的方法 --> <param name="includeMethods">execute</param> </interceptor-ref> |
当excludeMethods和includeMethods同时使用时,拦截器会拦截。
当不需要拦截多个方法时可用逗号隔开
<param name="excludeMethods">execute,regist</param> |
校验用户是否登录
struts.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts> <!-- 指定编码 --> <constant name="struts.i18n.encoding" value="UTF-8"></constant> <!-- 指定全局国际化资源文件 --> <constant name="struts.custom.i18n.resources" value="mess"></constant> <!-- 修改以下配置,设置是否需要重新启动tomcat --> <constant name="struts.devMode" value="false"></constant> <!-- 调用动态方法 --> <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<!-- 配置本系统所使用的包 --> <package name="test" extends="struts-default"> <!-- 应用所需使用的拦截器都在该元素下配置 --> <interceptors> <!-- 配置mySimple拦截器 --> <interceptor name="mySimple" class="org.cgx.in. SimpleInterceptor"> <!-- 为拦截器指定参数 --> <param name="name">简单拦截器</param> </interceptor> </interceptors> <action name="login" class="org.cgx.vo.LoginAction"> <result name="success">/welcome.jsp</result> <result name="fail">/error.jsp</result> </action> <action name="show" class="org.cgx.in.Test"> <result name="ok">/welcome.jsp</result> <result name="login">/index.jsp</result> <!-- 配置系统的默认拦截器 --> <interceptor-ref name="defaultStack"></interceptor-ref> <!-- 应用自定义的拦截器 --> <interceptor-ref name="mySimple"> <param name="name">自定义拦截器</param> </interceptor-ref> </action> </package> </struts> |
登录成功后将用户名写入session中,当访问其他页面时,首先由拦截器拦截,查看是否登录,即session中是否有值。若已登录即跳转至请求页面,若未登录则跳转至登录界面,并提示未登录
public class SimpleInterceptor extends AbstractInterceptor {
//用于设置拦截器的名字 private String name; //为拦截器设置名字的setter方法 public void setName(String name) { this.name = name; } /** * 拦截器实现功能代码 */ @Override public String intercept(ActionInvocation invocation) throws Exception { //取得请求相关的ActionContext实例 ActionContext context = invocation.getInvocationContext(); Map session = context.getSession(); //取出session中的user属性 String user = (String) session.get("user"); //如果没有登录,或者用户名不是xice,都返回重新登录 if(!("").equals(user)&&("xice").equals(user)){ return invocation.invoke(); } context.put("tip", "您还没有登录!"); return"login"; } } |
通过ActionContext返回提示信息,jsp界面接收显示方法
${requestScope.tip} |
以上是关于SSH框架——Struts2篇的主要内容,如果未能解决你的问题,请参考以下文章