Struts2.1.8框架研究
——作者:Angel
说明:
(1) 本机计算机系统win7
(2) JDK版本1.6
(3) (3)MyEclipse 开发工具8.5
(4) Tomcat服务器是6.0.18
(5) Struts是2.1.8版本
3.2 找到开发struts2应用需要使用到的jar文件 12
5.6 Struts2的处理流程与Action的管理方式 31
8.5 基于XML配置方式实现对指定action方法校验 51
*计算机系统xp/win7
*开发环境JDK
*开发工具MyEclipse
对于如何搭建一个开发平台,我相信对于要学习这个框架的学习者这些都不应该是问题,所以再此不作过多的介绍。
要是有困难的同志可以看备注【1】
<!--EndFragment-->
2、MyEclipse习惯配置[可不配置]
2.1编码配置
【Window】------【Preferences】-----【General】----【Workspace】----【Text file Encoding】---【Other】---【选择UTF-8】
图示:
2.2绑定自己安装的JDK
【Window】------【Preferences】-----【Java】----【Instanded JREs】----【Add】---【Next】---【选择自己安装的JDK,只需要到jdk的路径就可以了,然后确定,Finish】---【在复选框勾上刚配置的JDK,Ok就可以了】
图示:
2.3配置tomcat
这个基本上和上面都差不多。
图示:
2.4配置JSP页面编码
在没有修改JSP页面编码情况下,默认编码是:ISO-8859-1的,而我们经常用的编码是UTF-8,所以习惯上我还是进行修改一下。
首先我们了解一下我们要做一件什么事情以及做这件事情我们需要什么?
我们的最终目标是利用Struts2进行开发,那么我们现在是要搭建一个Struts2的运行平台。首先我们要实现一个经典例子——HelloWorld。要做这么一件事情我们需要什么呢?
很明显我们需要Struts2的相关jar包,其次就是配置问题的(具体怎么配置,当然我们现在都不知道)。
以上我们从感性上对struts2要配置有了一定的了解,接下来让我带大家去理性的了解下。
首先要搭建struts2开发环境,一般需要做如下几个步骤:
1》 下载struts2框架
2》 找到开发struts2应用需要使用到的jar文件
3》 建立工程。
4》 在web.xml中加入struts2 MVC框架启动配置
5》 编写struts2的配置文件
接下来我们一起一步步的进行搭建struts2开发环境。
下载struts可以到struts的官方网站进行下载。官方网站网址为:http://struts.apache.org/
具体的一些操作如图所示:
将下载的压缩包struts.*.*.*.rar进行解压,解压后里面apps,docs,lib等等目录和一些文件。
其中在lib目录里就有开发struts2需要的jar文件,最少需要jar文件如下:
struts2-core-2.1.8.jar : struts2的核心类库
xwork-core-2.1.6.jar : xwork类库,struts2在其之上进行构建
ognl-2.7.3.jar : 对象图导航语言,struts2通过其读写对象的属性
freemarker-2.3.15.jar :struts2的UI标签的模板使用FreeMarker编写
commons-logging-1.0.4.jar : 日志包
commons-fileupload-1.2.1.jar : 文件上传组件 2.1.6版本后必须加入此文件
我们将这些jar包提取出来。
建立web工程:【右键】---【New】--【Web Project】---【输入Project Name : struts2.1.8】--【Finish】--【Yes】
这样我们的工程就建立完成了。
将刚才提取的jar文件放到lib目录下。
当前目录结构如下:
3.4 在web.xml中加入struts2 MVC框架启动配置
要启动struts2那么需要在web.xml中加入一些配置,那么要如何配置呢?我们可以从解压出来的实例提出配置。
在解压出来struts-2.1.8\apps\struts2-blank-2.1.8\WEB-INF就可以找到一个web.xml文件,打开这个文件就可以提取配置,截图如下:
找到配置只要将这些配置复制到我们的工程的web.xml中即可,操作完成效果如下图所示:
Struts.xml的配置文件可以从struts-2.1.8\apps\struts2-blank-2.1.8\WEB-INF\classes进行提取。直接将其拷贝过来,粘贴到src下的根目录下,暂时将里面的配置去掉,效果如下:
将工程发布到tomcat容器中,启动tomcat,如果没有报如何错误的话,那么就说明配置成功。
注:对应的工程在本地文件【demo例子1. 配置project】里
、开发第一个应用程序
配置成功之后我们就可以开发我们的第一个应用程序了。
具体的开发步骤如下:
1》 编写java文件
2》 编写试图文件
3》 配置struts.xml文件
首先我们建立一个包test,然后在该包下建立一个Hello.java文件
目录结构如下:
Hello.java源码如下:
package example;
public class Hello {
private String message="我的第一个struts2程序";//界面显示参数
/**
* @return the message
*/
public String getMessage() {
return message;
}
/**
* @param message the message to set
*/
public void setMessage(String message) {
this.message = message;
}
public String execute(){
return "success";
}
}
在webRoot下编写一个hello.jsp.当前目录结构如下:
hello.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>My JSP 'hello.jsp' starting page</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>
从hello.java获得值为:${message}
</body>
</html>
修改struts.xml的配置,修改为如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="default" extends="struts-default">
<action name="hello" class="example.Hello">
<result name="success">/hello.jsp</result>
</action>
</package>
</struts>
配置完成之后,发布工程,然后在浏览器输入地址:http://127.0.0.1:8080/struts2.1.8/hello
进行访问。
界面运行结果如下:
这样我们的第一个struts2程序就ok了。
注:本例子的工程对应本地的 【2. 第一个struts2程序】
Struts2执行流程大致如下所示:web服务器自动解析struts.xml,初始化消息文件,Action路径映射等资源:初始化框架--à用户请求xxx.action --à struts2过滤器使用对象工厂创建Action类的实例-à执行IOC和拦截器(包括解析表单参数,文件上传,将解析结果注入Action对象。)-à调用Action中用户编写的业务方法-à根据返回的结果路径转向视图层--à视图层进行显示。
首先我们必须清楚我们的访问地址由这些构成的:
ip:端口/工程名称/命名空间/action名称 进行访问的。
如果我们的地址输入成这样子;
ip:端口/工程名称/命名空间/xx1/xx2/action名称 进行访问的。
如果我们在原来的命名空间的基础之上再加入其他的访问路径结构,那么这个访问地址是否能够访问到我们的action呢?
答案是肯定的。要知道这是为什么,那么我们就需要知道Action名称是如何进行搜索的。
首先struts2会去搜索路径/命名空间/xx1/xx2 下是否存在要访问的action,如果没有的话,那么会到上一层路径进行搜索,即路径:/命名空间/xx1 ,如果还是没有的话就又到上一层路径进行搜索,即路径:/命名空间 …一直到struts2的默认路径去搜索。如果搜索不到的话,那么就会报一个404的错误了。
以上是struts2的一个简单配置,缺省了很多配置选项。
我们看看一个比较全的配置:
各项说明如下:
package:是为了管理一组业务相同的action
package-name:可以任意取名,但必须是唯一的,不对应java类包,主要是为了继承使用,其他包可以继承该包。如果 其他包继承了该包的话,那么就可以该包下action了。
package-namespace命名空间:是为了较少重复代码,这一个主要是相对与struts1而言。
package-extends :继承struts2的默认的配置文件,在struts2-core-2.1.8.jar/struts-default.xml下。因为struts2很多核心的功能都是拦截器来实现的,有文件上传,数据验证等等。struts-default.xml定义了拦截器,和result返回类型。
注:包可以通过abstract="true"定义为抽象包,抽象包不能有action
action:是指定一个java文件
action-name:action名称,这个不需要和类名称一致。
action-class: 指定java class路径,如果没有配置的话,默认是ActionSupport
action-method:指定执行方法:如果没有指定,默认访问execute方法
result:指向一个结果视图
result-name:视图名称,如果没有指定,默认是success
注:本例子的配置文件对应本地的 【3. struts2各项配置说明极其默认值】
首先我们先说下forward和redirect的区别:
1.从地址栏显示来说
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.
2.从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.
redirect:不能共享数据.
3.从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.
4.从效率来说
forward:高.
redirect:低.
参考:http://zhidao.baidu.com/question/353280082.html#finish-value
result配置类似于struts1中的forward,但是struts2中提供了多种结果类型:dispatcher(默认值)、redirect、redirectAction、painText。
【dispatcher叙述】
dispatcher(默认值):它对应struts中的 <forward name="succ" path="/WEB-INF/page/admin.jsp" />【 浏览器内部请求转发定向至某一视图】,而上面的配置 <result name="success">/WEB-INF/welcome.jsp</result>就是采用此方式进行浏览器内部请求转发定向至某一视图
【redirect叙述】
如果要实现类似于Struts1中的重定向的方式定位到某一视图,在Struts中就应该使用redirect这种方式来实现,这种结果类型它对应Struts1中<forward name="error" redirect="true" path="/index.jsp" />配置 redirect属性设置为true这样浏览器进行重定向 定向至某一Jsp
注:根据上面Struts2中的Action配置,把视图jsp放到/WEB-INF/..目录中,因为当前的jsp仅供struts的Action使用,所以我们不希望用户通过浏览器直接访问 ,反之当用户在浏览器中直接访问是没有意义的!如果浏览器采用重定向方式进行定位到某一jsp,此时视图jsp就不能放到/WEB-INF/..目录下,所以所谓浏览器重定向就是应到用户浏览器访问某一路径说 白了就是用户直接访问的路径,而此时用户是不能访问/WEB-INF/..目录中的视图,而只有浏览器服务内部请求转发时才能访问/WEB-INF/..中的jsp视图。
参考:http://blog.csdn.net/xinyang_z/article/details/5498606
编写dispatcher例子
(1) 建立文件
》在example下简历dispatcher.java文件
》在WEB-INF下建立page目录,在page目录下建立dispatcher.jsp文件
》dispatcher.java源码如下:
package example;
public class Dispatcher {
private String message="dispatcher试图转发";//界面显示参数
/**
* @return the message
*/
public String getMessage() {
return message;
}
/**
* @param message the message to set
*/
public void setMessage(String message) {
this.message = message;
}
public String execute(){
return "success";
}
}
》dispatcher.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>My JSP 'hello.jsp' starting page</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>
-----: ${message}
</body>
</html>
》配置struts.xml文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="default" extends="struts-default">
<action name="dispatcher" class="example.Dispatcher">
<result name="success">/WEB-INF/page/dispatcher.jsp</result>
</action>
</package>
</struts>
》部署发布访问:http://127.0.0.1:8080/struts2.1.8/dispatcher
编写redirect例子
>>在example包下创建Redirect.java文件,源码如下:
package example;
public class Redirect {
private String message="redirect试图转发";//界面显示参数
/**
* @return the message
*/
public String getMessage() {
return message;
}
/**
* @param message the message to set
*/
public void setMessage(String message) {
this.message = message;
}
public String execute(){
return "success";
}
}
》在webRoot下建立一个redirect.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>My JSP 'hello.jsp' starting page</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>
-----: ${message}
</body>
</html>
》修改struts.xml文件为:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="default" extends="struts-default">
<!-- dispatcher -->
<action name="dispatcher" class="example.Dispatcher">
<result name="success">/WEB-INF/page/dispatcher.jsp</result>
</action>
<!-- redirect -->
<action name="redirect" class="example.Redirect">
<result name="success" type="redirect">/redirect.jsp</result>
</action>
</package>
</struts>
》重新部署工程,访问:http://127.0.0.1:8080/struts2.1.8/redirect
观察浏览器的地址栏发现地址改变为: http://127.0.0.1:8080/struts2.1.8/redirect.jsp
程序在本地demo例子【4. result配置的各种视图转发类型】
【使用场所:】灵活修改,比如公司名称,一旦要修改的话就只需要修改配置了。
我们先把我们的工程进行还原,还原到刚搭建好struts2的时候目录结构为:(而且struts.xml未配置任何package)
先说下我们下载的需求:如果为action的属性注入值。
》建立Test.java文件,源码如下:
public class Test {
private String path;
/**
* @return the path
*/
public String getPath() {
return path;
}
/**
* @param path the path to set
*/
public void setPath(String path) {
this.path = path;
}
public String execute(){
return "success";
}
}
》在webRoot下建立 test.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>My JSP 'index.jsp' starting page</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中的参数:${path}
</body>
</html>
》struts.xml配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="default" extends="struts-default">
<action name="test" class="Test">
<param name="path">/img</param>
<result name="success">/test.jsp</result>
</action>
</package>
</struts>
重新部署工程,访问:http://127.0.0.1:8080/struts2.1.8/test
本工程例子对应:【5. 为Action属性注入值】
我们一般访问struts2文件的路径都是 .action,默认是action,所以可以不书写,那么我们是否可以进行更改呢。答案是可以的,只需要在struts.xml文件进行配置:
<constant name="struts.action.extension" value="do"></constant>
例子对应:【7. 为应用指定多个配置文件】
问题:就是在action中有两个方法,如何调用。
》动态方法调用:
在action名称后面加上!再加上方法的名称。
比如在Test.java中有两个方法
public String execute(){
this.method= "execute";
return "success";
}
public String other(){
this.method="other";
return "success";
}
原来是可以通过
http://127.0.0.1:8080/struts2.1.8/test
去访问的,那么如果要访问other方法,那么可以
这样访问:http://127.0.0.1:8080/struts2.1.8/test!other
以上这种方法不建议使用,可以通过定义常量禁止使用。
<!-- 该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为false -->
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
》通配符action
通配符action就是在action中使用通配符。
如:
访问方式:
http://127.0.0.1:8080/struts2.1.8/test_other
http://127.0.0.1:8080/struts2.1.8/test_excute
问题:如何获取用户提交的请求参数
例子:【8. 请求参数接收】
》局部类型转换器:
例子:【9. 自定义类型转换器】
放到src下即可。
public String execute(){
//获得ActionContext对象
ActionContext act = ActionContext.getContext();
act.getApplication().put("app","当关闭程序才释放的资源");
act.getSession().put("ses","会话管理");
act.put("req","request范围");
return "success";
}
页面获取值:
获取HttpServletRequest
Java文件:
package test;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
public class Test {
private File image;//获得上传文件
private String imageFileName;//获得文件名称
public File getImage() {
return image;
}
public void setImage(File image) {
this.image = image;
}
public String getImageFileName() {
return imageFileName;
}
public void setImageFileName(String imageFileName) {
this.imageFileName = imageFileName;
}
public String execute() throws IOException{
// 保存到硬盘
String realPath = ServletActionContext.getServletContext().getRealPath("/images");
System.out.println(realPath);
File savefile = new File(new File(realPath),imageFileName);
if(image != null){
if(!savefile.getParentFile().exists()){
savefile.getParentFile().mkdirs();
}
FileUtils.copyFile(image, savefile);
ActionContext.getContext().put("alert","上传成功!");
}
return "success";
}
}
Jsp文件:
<body>
${ pageContext.request.contextPath }<br/>
<form action="${ pageContext.request.contextPath}/fileup/test.action"
enctype="multipart/form-data"
method="post">
<input type="file" name="image"><input type="submit" value="上传"/>
</form>
</form>
</body>
修改下java文件即可:
package test;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
public class Test {
private File[] image;//获得上传文件
private String[] imageFileName;//获得文件名称
public File[] getImage() {
return image;
}
public void setImage(File[] image) {
this.image = image;
}
public String[] getImageFileName() {
return imageFileName;
}
public void setImageFileName(String[] imageFileName) {
this.imageFileName = imageFileName;
}
public String execute() throws IOException{
// 保存到硬盘
String realPath = ServletActionContext.getServletContext().getRealPath("/images");
System.out.println(realPath);
int size = image.length;
if(image != null){
File saveDir = new File(realPath);
if(!saveDir.exists()){
saveDir.mkdirs();
}
for(int i=0;i<size;i++){
File savepath = new File(saveDir,imageFileName[i]);
FileUtils.copyFile(image[i], savepath);
}
ActionContext.getContext().put("alert","上传成功!");
}
return "success";
}
}
页面代码:
<%@ 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>My JSP 'index.jsp' starting page</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>
${ pageContext.request.contextPath }<br/>
<form action="${ pageContext.request.contextPath}/fileup/test.action"
enctype="multipart/form-data"
method="post">
<input type="file" name="image"><br/>
<input type="file" name="image">
<input type="submit" value="上传"/>
</form>
</form>
</body>
</html>
问题的提出:如果用户登录后可以访问action中的所有方法,如果用户没有登录不允许用户访问action中的方法。
问题的分析:struts2中有很多自带的拦截器,我们可以在这基础进行扩展。
问题的解决:
》建立java文件。
建立 test/Test.java, 源码如下:
package test;
public class Test {
public String execute(){
return "success";
}
}
建立 interceptor/PermissionInterecptor.java,源码如下:
package interceptor;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class PermissionInterceptor implements Interceptor{
//摧毁
public void destroy() {
// TODO Auto-generated method stub
}
//--实例化
public void init() {
// TODO Auto-generated method stub
}
public String intercept(ActionInvocation invacation) throws Exception {
// TODO Auto-generated method stub
Object user = ActionContext.getContext().getSession().get("user");
if(user != null){
ActionContext.getContext().put("message","登录成功!");
return invacation.invoke();//调用该方法,拦截到的方法就会执行。
}
ActionContext.getContext().put("message","无权限");
return "success";
}
}
》编写jsp代码。
编写webRoot/alert.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>My JSP 'index.jsp' starting page</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>
-------: ${message }
</body>
</html>
编写login.jsp,代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
//---------------
request.getSession().setAttribute("user","angel");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'login.jsp' starting page</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>
用户已登录
</body>
</html>
》编写quit.jsp,代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
//=-------------
request.getSession().removeAttribute("user");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'login.jsp' starting page</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>
用户退出登录
</body>
</html>
》修改配置文件struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="default" namespace="/test" extends="struts-default">
<!--定义=== 自定义拦截器 -->
<interceptors>
<interceptor name="permission" class="interceptor.PermissionInterceptor"></interceptor>
<interceptor-stack name="permissionStack">
<interceptor-ref name="defaultStack" /><!-- struts2默认的拦截器,要放在最前面 -->
<interceptor-ref name="permission" />
</interceptor-stack>
</interceptors>
<action name="test_*" class="test.Test" method="{1}">
<!-- 使用拦截器 -->
<interceptor-ref name="permissionStack"></interceptor-ref>
<result name="success">/alert.jsp</result>
</action>
</package>
</struts>
》重新部署发布工程,访问。
首先在浏览器输入:
http://127.0.0.1:8080/struts2.1.8/login.jsp
注:会提示用户已登录。
接着输入:
http://127.0.0.1:8080/struts2.1.8/test/test.action
再者输入:
http://127.0.0.1:8080/struts2.1.8/quit.jsp
最后在输入:
http://127.0.0.1:8080/struts2.1.8/test/test.action
例子在本地 【12. 自定义拦截器】
注:如果要使得package里的action使用拦截器,可以在package里配置:
<default-interceptor-ref name="permissionStack" />
问题:在前台有一个用户名和手机号的输入,现在在提交数据的时候要进行判断数据是否合理。
让action继承ActionSupport重写里面的validate()方法
例子:【13. 对Action中所有方法进行输入校验】
值在验证失败回到原来页面的时候会丢失的解决方案
http://blog.csdn.net/mengfanpp/article/details/2200309
<!--EndFragment-->