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>