一个 struts2 入门级的小事例 (Action , 拦截器使用)
一个 struts2 入门级的小例子 (Action , 拦截器使用)
如果用注释,怎么配置相关Action的拦截器?
你可以参考下这篇文章 - http://zhaosoft.iteye.com/blog/272290
我想在struts.xml中配置一个全局的过滤器,其他的xml配置文件里都能直接引用,怎么使用呢?
声明一个默认的拦截栈,把你自己定义的拦截器,加上struts2默认的连接器组合一个拦截栈而这个拦截栈就是你要声明的默认拦截栈
改动不错。
我的异常网推荐解决方案:The server encountered an internal error () that prevented it from fulfilling this request.,http://www..net/java-web/317.html
myeclipse5.5 + tomcat5.5 + jdk1.5 需要的朋友可以直接下载看看 ^_^ ...
首先是 actions 包里的类 (2个 action ,一个拦截器)
1.CheckLoginInterceptor
/*************************************************
@Copyright (C), 2008, lzpeng
@File name: CheckLoginInterceptor.java
@Author: lzpeng
@CreateDate: 2008-6-17
@Description: CheckLoginInterceptor拦截器
@Extends: AbstractInterceptor
@Function List:
1. public String intercept()
*************************************************/
package cn.com.lzpeng.actions;
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class CheckLoginInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = 1L;
public static final String USER_SESSION_KEY="user";
@Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
System.out.println("begin check login interceptor");
// 对LoginAction不做该项拦截
Object action = actionInvocation.getAction();
if (action instanceof LoginAction) {
System.out
.println("exit check login, because this is login action.");
return actionInvocation.invoke();
}
// 验证 session
Map session = actionInvocation.getInvocationContext().getSession();
String username = (String) session.get(USER_SESSION_KEY);
if (username != null) {
// 存在的情况下进行后续操作。
System.out.println(username+" already login!");
return actionInvocation.invoke();
} else {
// 否则终止后续操作,返回LOGIN
System.out.println("no login, forward login page!");
return Action.LOGIN;
}
}
}
2.LoginAction
/*************************************************
@Copyright (C), 2008, lzpeng
@File name: LoginAction.java
@Author: lzpeng
@CreateDate: 2008-6-17
@Description: LoginAction控制类
@Extends: ActionSupport
@Function List:
1. public UserBean getUserBean()
返回一个UserBean实体
2. public void setUserBean(UserBean userBean)
设置一个UserBean实体
3. public String execute()
执行Action的方法
4.public void setSession()
设置 session 值
*************************************************/
package cn.com.lzpeng.actions;
import com.opensymphony.xwork2.ActionSupport;
import cn.com.lzpeng.entity.UserBean;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
public class LoginAction extends ActionSupport implements SessionAware {
private static final long serialVersionUID = 1L;
private UserBean userBean;
private Map<String, String> session;
public UserBean getUserBean() {
return userBean;
}
public void setUserBean(UserBean userBean) {
this.userBean = userBean;
}
@Override
public String execute() {
if (userBean == null) {
return LOGIN;
}
String name = userBean.getName();
String pwd = userBean.getPassword();
session.put(CheckLoginInterceptor.USER_SESSION_KEY, name);
if (name.equals("java") && pwd.equals("struts")) {
return SUCCESS;
} else {
return ERROR;
}
}
public void setSession(Map session) {
this.session = session;
}
}
3.TestInterceptorAction
/*************************************************
@Copyright (C), 2008, lzpeng
@File name: LoginAction.java
@Author: lzpeng
@CreateDate: 2008-6-17
@Description: TestInterceptorAction控制类
@Extends: ActionSupport
@Function List:
1.public String execute()
执行 Action 的方法
*************************************************/
package cn.com.lzpeng.actions;
import com.opensymphony.xwork2.ActionSupport;
public class TestInterceptorAction extends ActionSupport {
private static final long serialVersionUID = 1L;
@Override
public String execute() {
return SUCCESS;
}
}
这个是实体类 UserBean.java
/*************************************************
@Copyright (C), 2008, lzpeng
@File name: LoginAction.java
@Author: lzpeng
@CreateDate: 2008-6-17
@Description: UserBean实体类
*************************************************/
package cn.com.lzpeng.entity;
public class UserBean {
private String name;
private String password;
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public String getPassword() {
return password;
}
}
struts.xml
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 加载默认的 struts2 配置文件 -->
<include file="struts-default.xml" />
<!-- 继承默认的 struts2 配置文件 -->
<package name="default" extends="struts-default">
<!-- 定义一个名为 checkLogin 的拦截器 -->
<interceptors>
<!-- 定义权限检查拦截器 -->
<interceptor name="checkLogin"
class="cn.com.lzpeng.actions.CheckLoginInterceptor" />
<!-- 定义一个包含权限检查的拦截器栈 -->
<interceptor-stack name="myDefaultStack">
<!-- 定义拦截器栈包含checkLogin拦截器 -->
<interceptor-ref name="checkLogin"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 设置全局 全局默认的拦截器栈-->
<default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>
<!-- 定义全局Result -->
<global-results>
<!-- 当返回login视图名时,转入/login.jsp页面 -->
<result name="login">/login.jsp</result>
</global-results>
<!--
action 标签里 name属性代表我们要处理的.action的前面部分
action 标签里 class属性代表我们需要哪个类来处理
result 标签的 name属性代表action类的执行方法的返回值,
action类的默认执行方法是public String execute()
-->
<action name="login"
class="cn.com.lzpeng.actions.LoginAction">
<result name="success">success.jsp</result>
<result name="error">error.jsp</result>
<result name="login">login.jsp</result>
<!--拦截器一般配置在 result 元素之后 -->
<interceptor-ref name="myDefaultStack" />
</action>
<action name="testInterceptor"
class="cn.com.lzpeng.actions.TestInterceptorAction">
<result name="success">content.jsp</result>
<result name="login">login.jsp</result>
</action>
</package>
</struts>
最后是 4个 jsp界面
login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% 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>struts2</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"> --> </head> <body> <!—- 注意这里action="login.action" 因为要与Struts.xml里你注册的那个别名叫"login" --> <form action="login.action" method="post" > <fieldset> <legend> 用户登录 </legend> <p align="center"> 帐 号: <input type="text" name="userBean.name" /> <!—- 注意这里一定要写name="bean.name", 因为要与LoginAction.java里面定义的bean对应 name是它的helloWorld的属性 --> </p> <p align="center"> 密 码: <input type="password" name="userBean.password" /> </p> <p align="center"> <input type="submit" value="登 录" /> </p> </fieldset> </form> </body> </html>
success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
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">
-->
</head>
<body>
<form action="testInterceptor.action">
<div align="center">
恭喜${userBean.name}登录成功了 !
<br>
只有通过这才能访问 content.jsp!
<br>
<br>
<input type="submit" value=" content.jsp">
<br>
<br>
主要演示拦截器 CheckLoginInterceptor 对 TestInterceptorAction 的拦截情况(可以试直接访问
TestInterceptorAction.action)
</div>
</form>
</body>
</html>
error.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% 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>error</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"> --> </head> <body> <div align="center"> 这是一个错误界面 ! 用以下帐号试试:<br> id : java<br> password: struts </div> <div> <a href="login.jsp">返回登录界面</a> </div> </body> </html>
content.jsp //为测试 拦截器 写的
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% 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>content</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"> --> </head> <body><div align="center"> 这里是 content.jsp! <br> 成功通过拦截器 CheckLoginInterceptor...... <br> 复制上边地址 , 在新打开的窗口里粘贴 , 回车试试...... </div> </body> </html>
7 楼
flyfan
2008-06-24
对楼主有几点点评:
有好例子分享一下,挺不错,注释方面很不错;
现在都用sturts2了,为什么还是myeclipse5.5+jdk1.5+tomcat5.5,应该换成myeclipse6.0+jdk1.6+tomcat6.0了吧
代码不格式化,特别是jsp,不删除多余的代码,又浪费流量了,阅读性不好
哈哈,乱说话,不要介意
有好例子分享一下,挺不错,注释方面很不错;
现在都用sturts2了,为什么还是myeclipse5.5+jdk1.5+tomcat5.5,应该换成myeclipse6.0+jdk1.6+tomcat6.0了吧
代码不格式化,特别是jsp,不删除多余的代码,又浪费流量了,阅读性不好
哈哈,乱说话,不要介意
8 楼
zhou568xiao
2008-07-29
多谢了,借来看看!
9 楼
freecode
2008-08-13
我的环境:struts2.0.11.2+spring2.5.5+jpa,我点了登录后,老报
No result defined for action quickstart.action.LoginAction and result success
包名我换了,报错的大概意思是找不到对应的success和error的页面。
No result defined for action quickstart.action.LoginAction and result success
包名我换了,报错的大概意思是找不到对应的success和error的页面。
10 楼
h_yz
2008-08-14
正在学习呢,呵呵,先下来在说,谢谢楼主大哥了
11 楼
Acaleph
2008-09-08
如果用注释,怎么配置相关Action的拦截器?
12 楼
yuxianghong
2008-09-09
简单,明了!
13 楼
tmxiaozhiwei
2008-09-24
谢谢楼主,好东西
14 楼
zhenglimeng1983
2008-09-24
不错啊,刚学习
15 楼
yongtree
2008-12-05
我想在struts.xml中配置一个全局的过滤器,其他的xml配置文件里都能直接引用,怎么使用呢?
16 楼
e_sky
2008-12-08
Acaleph 写道
如果用注释,怎么配置相关Action的拦截器?
你可以参考下这篇文章 - http://zhaosoft.iteye.com/blog/272290
17 楼
e_sky
2008-12-08
yongtree 写道
我想在struts.xml中配置一个全局的过滤器,其他的xml配置文件里都能直接引用,怎么使用呢?
声明一个默认的拦截栈,把你自己定义的拦截器,加上struts2默认的连接器组合一个拦截栈而这个拦截栈就是你要声明的默认拦截栈
18 楼
lndalian2000
2008-12-17
HTTP Status 500 -
--------------------------------------------
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: java.lang.IllegalStateException: Action has already executed
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:515)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)
root cause
java.lang.IllegalStateException: Action has already executed
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
cn.com.lzpeng.actions.CheckLoginInterceptor.intercept(CheckLoginInterceptor.java:36)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:50)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:504)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.16 logs.
怎么会有上面的错误啊?
--------------------------------------------
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: java.lang.IllegalStateException: Action has already executed
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:515)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)
root cause
java.lang.IllegalStateException: Action has already executed
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
cn.com.lzpeng.actions.CheckLoginInterceptor.intercept(CheckLoginInterceptor.java:36)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:50)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:504)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.16 logs.
怎么会有上面的错误啊?
19 楼
wafa2005081027
2009-02-09
楼主的代码可能有点小问题。
问题代码:
session.put(CheckLoginInterceptor.USER_SESSION_KEY, name);
if (name.equals("java") && pwd.equals("struts")) {
return SUCCESS;
} else {
return ERROR;
}
问题:当一用户胡乱输入一个用户名,然后转到登录页面,提示他重新登录。然而上面的代码已经将用户名填充到session中,这时该用户转到content页面时就可以成功了。
改动:
if (name.equals("java") && pwd.equals("struts")) {
session.put(CheckLoginInterceptor.USER_SESSION_KEY, name);
return SUCCESS;
} else {
return ERROR;
}
问题代码:
session.put(CheckLoginInterceptor.USER_SESSION_KEY, name);
if (name.equals("java") && pwd.equals("struts")) {
return SUCCESS;
} else {
return ERROR;
}
问题:当一用户胡乱输入一个用户名,然后转到登录页面,提示他重新登录。然而上面的代码已经将用户名填充到session中,这时该用户转到content页面时就可以成功了。
改动:
if (name.equals("java") && pwd.equals("struts")) {
session.put(CheckLoginInterceptor.USER_SESSION_KEY, name);
return SUCCESS;
} else {
return ERROR;
}
20 楼
yijingyong
2009-02-10
好东西,浏览JAVA代码很舒心
21 楼
lovu
2009-02-11
wafa2005081027 写道
楼主的代码可能有点小问题。
问题代码:
session.put(CheckLoginInterceptor.USER_SESSION_KEY, name);
if (name.equals("java") && pwd.equals("struts")) {
return SUCCESS;
} else {
return ERROR;
}
问题:当一用户胡乱输入一个用户名,然后转到登录页面,提示他重新登录。然而上面的代码已经将用户名填充到session中,这时该用户转到content页面时就可以成功了。
改动:
if (name.equals("java") && pwd.equals("struts")) {
session.put(CheckLoginInterceptor.USER_SESSION_KEY, name);
return SUCCESS;
} else {
return ERROR;
}
问题代码:
session.put(CheckLoginInterceptor.USER_SESSION_KEY, name);
if (name.equals("java") && pwd.equals("struts")) {
return SUCCESS;
} else {
return ERROR;
}
问题:当一用户胡乱输入一个用户名,然后转到登录页面,提示他重新登录。然而上面的代码已经将用户名填充到session中,这时该用户转到content页面时就可以成功了。
改动:
if (name.equals("java") && pwd.equals("struts")) {
session.put(CheckLoginInterceptor.USER_SESSION_KEY, name);
return SUCCESS;
} else {
return ERROR;
}
改动不错。
22 楼
douglass
2009-04-28
太谢谢了 刚刚struts1 转到struts2 遇到了许多问题 和struts1有太多不同了
23 楼
feiyu107
2009-04-29
<div class="quote_title">doltter 写道</div>
<div class="quote_div">其实注册页面也要避免 <br>我一般会重新用一个interceptor-stack <br>不过你这个方法也可以,把所有不需要登陆就能看的都放到loginAction里面来</div>
<p> </p>
<p>说的对啊</p>
<div class="quote_div">其实注册页面也要避免 <br>我一般会重新用一个interceptor-stack <br>不过你这个方法也可以,把所有不需要登陆就能看的都放到loginAction里面来</div>
<p> </p>
<p>说的对啊</p>
24 楼
bryan.liu
2009-05-04
顶原创!楼主加油
Security楼主有没有考虑过Spring-Security呢?
Security楼主有没有考虑过Spring-Security呢?
25 楼
alswl
2009-05-12
觉得jps页面可以用标签库来表现,大段的java代码总是感觉怪怪的
还有就是代码里的System.out.println(),可以用Log4j,方便使用时候控制输出级别
还有就是代码里的System.out.println(),可以用Log4j,方便使用时候控制输出级别
26 楼
z_9400
2012-01-10
http://localhost:8080/struts2_base/content.jsp 输到地址栏就可以访问了
我的异常网推荐解决方案:The server encountered an internal error () that prevented it from fulfilling this request.,http://www..net/java-web/317.html