第21章 J2EE SSH基础学习-SMS表现层升级-3

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>

猜你喜欢

转载自blog.csdn.net/qq_36346496/article/details/80451622