您的位置:首页 > 编程语言 > Java开发

Struts2框架详解

2016-06-28 20:33 357 查看
目录:

1.Struts2的工作原理

2.Struts2的搭建

3.Struts2的核心文件

3.1Struts.xml配置详解

4.Struts2重点

4.1动态方法调用

4.2多个配置文件

4.3Action搜索顺序

4.4从界面输入接收参数(登陆为例)

4.5处理并返回结果(响应前端页面)

4.6Action后缀设置

4.7访问ServletAPI

4.8默认Action

5.Struts2拦截器

5.1拦截器的定义

5.2拦截器的作用

5.3自定义拦截器

5.4内建拦截器

5.5拦截器的应用

6.Struts2的标签

7.Struts2的注解
---------------------------------------------------------------------------------------------------------------------------

1.Struts2的工作原理



ps:FilterDispatcher(2.1.3之前)和StrutsPrepareAndExecuteFilter(2.1.3之后推荐使用)的区别主要是后者可以在过滤器之前添加自己的过滤器,如果在前者之前添加自定义拦截器,会失去对action的过滤作用

2.Struts2的搭建

2.1新建WEB项目
2.2导入strutsjar包(9个包,包名如下,其他包的可以根据需要导入)



2.3Bulidpath添加依赖(右键项目选择Bulidpath->configureBulidPath->addJARs)



2.4配置web.xml

<?xmlversion="1.0"encoding="UTF-8"?>
<web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID"version="3.0">
<display-name>struts2</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<!--StrutsPrepareAndExecuteFilter是自2.1.3以后对FilterDispicther的替换-->
</filter>
<filter-mapping>
<filter-name>struts2</filter-name><!--此处的name和<filter>中的name一致-->
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>


2.5src下创建struts.xml

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEstruts-configPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.3//EN""http://jakarta.apache.org/struts/dtds/struts-config_2.3.dtd">
<struts>
<!--写相关配置-->
</struts>


2.6src下创建action继承ActionSupport(例子)

packagecom.struts2.action;
importcom.opensymphony.xwork2.ActionSupport;
publicclassHelloWorldActionextendsActionSupport{
@Override
publicStringexecute()throwsException{
System.out.println("执行Action");
returnSUCCESS;
}
}


2.7struts.xml配置

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEstruts-configPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.3//EN""http://jakarta.apache.org/struts/dtds/struts-config_2.3.dtd">
<struts>
<packagename="delfaut"namespace="/"extends="struts-default">
<!--
package:类似于java中的包
name:包的名字,可以自定义
namespace:书面值得命名空间,默认为'/',如果未填,当你页面请求action时就会到根目录寻找包名为login下的action,如果你填写了namespace为'/system',就会到相应的目录下寻找,如果没找到,还会到根目录下继续寻找对应的action,如果还是未找到就会报错
extends:类似于java中的继承特征,extends="struts-default"就是继承struts-default.xml,它里面定义了许多跳转类型、拦截器等一些常用的东西
-->
<actionname="struts2"class="com.struts2.action.HelloWorldAction">
<resultname="">/result.jsp</result>
</action>
</package>
</struts>


2.8建result.jsp文件与<resultname="">/result.jsp</result>的result.jsp一致

<%@pagelanguage="java"import="java.util.*"pageEncoding="ISO-8859-1"%>
<%
Stringpath=request.getContextPath();
StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
<html>
<head>
<basehref="<%=basePath%>">
<title>MyJSP'result.jsp'startingpage</title>
<metahttp-equiv="pragma"content="no-cache">
<metahttp-equiv="cache-control"content="no-cache">
<metahttp-equiv="expires"content="0">
<metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
<metahttp-equiv="description"content="Thisismypage">
<!--
<linkrel="stylesheet"type="text/css"href="styles.css">
-->
</head>
<body>
ThisismyJSPpage.<br>
</body>
</html>


2.9测试




3.Struts2的核心文件


3.1Struts.xml配置详解


<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd">
<!--struts.xml配置包含
1.常量参数配置
2.文件包含导入配置
3.命名空间的配置
4.包的配置
5.Action配置
6.拦截器配置
-->
<struts>
<!--1.常量参数配置
参数主要设置一些struts的环境或者其他属性
可以在Struts2的核心配置文件struts.propertie配置导入
-->
<!--设置action的扩展名-->
<constantname="struts.action.extension"value="action"/>
<!--设置默认编码-->
<constantname="struts.i18n.encoding"value="utf8"/>
<!--设置默认locale-->
<constantname="struts.locale"value="zh_CN"/>
<!--设置国际化资源文件,多个文件用逗号隔开-->
<constantname="struts.custom.i18n.resources"value="messageResourse"/>
<!--设置struts默认ObjectFactory为spring-->
<constantname="struts.objectFactory"value="spring"/>
<!--设置允许静态方法调用-->
<constantname="struts.ognl.allowStaticMethodAccess"value="true"/>
<!--设置应用是否处于开发模式-->
<constantname="struts.devMode"value="true"/>
<!--设置默认主题-->
<constantname="struts.ui.theme"value="simple"/>
<!--2.文件包含导入配置
在struts2中配置文件可分为多个,我可以通过struts.xml来包含其他配置文件
file属性指定文件名
-->
<includefile="struts-user.xml"/>
<!--3.命名空间的配置
考虑到struts2中可能会出现同名的Action,所以采用命名空间来区别
同一个命名空间不能出现名字相同的Action,我们通过在包中指定namespace
参数值来指定,如果未指定,默认为"",如果指定命名空间,访问action时候
需要在actionname前添加命名空间,例如:http://localhost:8080/工程名/命名空间/Action名.后缀
-->
<packagename="default"extends="struts-default"namespace="test">
<actionname="action_name"class="com.struts2.action.HelloWorldAction">
<result>/result.jsp</result>
</action>
</package>
<!--4.包的配置
包配置中的属性:(1)name:指定包的名字,必填
(2)extends:指定包继承的包,可以继承其他包的Action定义和拦截器定义,可选
(3)namespace:指定包的命名空间,可选
-->
<packagename="default"extends="struts-default"namespace="test">
<!--定义全局result-->
<global-results>
<resultname="返回值名">页面相对地址</result>
</global-results>
<!--定义全局异常映射-->
<global-exception-mappings>
<exception-mappingresult="excptionresult"
exception="exceptionclass"/>
</global-exception-mappings>
<!--5.Action配置
Action中的属性
(1)name:指定action名,用于访问链接
(2)class:指定Action实现类的路径
-->
<actionname="sayhello"class="com.struts2.action.HelloAction">
<!--设置名为success的result-->
<result>/welcome.jsp</result>
<!--设置名为input的result-->
<resultname="input">/index.jsp</result>
<!--在action中定义自定义和默认拦截器-->
<interceptor-refname="自定义拦截器名"></interceptor-ref>
<interceptor-refname="defaultStack"></interceptor-ref>
</action>
<!--6.拦截器配置
-->
<!--配置自定义拦截器-->
<interceptors>
<interceptorname="拦截器名"class="拦截器绝对地址"></interceptor>
</interceptors>
</package>
</struts>



4.Struts2重点


4.1动态方法调用

4.1.1指定method属性,与Action类中的方法名一致(一个方法需要添加一个Action,代码量相对比较多,不推荐使用)
1)建立Action类HelloWorldAction.java

packagecom.struts2.action;
importcom.opensymphony.xwork2.ActionSupport;
publicclassHelloWorldActionextendsActionSupport{
/**
*
*/
privatestaticfinallongserialVersionUID=1L;
/**
*Action默认调用该执行方法
*/
@Override
publicStringexecute()throwsException{
System.out.println("execute方法执行了!");
returnSUCCESS;
}
/**
*add方法
*/
publicStringadd(){
System.out.println("add方法执行了!");
returnSUCCESS;
}
/**
*delete方法
*/
publicStringdelete(){
System.out.println("delete方法执行了!");
returnSUCCESS;
}
}


2)struts.xml配置如下

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!--设置action的扩展名-->
<constantname="struts.action.extension"value="action"/>
<packagename="default"extends="struts-default"namespace="/">
<!--对应默认的excute方法-->
<actionname="sayhello"class="com.struts2.action.HelloWorldAction">
<!--设置名为success的result-->
<resultname="success">/default.jsp</result>
</action>
<!--对应add方法-->
<actionname="addAction"method="add"class="com.struts2.action.HelloWorldAction">
<resultname="success">/add.jsp</result>
</action>
<!--对应delete方法-->
<actionname="deleteAction"method="delete"class="com.struts2.action.HelloWorldAction">
<resultname="success">/delete.jsp</result>
</action>
</package>
</struts>


3)add.jsp/delete.jsp/default.jsp页面可自行建立

4.1.2!(不推荐使用)
1)建立Action类HelloWorldAction.java

packagecom.struts2.action;
importcom.opensymphony.xwork2.ActionSupport;
publicclassHelloWorldActionextendsActionSupport{
/**
*
*/
privatestaticfinallongserialVersionUID=1L;
/**
*Action默认调用该执行方法
*/
@Override
publicStringexecute()throwsException{
System.out.println("execute方法执行了!");
returnSUCCESS;
}
/**
*add方法
*/
publicStringadd(){
System.out.println("add方法执行了!");
return"add";
}
/**
*delete方法
*/
publicStringdelete(){
System.out.println("delete方法执行了!");
return"delete";
}
}


2)struts.xml配置如下

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!--设置action的扩展名-->
<constantname="struts.action.extension"value="action"/>
<!--配置开启动态调用-->
<constantname="struts.enable.DynamicMethodInvocation"value="true"></constant>
<packagename="default"extends="struts-default"namespace="/">
<actionname="sayhello"class="com.struts2.action.HelloWorldAction">
<!--设置名为success的result-->
<resultname="success">/default.jsp</result>
<resultname="add">/add.jsp</result>
<resultname="delete">/delete.jsp</result>
</action>
</package>
</struts>


3)页面可与上一种方法一致

ps:访问路径:(1)http://localhost:8080/struts2/sayhello.action(2)http://localhost:8080/struts2/sayhello!add.action
(3)http://localhost:8080/struts2/sayhello!delete.action

4.1.3通配符(推荐使用)
1)Action类与第二种配置方式的代码一致
2)struts.xml配置如下(ps:{1}表示第一个星号的位置,{2}表示第二个,以此类推)

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!--设置action的扩展名-->
<constantname="struts.action.extension"value="action"/>
<packagename="default"extends="struts-default"namespace="/">
<actionname="*_*"method="{2}"class="com.struts2.action.{1}Action">
<!--设置名为success的result-->
<resultname="success">/{2}.jsp</result>
<resultname="add">/{2}.jsp</result>
<resultname="delete">/{2}.jsp</result>
</action>
</package>
</struts>


3)页面与2种配置的一致

ps:访问路径:(1)http://localhost:8080/struts2/HelloWorld_delete.action
(2)http://localhost:8080/struts2/HelloWorld_add.action(3)http://localhost:8080/struts2/HelloWorld_default.action


4.2多个配置文件

当有很多Action的时候我们不可能全配置到struts.xml中,这样显得struts.xml极其臃肿,所以struts2提供了一种文件导入的功能
我可以把每一个Action见一个xml文件通过<includefile=""></include>指定导入。


4.3Action搜索顺序

Action检索的顺序是按着从最长路径去查询是否有目标Action如果没有继续往上一级找,举个我访问sayhello.action的例子:
第一步它会检索访问:http://localhost:8080/struts2/path1/path2/path3/sayhello.action,如果找不到,第二步他会检索访问:http://localhost:8080/struts2/path1/path2/sayhello.action,

以此类推第三步会检索访问:http://localhost:8080/struts2/path1/sayhello.action


4.4从界面输入接收参数(登陆为例)

4.4.1从Action的属性接收

1)login.jsp表单代码

<formaction="login.action"method="post">
用户名:<inputtype="text"id="username"name="username"><br>密码:<input
type="password"id="password"name="password"><br><inputtype="submit"
value="提交">
</form>


2)struts.xml配置

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!--设置action的扩展名-->
<constantname="struts.action.extension"value="action"/>
</package>-->
<packagename="default"extends="struts-default"namespace="/">
<actionname="login"method="login"class="com.struts2.action.LoginAction">
<resultname="success">/welcome.jsp</result>
</action>
</package>
</struts>


4)LoginAction.java代码

packagecom.struts2.action;
importcom.opensymphony.xwork2.ActionSupport;
publicclassLoginActionextendsActionSupport{
privateStringusername;
privateStringpassword;
/*
*属性的getset方法
*/
publicStringgetUsername(){
returnusername;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
/*
*登陆方法
*/
publicStringlogin(){
System.out.println("用户名:"+username);
System.out.println("密码:"+password);
return"success";
}
}


5)注:LoginAction.java中的属性要和login.jsp的表单name属性名称一致,同时LoginAction.java要实现属性的get/set方法

4.4.2从JavaBean接收

1)login.jsp表单代码

<formaction="login.action"method="post">
用户名:<inputtype="text"id="username"name="user.username"><br>密码:<input
type="password"id="password"name="user.password"><br><inputtype="submit"
value="提交">
</form>


2)struts.xml配置(同4.4.1)

3)JavaBeanUser.java

packagecom.struts2.bean;
publicclassUser{
privateStringusername;
privateStringpassword;
/*
*属性的getset方法
*/
publicStringgetUsername(){
returnusername;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
}


4)LoginAction.java代码

packagecom.struts2.action;
importcom.opensymphony.xwork2.ActionSupport;
importcom.struts2.bean.User;
publicclassLoginActionextendsActionSupport{
privateUseruser;
publicUsergetUser(){
returnuser;
}
publicvoidsetUser(Useruser){
this.user=user;
}
/*
*登陆方法
*/
publicStringlogin(){
System.out.println("用户名:"+user.getUsername());
System.out.println("密码:"+user.getPassword());
return"success";
}
}


6)注:注意LoginAction.java中的User并不是实例化一个User而是声明一个User类型的属性,并且实现get/set方法,同时还要注意表单提交时候name属性写成user.username的形式才会映射到JavaBean从而映射到Action,不过该方法不建议使用,因为不满足代码的低耦合,后端的更改会直接影响前端。

4.4.3从ModelDriven获取

1)login.jsp表单代码(同4.4.1)
2)struts.xml配置(同4.4.1)
3)JavaBeanUser.java(同4.4.2)

4)LoginAction.java代码

packagecom.struts2.action;
importcom.opensymphony.xwork2.ActionSupport;
importcom.opensymphony.xwork2.ModelDriven;
importcom.struts2.bean.User;
publicclassLoginActionextendsActionSupportimplementsModelDriven<User>{
privateUseruser=newUser();
/*
*登陆方法
*/
publicStringlogin(){
System.out.println("用户名:"+user.getUsername());
System.out.println("密码:"+user.getPassword());
return"success";
}
/**
*继承自接口ModelDriven得方法
*@returnUser
*/
@Override
publicUsergetModel(){
returnuser;
}
}


5)注:此方法获取参数需要在LoginAction.java中实现ModelDriven接口,同时重写getModel()方法,注意这里的User需要实例化,并不是仅仅声明一个变量,与4.4.2是有区别的。

4.4.4获取ServletAPI通过Servlet方法获取参数

1)注:访问ServletAPI的方法下面会说到,至于Servlet如何获取请求数据,可以单独学习Servlet进行了解学习


4.5处理并返回结果(响应前端页面)

注:处理并返回结果前端接收,这里涉及两个方面,一是后端,后端接收/返回数据的方法有:1)通过访问ServletAPI放回数据;2)通过action的JavaBean/ModelDriven映射
二是前端,前端接收/提交数据的方法有:1)jsp运用java代码访问Servlet内置对象;2)EL表达式;3)OGNL表达式4)struts2标签5)AJAX异步请求

ps:后面会有一种Struts注解映射的方式。


4.6Action后缀设置

1)struts.xml配置

<!--设置action的扩展名-->
<constantname="struts.action.extension"value="action"/>


2)注:配置扩展后缀还可以在struts.properties和web.xml中配置,同时不配置的话默认为.action和不加后缀都可访问,如果配置了后缀访问时不加后缀会出错,同时也可以配置多个后缀以逗号分隔。


4.7访问ServletAPI

4.7.1通过ActionContext访问

//Map<String,Object>application=ActionContext.getContext().getApplication();
Map<String,Object>application1=(Map<String,Object>)ActionContext.getContext().get("application");
//Map<String,Object>session=ActionContext.getContext().getSession();
Map<String,Object>session1=(Map<String,Object>)ActionContext.getContext().get("session");
Map<String,Object>request1=(Map<String,Object>)ActionContext.getContext().get("request");
[/code]

4.7.2通过实现***Aware接口访问

packagecom.struts2.action;
importjava.util.Map;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjavax.xml.ws.Response;
importorg.apache.struts2.ServletActionContext;
importorg.apache.struts2.interceptor.ApplicationAware;
importorg.apache.struts2.interceptor.ServletRequestAware;
importorg.apache.struts2.interceptor.ServletResponseAware;
importorg.apache.struts2.interceptor.SessionAware;
importcom.opensymphony.xwork2.ActionContext;
importcom.opensymphony.xwork2.ActionSupport;
importcom.opensymphony.xwork2.ModelDriven;
importcom.struts2.bean.User;
publicclassLoginActionextendsActionSupportimplementsModelDriven<User>,
ServletRequestAware,ServletResponseAware,SessionAware,
ApplicationAware{
privateUseruser=newUser();
privateHttpServletRequestrequest;
privateMap<String,Object>application;
privateHttpServletResponseresponse;
privateMap<String,Object>session;
/*
*登陆方法
*/
publicStringlogin(){
application.put("application","applicationdata");
request.setAttribute("request","requestdata");
session.put("session","session");
return"success";
}
/**
*继承自接口ModelDriven得方法
*
*@returnUser
*/
@Override
publicUsergetModel(){
returnuser;
}
/**
*继承自接口ApplicationAware得方法
*/
@Override
publicvoidsetApplication(Map<String,Object>arg0){
application=arg0;
}
/**
*继承自接口SessionAware得方法
*/
@Override
publicvoidsetSession(Map<String,Object>arg0){
session=arg0;
}
/**
*继承自接口ServletResponseAware得方法
*/
@Override
publicvoidsetServletResponse(HttpServletResponsearg0){
response=arg0;
}
/**
*继承自接口ServletRequestAware得方法
*/
@Override
publicvoidsetServletRequest(HttpServletRequestarg0){
request=arg0;
}
}


4.7.3通过ServletActionContext访问

//获得HttpServletRequest对象
HttpServletRequestrequest=ServletActionContext.getRequest();
//获得HttpServletResponse对象
HttpServletResponseresponse=ServletActionContext.getResponse();
//获得HttpSession对象
HttpSessionsession=ServletActionContext.getRequest().getSession();
//获得ServletContext对象
ServletContextapplication=ServletActionContext.getServletContext();
[/code]

4.7.4注:可能小伙伴们会有疑问,干嘛要访问ServletAPI?有啥作用呢?如果不懂Servlet当然是不清楚了,通过访问Servlet我们可以进行前后端数据的交互,实现用户的请求与响应


4.8默认Action

注:默认Action的作用是为了用户友好,增加用户体验,当用户找不到访问路径资源路径的时候,返回给他一个错误提示页面,增加用户体验。

配置如下:

<packagename="default"extends="struts-default"namespace="/">
<!--注意这里的name参数,要和下面action的name值保持一致-->
<default-action-refname="error"></default-action-ref>
<!--全局默认action可以执行相应的Action操作,也可以直接放回某个页面-->
<actionname="error">
<result>/error.jsp</result>
</action>
</package>



5.Struts2拦截器


5.1拦截器的定义

在action执行前拦截用户的某些请求并执行某些操作的的组件称为拦截器,多个拦截器就组成了拦截器栈。(类似于web中的过滤器)

5.2拦截器的作用

1)数据转移;2)类型转换;3)数据校验;3)用户权限校验

5.3自定义拦截器

5.3.1通过实现Interceptor接口实现自定义拦截器
1)搭建好Struts2框架

2)建立登陆页面login.jsp

<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>
<%
Stringpath=request.getContextPath();
StringbasePath=request.getScheme()+"://"
+request.getServerName()+":"+request.getServerPort()
+path+"/";
%>
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
<html>
<head>
<basehref="<%=basePath%>">
<title>MyJSP'login.jsp'startingpage</title>
<metahttp-equiv="pragma"content="no-cache">
<metahttp-equiv="cache-control"content="no-cache">
<metahttp-equiv="expires"content="0">
<metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
<metahttp-equiv="description"content="Thisismypage">
</head>
<body>
<formaction="login.action"method="post">
用户名:<inputtype="text"id="username"name="username"><br>密码:<input
type="password"id="password"name="password"><br><inputtype="submit"
value="提交">
</form>
</body>
</html>


3)拦截器MyInterceptor.java继承Intercepter

packagecom.struts2.Interceptor;
importcom.opensymphony.xwork2.ActionInvocation;
importcom.opensymphony.xwork2.interceptor.Interceptor;
@SuppressWarnings("serial")
publicclassMyInterceptorimplementsInterceptor{
@Override
publicvoiddestroy(){
}
@Override
publicvoidinit(){
}
@Override
publicStringintercept(ActionInvocationinvocation)throwsException{
//执行action之前执行的操作
longstartTime=System.currentTimeMillis();
System.out.println("执行action之前执行intercept执行操作");
//执行之后的拦截器,如果没有则执行action操作
Stringresult=invocation.invoke();
//执行action之后执行的操作
longendTime=System.currentTimeMillis();
System.out.println("执行action之后执行intercept执行操作");
System.out.println("执行action花费的时间:"+(endTime-startTime));
returnresult;
}
}


4.实现LoginAction.java

packagecom.struts2.action;
importjava.util.Map;
importjavax.servlet.ServletContext;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjavax.servlet.http.HttpSession;
importjavax.servlet.jsp.PageContext;
importjavax.xml.ws.Response;
importorg.apache.struts2.ServletActionContext;
importorg.apache.struts2.interceptor.ApplicationAware;
importorg.apache.struts2.interceptor.ServletRequestAware;
importorg.apache.struts2.interceptor.ServletResponseAware;
importorg.apache.struts2.interceptor.SessionAware;
importcom.opensymphony.xwork2.ActionContext;
importcom.opensymphony.xwork2.ActionSupport;
importcom.opensymphony.xwork2.ModelDriven;
importcom.struts2.bean.User;
publicclassLoginActionextendsActionSupportimplementsModelDriven<User>{
privateUseruser=newUser();
/*
*登陆方法
*/
publicStringlogin(){
//获得HttpServletRequest对象
HttpServletRequestrequest=ServletActionContext.getRequest();
//获得HttpServletResponse对象
HttpServletResponseresponse=ServletActionContext.getResponse();
//获得HttpSession对象
HttpSessionsession=ServletActionContext.getRequest().getSession();
//获得ServletContext对象
ServletContextapplication=ServletActionContext.getServletContext();
application.setAttribute("application","applicationdata");
request.setAttribute("request","requestdata");
session.setAttribute("session","session");
//放到request作用域中
ActionContext.getContext().put("value","附加参数");
//获取用户名请求参数
System.out.println("用户名:"+user.getUsername());
System.out.println("密码:"+user.getPassword());
return"success";
}
/**
*继承自接口ModelDriven得方法
*
*@returnUser
*/
@Override
publicUsergetModel(){
returnuser;
}
}


上面需要User的javabean,之前有实现,可参看之前的代码

5.Struts.xml的配置(注意拦截器的配置)

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!--设置action的扩展名-->
<constantname="struts.action.extension"value="action"/>
<packagename="default"extends="struts-default"namespace="/">
<!--注册拦截器-->
<interceptors>
<interceptorname="myInterceptor"class="com.struts2.Interceptor.MyInterceptor">
</interceptor>
<!--定义拦截器栈,加入默认拦截器-->
<interceptor-stackname="myStack">
<interceptor-refname="defaultStack"></interceptor-ref>
<interceptor-refname="myInterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
<actionname="login"method="login"class="com.struts2.action.LoginAction">
<!--应用拦截器栈-->
<interceptor-refname="myStack"></interceptor-ref>
<resultname="success">/welcome.jsp</result>
</action>
</package>
</struts>


ps:如果不加入默认的拦截器,可能会出现前端数据无法映射到后端的情况,当然如果仅仅是数据无法映射,可以在对应action或者拦截器栈中加入如下拦截器

<interceptor-refname="params"/>

5.3.2继承AbstractInterceptor类实现自定义拦截器

继承AbstractInterceptor类的实现方法和上一种方法基本相同,唯一不同的是拦截器类MyInterceptor.java的实现,具体区别可见代码

packagecom.struts2.Interceptor;
importcom.opensymphony.xwork2.ActionInvocation;
importcom.opensymphony.xwork2.interceptor.AbstractInterceptor;
@SuppressWarnings("serial")
publicclassMyInterceptorextendsAbstractInterceptor{
@Override
publicStringintercept(ActionInvocationinvocation)throwsException{
//执行action之前执行的操作
longstartTime=System.currentTimeMillis();
System.out.println("执行action之前执行intercept执行操作");
//执行之后的拦截器,如果没有则执行action操作
Stringresult=invocation.invoke();
//执行action之后执行的操作
longendTime=System.currentTimeMillis();
System.out.println("执行action之后执行intercept执行操作");
System.out.println("执行action花费的时间:"+(endTime-startTime));
returnresult;
}
}


上面两种方法的结果一致,具体实现可以看控制台的输出:




5.4内建拦截器

注:内建的拦截器可以在struts2-core-2.3.9.jar包下的struts2-default.xml文件中查看
参看:常见内建拦截器的作用

ps:拦截器的应用需要注意顺序,同时如果没有指定拦截器struts会继承使用默认的拦截器栈,如果用户有自定义的拦截器时,默认拦截器需要显式调用,否则无效。

5.5拦截器的应用



6.Struts2的标签



7.Struts2的注解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: