- 浏览: 204614 次
- 性别:
- 来自: 芜湖
-
文章分类
- 全部博客 (139)
- 软件 (0)
- Pattern (6)
- CSDN导入 (19)
- Struts (3)
- [网站分类]1.网站首页原创 (27)
- [网站分类]6.转载区 (4)
- Hibernate (10)
- Error (8)
- [网站分类]2.Java新手区 (20)
- Java (8)
- [网站分类]4.其他技术区 (10)
- Web (1)
- C++ (2)
- Algorithm (4)
- Linux (2)
- Skill (1)
- Tech (2)
- Note (2)
- [网站分类]3.非技术区 (1)
- Database (1)
- Winty (7)
- [网站分类]1.网站首页原创Java技术区(对首页文章的要求: 原创、高质量、经过认真思考并精心写作。BlogJava管理团队会对首页的文章进行管理。) (0)
最新评论
-
haohao-xuexi02:
很不错哦。
O'Reilly cos上传组件的使用(1/3) - 上传文件 -
yoin528:
useUnicode=true&charact ...
[原]向MySQL数据库插入Blob数据的问题 -
xiaoqing20:
下载来看看!呵呵
[原]Struts2类型转换 -
xiaoqing20:
[原]Struts2类型转换
[标题]:[原]Struts2-拦截器
[时间]:2009-7-31
[摘要]:Struts Interceptor
[关键字]:浪曦视频,Struts2应用开发系列,WebWork,Apache,Interceptor,拦截器,动态代理,Java,Proxy
[环境]:struts-2.1.6、JDK6、MyEclipse7、Tomcat6
[作者]:Winty (wintys@gmail.com) http://www.blogjava.net/wintys
[正文]:
1、知识点
a.Struts2拦截器Interceptor
Struts2拦截器的根接口为: xwork-2.1.2.jar/com.opensymphony.xwork2.interceptor.Interceptor
自定义的拦截器可以实现Interceptor接口。com.opensymphony.xwork2.interceptor.AbstractInterceptor 提供了对Interceptor的默认实现,自定义拦截器也可以继承AbstractInterceptor。
b.定义拦截器
/StrutsHelloWorld/src/wintys/struts2/interceptor/MyInterceptor.java:
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
/**
* 拦截器、Interceptor
*
* http://www.blogjava.net/wintys
* @author Winty (wintys@gmail.com)
* @version 2009-07-30
*
*/
@SuppressWarnings("serial")
public class MyInterceptor implements Interceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("before...");
String result = invocation.invoke();
System.out.println("after...");
return result;
}
@Override
public void destroy() {
System.out.println("MyInterceptor destroy()...");
}
@Override
public void init() {
System.out.println("MyInterceptor init()...");
}
}
c.在struts.xml中配置拦截器
<interceptors>
<interceptor name="myInterceptor" class="wintys.struts2.interceptor.MyInterceptor" />
<interceptor-stack name="myStack">
<interceptor-ref name="myInterceptor"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
......
<action name="intercept" class="wintys.struts2.interceptor.InterceptAction">
<result name="success">/interceptor/output.jsp</result>
<result name="input">/interceptor/input.jsp</result>
<interceptor-ref name="myStack" />
</action>
</package>
defaultStack是Struts默认的拦截器。在action中手动引入interceptor后,就不会启用默认的interceptor,除非手动引入。所以要加上默认interceptor:<interceptor-ref name="defaultStack">。
在input.jsp请求Action "intercept"时,在Action的execute()方法执行时,就会触发拦截器。
d.带参数的拦截器
配置(在定义时给参数赋值):
<interceptor name="myParamInterceptor" class="wintys.struts2.interceptor.MyParamInterceptor" >
<param name="info
">This is a param.</param>
</interceptor>
在自定义拦截器中实现代码(添加info属性、setter和getter):
/StrutsHelloWorld/src/wintys/struts2/interceptor/MyParamInterceptor.java
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
/**
* 带参数的拦截器、AbstractInterceptor
*
* http://www.blogjava.net/wintys
* @author Winty (wintys@gmail.com)
* @version 2009-07-30
*
*/
@SuppressWarnings("serial")
public class MyParamInterceptor extends AbstractInterceptor {
private String info ;
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("before2...");
System.out.println("info:" + info );
String result = invocation.invoke();
System.out.println("after2...");
return result;
}
}
在引用时给参数赋值,会覆盖定义时的赋值:
<interceptor-ref name="myParamInterceptor">
<param name="info
">This is another param.</param>
</interceptor-ref>
e.拦截器栈
拦截器栈与拦截器具有同等地位,使用相同。拦截器栈可以再包含拦截器或拦截器栈。
<interceptors>
<interceptor-stack name="myStack">
<interceptor-ref name="myInterceptor" />
<interceptor-ref name="defaultStack" />
</interceptor>
</interceptors>
拦截器栈中定义的多个拦截器执行顺序与拦截器配置顺序相同。同时,多个拦截器的执行流程如下: interceptorA begin => interceptorB begin => action => interceptorB end => interceptorA end
f.指定默认拦截器
Struts默认的拦截器是defaultStack,可以在struts.xml中使用如下配置重新指定默认拦截器:
<package>
......
<default-interceptor-ref name="myStack" />
......
</package>
g.方法过滤拦截器MethodFilterInteceptor
MethodFilterInteceptor可以选择需要过滤的方法,通过参数进行配置。实现MethodFilterInteceptor.doIntercept(),以提供拦截功能。
<action>
<interceptor-ref name="myInterceptor">
<param name="includeMethods">test,execute</param>
<param name="excludeMethods">somemethod</param>
</interceptor-ref>
</action>
f.PreResultListener
可以在拦截器中添加PreResultListener,以实现特定功能。PreResultListener在业务方法(通常为execute)返回后(执行成功则返回"success"),页面视图呈现到客户端之前执行。
public String intercept(ActionInvocation invocation) throws Exception {
......
invocation.addPreResultListener(...);
......
}
2、详细代码
/StrutsHelloWorld/src/wintys/struts2/interceptor/MyMethodFilterInterceptor.java:
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
import com.opensymphony.xwork2.interceptor.PreResultListener;
/**
* 选择性拦截方法的拦截器MethodFilterInterceptor、监听器PreResultListener
*
* http://www.blogjava.net/wintys
* @author Winty (wintys@gmail.com)
* @version 2009-07-30
*
*/
@SuppressWarnings("serial")
public class MyMethodFilterInterceptor extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
System.out.println("MyMethodFilterInterceptor is running...");
//添加监听器PreResultListener
invocation.addPreResultListener (new PreResultListener(){
public void beforeResult(ActionInvocation invocation, String resultCode){
System.out.println("PreResultListener ..." + resultCode);
}
});
String result = invocation.invoke();
return result;
}
}
/StrutsHelloWorld/WebRoot/interceptor/input.jsp:
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
</head>
<body>
<s:form action="intercept">
<s:textfield name="user" label="user" /><br/>
<s:submit name="submit" label=" 提交 " />
</s:form>
</body>
</html>
/StrutsHelloWorld/src/wintys/struts2/interceptor/InterceptAction.java:
import com.opensymphony.xwork2.ActionSupport;
/**
*
* @author Winty (wintys@gmail.com)
* @version 2009-07-30
* http://www.blogjava.net/wintys
*/
@SuppressWarnings("serial")
public class InterceptAction extends ActionSupport {
private String user;
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
@Override
public String execute() throws Exception {
System.out.println("execute()...");
return SUCCESS;
}
@Override
public void validate() {
System.out.println("validate()...");
if(user == null || user.length() < 6){
addFieldError("user", "invalid user");
}
}
}
/StrutsHelloWorld/WebRoot/interceptor/output.jsp:
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'output.jsp' starting page</title>
</head>
<body>
<s:property value="user"/>
</body>
</html>
/StrutsHelloWorld/src/struts.xml:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="MyStruts" extends="struts-default">
<!-- 拦截器 -->
<interceptors>
<interceptor name="myInterceptor" class="wintys.struts2.interceptor.MyInterceptor" />
<interceptor name="myParamInterceptor" class="wintys.struts2.interceptor.MyParamInterceptor" >
<param name="info">This is a param.</param>
</interceptor>
<interceptor name="myMethodFilterInterceptor" class="wintys.struts2.interceptor.MyMethodFilterInterceptor">
<param name="includeMethods">execute</param>
</interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="myParamInterceptor">
<param name="info">This is another param.</param>
</interceptor-ref>
<interceptor-ref name="myInterceptor"/>
<interceptor-ref name="myMethodFilterInterceptor"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<action name="intercept" class="wintys.struts2.interceptor.InterceptAction">
<result name="success">/interceptor/output.jsp</result>
<result name="input">/interceptor/input.jsp</result>
<interceptor-ref name="myStack" />
</action>
</package>
</struts>
3、小例子:登录拦截
登录拦截:拦截Action实现在输入信息之前必须登录,如果没有登录,则转到登录页面。
/StrutsHelloWorld/WebRoot/interceptor/login.jsp:
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
</head>
<body>
<s:form action="authentication">
正确id:10000
<s:textfield name="id" label="id" /><br/>
<s:submit name="submit" label=" 提交 " />
</s:form>
</body>
</html>
Struts2中的Session可以脱离容器,以方便测试,对应于容器中的Session。
/StrutsHelloWorld/src/wintys/struts2/interceptor/AuthenticationAction.java:
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")
public class AuthenticationAction extends ActionSupport {
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Override
public String execute() throws Exception {
if( id.equals("10000")){
Map<String , Object> map = ActionContext.getContext().getSession() ;
map.put("id", id);
return SUCCESS;
}
else{
addFieldError("id", "id error");
return INPUT;
}
}
@Override
public void validate() {
if(id == null || id.length() < 3)
addFieldError("id", "invalid id");
}
}
/StrutsHelloWorld/src/wintys/struts2/interceptor/AuthenticationInterceptor.java:
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
/**
* 认证拦截器:判断用户是否已登录
*
* http://www.blogjava.net/wintys
* @author Winty (wintys@gmail.com)
* @version 2009-07-30
*
*/
@SuppressWarnings("serial")
public class AuthenticationInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("AuthenticationInterceptor ...");
Map<String , Object> map = invocation.getInvocationContext().getSession() ;
Object id = map.get("id");
if( id == null){
return Action.LOGIN ;
}else{
System.out.println("id" + id);
return invocation.invoke();
}
}
}
struts.xml配置:
<package name="MyStruts" extends="struts-default">
<!-- 拦截器 -->
<interceptors>
<interceptor name="authenticationInterceptor" class="wintys.struts2.interceptor.AuthenticationInterceptor"/>
<interceptor-stack name="myStack">
<interceptor-ref name="authenticationInterceptor"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<!-- 全局result -->
<global-results>
<result name="login" type="redirect">/interceptor/login.jsp</result>
</global-results>
<action name="intercept" class="wintys.struts2.interceptor.InterceptAction">
<result name="success">/interceptor/output.jsp</result>
<result name="input">/interceptor/input.jsp</result>
<interceptor-ref name="myStack" />
</action>
<action name="authentication" class="wintys.struts2.interceptor.AuthenticationAction">
<result name="success">/interceptor/input.jsp</result>
<result name="input" type="dispatcher" >/interceptor/login.jsp</result>
</action>
</package>
......
[参考资料]:
《浪曦视频之Struts2应用开发系列》
[附件]:
源代码:
struts_HelloWorld_Interceptor.zip
- struts_HelloWorld_Interceptor.zip (7.9 KB)
- 下载次数: 5
发表评论
-
[原]MyEclipse location already exists
2009-07-27 00:37 1751[标题]:[原]MyEclipse location alre ... -
[原]Exception starting filter MyStruts2
2009-07-27 19:41 1076[标题]:[原]Exception starting filt ... -
[原]Struts2校验框架
2009-07-27 23:54 1152[标题]:[原]Struts2校验框架 [时间]:2009- ... -
[原]Struts2-文件上传与下载
2009-08-08 08:48 2211[标题]:[原]Struts2-文件上 ... -
[原]Struts2-国际化
2009-08-10 18:13 1926[标题]:[原]Struts2-国际化 [时间]:2009- ... -
[原]Struts2-深入探索
2009-08-29 20:32 1093[标题]:[原]Struts2-深入探索 [时间]:2009 ... -
[原]Struts2-整合JFreeChart
2009-09-03 17:10 1933[标题]:[原]Struts2-整合JFr ... -
[转]Java 小例子:数据持久化(保存数据到文件)
2009-03-16 11:00 1788说数据持久化,初学者可能还不太懂;但要说把数据保存到文件,这谁 ... -
[原]调试EL函数时,Tomcat提示NullPointerException
2009-04-03 19:02 955[标题]:调试EL函数时,Tomcat提示NullPointe ... -
[原]HelloWorldServlet
2009-05-27 22:16 955编译运行步骤: 1、将HelloWorldServlet.ja ... -
[原]getServletInfo()
2009-05-27 23:16 1412《JSP完全学习手册》学习心得之:getServletInfo ... -
[原]jsp:forward
2009-05-27 23:24 947《JSP完全学习手册》学习心得:jsp:forward Jud ... -
[原]jsp:param
2009-05-27 23:27 1646《JSP完全学习手册》学习心得:jsp:param param ... -
[原]request.getParameterValues()
2009-05-27 23:32 1248《JSP完全学习手册》学习心得:request.getPara ... -
[原]隐含对象config
2009-05-27 23:54 778《JSP完全学习手册》学习心得:隐含对象config < ... -
[原]cookie读写
2009-05-28 00:03 876《JSP完全学习手册》学习心得:cookie读写 <%@ ... -
[原]getHttpHeader
2009-05-28 00:14 864《JSP完全学习手册》学习心得:getHttpHeader g ... -
[原]向MySQL数据库插入Blob数据的问题
2009-06-03 23:45 4003[标题]:向MySQL数据库插 ... -
[原]SQL内外连接
2009-06-17 22:31 939-- Author:Winty(天堂露珠) -- Date: ...
相关推荐
codemirror版本:https://codemirror.net/5/doc/releases.html
外国电影演员识别系统源码分享
mf3010 打印扫描一体机驱动管理软件。
2024免费毕业设计成品,包括源码+数据库+往届论文资料 启动教程:https://www.bilibili.com/video/BV11ktveuE2d 讲解视频:https://www.bilibili.com/video/BV1YfkHYwEME 二次开发教程:https://www.bilibili.com/video/BV1Cw2rY1ErC
chrome-headless-shell-linux64-135.0.7004.0 (Canary).zip
DeepSeek大模型介绍与展望.pptx
英特尔的公版原理图和PCB,cadence版本
《单容水箱液位精准调控:模糊控制策略的深度研究与复现》,单容水箱液位随动系统的模糊控制研究 模糊控制lunwen复现 期刊:化工与自动化仪表(2021年) 图1为结构图,图9为原文结构图, 版本不一样,器件略有调整 图7为结果图,图8为原文结果图 ,单容水箱液位;模糊控制;研究;论文复现;期刊;化工与自动化仪表;结构图;结果图;版本差异;器件调整,"模糊控制研究在单容水箱液位随动系统中的应用与复现"
一个windows上使用的搜索小工具
内容: 这份数据集包含了来自国际大洋发现计划(IODP)第342航次站点U1405、U1406、U1407、U1409和U1410的浮游有孔虫碳酸盐团簇同位素、稳定氧和碳同位素,以及沉积物中的GDGT(甘油二烷基甘油四醚)和烯酮数据。这些站点位于北大西洋的新foundland脊(U1407、U1409和U1410)和J-异常脊(U1405和U1406),用于创建覆盖整个新生代的几乎连续但低分辨率(约每92万年一个样本)的数据拼接,并重建了碳酸盐团簇同位素、TEX86和UK'37海表温度。每个样本包含20立方厘米的沉积物,覆盖2厘米的核心深度区间。年龄模型主要基于详细的船上生物-磁性地层学研究(Norris等,2014)。然而,在40.8 Ma至44.8 Ma时间段内,使用了Cappelli等人(2019)更新的U1410站点年龄模型,通过与U1408站点的年龄模型对比来确定。 访问此数据集,请点击这里:"" ()。
厨房用品分割系统源码&数据集分享
.
监控鞋类物品检测系统源码分享
2024免费毕业设计成品,包括源码+数据库+往届论文资料 启动教程:https://www.bilibili.com/video/BV11ktveuE2d 讲解视频:https://www.bilibili.com/video/BV1YfkHYwEME 二次开发教程:https://www.bilibili.com/video/BV1Cw2rY1ErC
曲线图异常波形检测系统源码分享
内容概要:本文介绍了动车组车号自动识别的现状及其存在的问题,提出了基于图像识别技术的新方法。文中详述了传统人工识别与RFID识别方法的不足,重点阐述了一种新的图像识别系统的设计与实施方案,该系统能够实现在多种恶劣环境下高效精确地获取动车组车号,并通过实际案例展示了这套系统的优势以及其在铁路行业的广阔应用前景。 适用人群:从事铁路运输管理、轨道交通系统开发维护的技术人员,尤其是负责动车组调度、监控及维修工作的相关人员。 使用场景及目标:①用于替代现有人工记录与RFID标签方式,提升动车组车号识别精度与效率;②适用于各种天气状况下的户外作业场景;③旨在构建更加智能化、信息化程度更高的铁路运输体系,助力智慧动车段建设。 其他说明:文中还包括具体的实验对比和技术细节分析,如不同的开机触发装置选择、图像采集设备参数设置、补光措施及识别算法的设计,强调了实际应用场景中可能遇到的问题以及相应的解决方案。
基于AnythingLLM框架和Ollama环境本地运行deepseek,并可以通过用户自己的文档来针对性地回答用户问题,用户也可以上传文件来构建模型回复问题所需要的所有参考资料的知识库,使得模型相对于在线模型更加专业地解答用户的问题。同时本地部署保证了隐私性和针对性。
指针式表盘指针关键部位分割系统源码&数据集分享
多策略增强:MWOA鲸鱼优化算法与其他变体及2024年最新算法的实证比较与结果分析——新颖策略实施效果显著且复杂度无增加的研究,多策略改进的鲸鱼优化算法(MWOA),与其他三种变体和几种2024最新算法比较,策略都是很新颖的策略,可以直接写了发文章,并且没有增加复杂度上改进效果 ,MWOA; 变体算法; 最新算法; 策略新颖; 复杂度未增加; 改进效果显著,"多策略改进MWOA算法:与多种变体及2024新算法比较展示优越性"
织物缺陷检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]