Struts中的Action如果想要获取全文的Session的话,需要实现SessionAware接口。然后实现sessionAware方法:setSession即可,然后接下来程序运行时候,外部struts会将这个session赋给我们,这叫注入依赖,也叫反转依赖。
代码案例:
package edu.fjnu.training.action; import java.util.Map; import org.apache.struts2.interceptor.SessionAware; public class SecurityAction extends BaseAction implements SessionAware{ /**获得全文Session范围:这种做法叫做注入依赖,也叫反转依赖*/ Map<String, Object> session=null; public String login()throws Exception{ UserService userService=new UserServiceImpl(); user=userService.checkUser(user.getUserNo(), user.getUserPwd()); session.put("loginedUser", user); return ""; } @Override public void setSession(Map<String, Object> session) { this.session=session; } }
拦截技术与实现:interceptor
这章主要是将登录安全管理模块完成,然后登录安全管理模块,还穿插了一些struts拦截器;
首先我们看一下登录安全管理模块的代码:
login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8" isELIgnored="false"%> <%@ include file="/jsps/common-tags.jsp" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>登录操作</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> <style type="text/css"> .error{ border:1px groove yellow; color:red; width:200px; } </style> </head> <body> <h3>登录界面请登录</h3> <s:form action="login" namespace="/security" method="post"> <div> <label>账号:</label> <s:textfield name="user.userNo"></s:textfield> </div> <s:fielderror> <s:param>stuNo</s:param> </s:fielderror> <div> <label>密码:</label> <s:password name="user.userPwd"></s:password> </div> <s:actionerror/> <div> <s:submit value="登录"></s:submit> </div> </s:form> <%@ include file="/jsps/footer.jsp" %> </body> </html>
SecurityAction.java 模块代码:主要包含了一个User对象操作,和Session范围的获取。
/** * 工 程 名:SMS-SSH-20180524 <br> * 文 件 名:UserAction.java <br> * 工具包名:edu.fjnu.training.action <br> * 功能描述:TODO <br> * 创建时间:2018年5月25日 下午2:01:01 <br> * 版本信息:V1.0 * @创建人:Zhou Kailun */ package edu.fjnu.training.action; import java.util.Map; import org.apache.struts2.interceptor.SessionAware; import edu.fjnu.training.domain.User; import edu.fjnu.training.exception.SMSException; import edu.fjnu.training.service.UserService; import edu.fjnu.training.service.UserServiceImpl; /** * 类名:SecurityAction <br> * 功能描述: <br> * 创建日期:2018年5月25日 下午2:01:01 <br> * 修改备注: * @作者信息:Zhou kailun <br> */ public class SecurityAction extends BaseAction implements SessionAware{ /**登录用户信息:User对象*/ private User user; /**获得全文Session范围:这种做法叫做注入依赖,也叫反转依赖*/ Map<String, Object> session=null; public String toLogin()throws Exception{ return "login_page"; } public String login()throws Exception{ UserService userService=new UserServiceImpl(); try{ user=userService.checkUser(user.getUserNo(), user.getUserPwd()); }catch(SMSException e ){ this.addActionError(e.getMessage()); return "login_page"; } session.put("loginedUser", user); return "mainAction"; } public String logout() throws Exception{ session.remove("loginedUser"); return "toLoginAction"; } public String main()throws Exception{ return "main_page"; } /**<p>构造函数:</p><br><br> * <p>描述:</p><br> */ public SecurityAction() { // TODO Auto-generated constructor stub } public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public void setSession(Map<String, Object> session) { this.session=session; } }
最后是Struts配置问题:
1 :struts.xml配置文件中常见的一些问题:
A:通配符管理:如果我们希望不用书写太多的action响应,也就是不希望每个方法都写一个Action配置的话,我们可以用通配符解决这个问题:<!--5 全局权限函数:方便struts中action用.*正则表达式替代 -->
<!--5 全局权限函数:方便struts中action用.*正则表达式替代 --> <global-allowed-methods>regex:.*</global-allowed-methods>
这个可以让我们很快捷的完成action的书写工作,但是也是有代价的,我们程序员开发工作量减少了,但是在另外一个情况来说,这就放宽了我们服务器的访问范围了:例如随便发出一个请求:/student/我喜欢你.do 这个请求我们都要执行处理。
2 拦截器类的书写:我们新建一个类AuthenInterceptor.java 这个类需要实现 implements Interceptor 方法,我们拦截器工作的时候就是根据我们书写的业务规则去完成工作,同时我们在struts.xml中也要有一些全局变量来响应拦截器返回的消息。如:
<!--4 全局结果列表:设置全局result列表 --> <global-results> <result name="login_page">../jsps/security/login.jsp</result> </global-results>
然后看一下本例中拦截器工作代码:
/** * 工 程 名:SMS-SSH-20180524 <br> * 文 件 名:AuthenInterceptor.java <br> * 工具包名:edu.fjnu.training.interception <br> * 功能描述:TODO <br> * 创建时间:2018年5月25日 下午3:22:20 <br> * 版本信息:V1.0 * @创建人:Zhou Kailun */ package edu.fjnu.training.interception; import java.util.Map; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; /** * 类名:AuthenInterceptor <br> * 功能描述: <br> * 创建日期:2018年5月25日 下午3:22:20 <br> * 修改备注: * @作者信息:Zhou kailun <br> */ public class AuthenInterceptor implements Interceptor { /**<p>构造函数:</p><br><br> * <p>描述:</p><br> */ public AuthenInterceptor() { // TODO Auto-generated constructor stub } /* (非 Javadoc) * <p>Title:destroy</p> * <p>描 述:</p> * @see com.opensymphony.xwork2.interceptor.Interceptor#destroy() */ @Override public void destroy() { // TODO Auto-generated method stub } /* (非 Javadoc) * <p>Title:init</p> * <p>描 述:</p> * @see com.opensymphony.xwork2.interceptor.Interceptor#init() */ @Override public void init() { // TODO Auto-generated method stub } /* (非 Javadoc) * <p>Title:intercept</p> * <p>描 述:</p> * @param invocation * @return * @throws Exception * @see com.opensymphony.xwork2.interceptor.Interceptor#intercept(com.opensymphony.xwork2.ActionInvocation) */ @Override public String intercept(ActionInvocation invocation) throws Exception { // TODO Auto-generated method stub Map<String,Object> session=invocation.getInvocationContext().getSession(); Object user=(Object)session.get("loginedUser"); if(user==null){ return "login_page"; } return invocation.invoke(); } }
3:最后看一下struts.xml配置文件:struts配置文件中,拦截器,全局变量,默认拦截器....等这些顺序是有规定的,所以我们书写这些规则时候要按照顺序来。struts.xml我们可以分作业完成任务,例如负责安全的就去处理struts-security.xml文件,负责业务的就负责struts-student.xml文件....,最后我们在struts.xml中做整合即可:如下:
struts.xml :
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant> <constant name="struts.devMode" value="true"></constant> <!-- 在网页中以开发模式打开,用于程序员直接在网页中查看运行情况 --> <constant name="struts.action.extension" value="do,action"></constant> <!-- 如果没有显示配置,默认为action, --> <constant name="struts.ui.theme" value="simple"></constant><!-- Struts 生成的UI界面代码风格,我们一般希望是自己能控制的。但是也可以一局各单位公司不同,有不同风格 --> <constant name="struts.i18n.encoding" value="utf-8"></constant><!-- struts编码方式为utf-8 --> <!-- http://localhost:8080/strutsDemo/work/demo.do 1.struts过滤器拦截到url地址,获得该url的后缀,如果是*.do,则为struts处理范畴。去掉猴嘴,获得实体路径。 2.取得包路径(最后一个/之前的路径)/work 3.获得action的名字demo,然后找到这个action,创建该action的实例。执行execute方法一次。 --> <!-- sms系统基础包 --> <package name="smsPkg" abstract="true" namespace="/" extends="struts-default"> <!--1 拦截器:设置全场拦截器--> <interceptors> <!-- 拦截器1 身份验证 --> <interceptor name="AuthenInterceptor" class="edu.fjnu.training.interception.AuthenInterceptor"></interceptor> <!-- 拦截器栈A 身份验证:系统用户 --> <interceptor-stack name="user"> <interceptor-ref name="AuthenInterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> <!-- 拦截器栈B 身份验证:游客登录 --> <interceptor-stack name="guess"> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <!--2 默认拦截器:设置默认拦截器等级user(所有的请求都需要身份验证) --> <default-interceptor-ref name="user"></default-interceptor-ref> <!--3 默认访问基类:设置action默认访问类为baseAction --> <default-class-ref class="edu.fjnu.training.action.BaseAction"></default-class-ref> <!--4 全局结果列表:设置全局result列表 --> <global-results> <result name="login_page">../jsps/security/login.jsp</result> </global-results> <!--5 全局权限函数:方便struts中action用.*正则表达式替代 --> <global-allowed-methods>regex:.*</global-allowed-methods> </package> <!-- 学生信息管理 --> <include file="struts-student.xml"/> <!-- 安全登录信息管理 --> <include file="struts-security.xml"/> <!-- 教师信息管理 --> <include file="struts-student.xml"/> </struts>
struts-security.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <package name="securityPkg" namespace="/security" extends="smsPkg" > <action name="*" class="edu.fjnu.training.action.SecurityAction" method="{1}"> <result name="login_page" >../jsps/security/login.jsp</result> <result name="mainAction" type="redirectAction">main</result> <result name="main_page" >../jsps/main.jsp</result> <result name="toLoginAction" type="redirectAction">toLogin</result> <interceptor-ref name="guess"></interceptor-ref> </action> </package> </struts>
struts-student.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!-- 学生信息管理 --> <package name="stuPkg" namespace="/student" extends="smsPkg"> <!-- <action name="toReg" class="edu.fjnu.training.action.StudentAction" method="toReg"> <result name="reg_page" type="dispatcher">../jsps/student/reg_student.jsp</result> </action> <action name="work" class="edu.fjnu.training.action.StudentAction" method="work"> </action> <action name="reg" class="edu.fjnu.training.action.StudentAction" method="reg"> <result name="loadAllAct" type="redirectAction">loadAll</result> </action> <action name="loadAll" class="edu.fjnu.training.action.StudentAction" method="loadAll"> <result name="list_page" >../jsps/student/list_student.jsp</result> </action> <action name="remove" class="edu.fjnu.training.action.StudentAction" method="remove"> <result name="loadAllAct" type="redirectAction">loadAll</result> </action> <action name="preUpdate" class="edu.fjnu.training.action.StudentAction" method="preUpdate"> <result name="update_page">../jsps/student/update_student.jsp</result> </action> <action name="update" class="edu.fjnu.training.action.StudentAction" method="update"> <result name="loadAllAct" type="redirectAction">loadAll</result> </action> <action name="loadPic" class="edu.fjnu.training.action.StudentAction" method="loadPic"> </action> --> <action name="*" class="edu.fjnu.training.action.StudentAction" method="{1}"> <result name="reg_page" type="dispatcher">../jsps/student/reg_student.jsp</result> <result name="list_page" >../jsps/student/list_student.jsp</result> <result name="update_page">../jsps/student/update_student.jsp</result> <result name="loadAllAct" type="redirectAction">loadAll</result> </action> </package> </struts>
struts-teacher.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!-- 教师信息管理 --> <package name="teacherPkg" namespace="/teacher" extends="smsPkg"> </package> </struts>