第6章 Struts 2的其他应用
- 格式:ppt
- 大小:1.39 MB
- 文档页数:24
1.strust2框架来历简介:WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的J2EE Web框架。
(同时也是一个成熟的基于Web的MVC框架)MVC:Model View Controller,model是模型,view是视图,controller是控制器,是一种框架模式。
随着WebWork框架的发展,衍生出了strust2框架,因此strust2框架是WebWork的升级,而不是一个全新的框架,因此稳点性、性能等方面都有很好的保证,而且也同时吸收了struts1框架和WebWork俩者的优点.所以strust2框架也是一个基于Web的MVC框架注意:strust2框架并不是struts1框架的延续或者升级,俩者有着很大的不同2.web项目中的三层架构(和MVC是俩个完全不同的架构)1.表示层(Struts2框架就是工作在这个地方)2.业务逻辑层(service层,处理业务逻辑,比如判断用户名是否存在、密码是否正确、权限是否拥有、账号是否被冻结、账号是否异常、用户积分是否到达操作要求等等,多为一些执行某一个操作条件的判断)3.数据访问层(dao层,专门处理和数据库进行交换的事情,jdbc/hibernate就在这里使用)在项目中,这些不同的分层的表现形式,其实就是在我们自己建的不同的package 中写上各自分层中所使用的java类.比如在项目中我们建了三个package,三个package中java类的作用分别为表示层的代码、业务逻辑层代码、数据访问层代码。
注意:可以理解为,MVC架构是这里说描述的三层架构的一部分,即:三层架构中的表示层可以使用mvc架构的框架来实现,例如使用struts2框架.3.使用struts2框架的好处(为什么要使用struts2框架)减少编程人员代码的编写,使代码更加简洁明了,缩短开发时间,增加开发效率.4.struts2框架引入到web项目中首先使用Eclipse/MyEclipse中建一个web项目.1.把struts2相关jar包引入到项目中。
第八章Struts2的综合应用目标进一步熟悉Struts2的各个技术要点能自己动手完成一个Struts2的简单应用8.1 使用MYSQL 建立一张数据库表这里我们使用图形界面的sql 工具SQLyog 生成数据库表。
图8.1如图所示,我们在脚本区域就是红色方框所在的位置输入我们的Sql 语句,接着在红圈的位置按下“>>”,我们就能生成我们想要的表。
图8.2如图所示我们在test 数据库下生成了一张表user,在下面的红色方框中我们可以很清生成的表user楚的看到有3个字段,其中主键为“id ”,还有2个字段为“username ”,“password ”。
8.2 建立项目总框架为了使业务逻辑和控制分离,我们使用了MVC 的设计模式。
框架图如下:图8.3相应的我们把项目的架构先搭建好,如图所示图8.4 在我用红圈标出的地方,我们可以看到有3个文件夹web,model,dao ,我们把action 放在web 下,把数据模型放在model 下,把和数据库交互的类放在dao 下,这样做层次清晰,可以使编码工作变得有据可循。
下图为例子。
图8.5接着我们可以看到这里有个以“I”开头的文件,他是干什么用的呢,其实他是一个接口,对接口编程可以使我们的代码更为健壮。
下面的章节我们会详细解释这种技术。
8.3 实施项目编码在我们搭好的框架中我们将会一步一步的实现一个用户管理系统。
主要的作用是对数据库表user进行增删改查。
首先我们要建立数据库的连接,以及数据库表模型。
接着我们建立对数据库的连接逻辑变化的时候只需改实现类的方法,而不必去管其他调用的地方。
第2步就是建立jsp页面,先看我们页面。
图8.5我们的userList.jsp如下图8.6在视图层建立完毕之后,我们需要建立几个action来控制跳转和转业务逻辑的实现。
在web目录下我们建立了user.action。
代码如下:IUserDAO类型的一个实例,但是真正的类别却是UserDAO,应此dao.delete()调用的就是UserDAO下的方法。
Struts2框架的介绍和应用一、简介Struts2框架是一个基于MVC模式的Java web应用程序框架,它能够帮助开发人员有效地管理和组织大规模、复杂的web应用程序。
它提供了一系列的工具和技术,使得开发人员能够快速地构建完整可用的web应用程序。
二、历史Struts2框架最初是由Apache软件基金会的Jakarta项目组开发的。
它源于Struts1框架,因为Struts1框架在开发人员自由度和灵活性方面存在限制。
Struts2框架开发了许多新特性和改进,使其比Struts1更具有可扩展性、更易于使用,更适合于构建大规模的web应用程序。
三、架构Struts2框架采用MVC模式,即Model-View-Controller模式,分为以下三个层次:3.1 Model 层Model层用于将数据从数据库等存储区域提取出来,然后传递给View层进行显示。
Struts2框架中,Model层的数据可以是一个Java对象或一个POJO。
3.2 View 层View层将从Model层传递来的数据显示给用户,它可以采用JSP、HTML、XML等技术来展现数据。
3.3 Controller 层Controller层作为Model层和View层之间的中介,调度这两层的工作,处理用户的请求并将处理结果返回给View层。
四、优点4.1 易于扩展Struts2框架采用模块化的设计思路,在不同的模块之间,通过配置文件、注解等方式进行交互,方便扩展和维护。
4.2 易于使用Struts2框架提供了丰富的标签库和功能模块,使得开发人员可以快速地构建完整的web应用程序,降低了使用门槛。
4.3 基于MVC模式Struts2框架采用了MVC模式,将业务逻辑、数据处理、UI展示等功能分开,使得程序结构清晰,易于管理和维护。
五、应用Struts2框架广泛应用于Java web应用程序的开发,特别是在大型项目中使用。
以下是Struts2框架的一些主要应用场景:5.1 企业级应用程序Struts2框架能够较好地管理和组织大型的企业级应用程序,可以帮助开发人员高效地开发复杂的应用。
简单的Struts2应用1 struts2应用开发的一般步骤①创建web工程。
②根据需求导入相应功能相应版本的开发包。
③编写jsp视图文件。
④编写action控制类文件⑤编写struts2的配置文件struts.xml文件。
⑥在web.xml文件中加入struts2框架MVC启动配置。
⑦部署web工程,发布测试。
2 一个简单的struts2应用该应用实现思路如下:在index.jsp文件中输入用户名和密码,如果账户和密码是admin 和1234,则显示登录成功,显示欢迎页面welcome.jsp,否则登录失败跳转到index.jsp页面。
具体的步骤如下:(1) 新建一个名为chapter05-1的web工程,如图1所示。
图1建立的项目结构图(2) 将Struts2所依赖的jar添加到/WEB-INF/lib文件夹下导入该工程,如果不能自动加载到项目路径中去,可以按步骤手动将开发包加到项目路径中去,如图5.8所示。
图2 加载后的开发包情况(3) 编写登陆ActionStruts2是用来实现登陆功能的Web项目。
新建LoginAction类,继承com.opensymphony.xwork2.ActionSupport类。
源代码如下:package com.zjf.action;import com.opensymphony.xwork2.ActionSupport;public class LoginAction extends ActionSupport{private static final long serialVersionUID = 1L;private String username; //登陆账号private String password; //登录密码/***username属性的getter方法**/public String getUsername() {return username;}/***username属性的setter方法**/public void setUsername(String username) {ername = username;}/***password属性的getter方法**/public String getPassword() {return password;}/***password属性的setter方法**/public void setPassword(String password) {this.password = password;}public String execute(){if("admin".equals(username) && "1234".equals(password)){return "success";}return "fail";}}LoginAction中有两个属性username和password,分别代表JSP表单里的账号和密码。
Struts2框架的原理和应用1. 什么是Struts2框架Struts2是一个基于Java EE的开源Web应用框架,是Struts框架的升级版。
它通过MVC设计模式实现了Web应用开发的分层,将业务逻辑、数据模型和用户界面分离,使得代码更加清晰、易于维护。
2. Struts2框架的原理Struts2框架的原理主要包括以下几个关键点:MVC设计模式Struts2采用了MVC(Model-View-Controller)设计模式,其中:•模型(Model):负责管理应用程序的数据和业务逻辑。
•视图(View):负责显示数据给用户。
•控制器(Controller):负责处理用户输入、调用模型和视图等。
核心组件Struts2框架包含以下核心组件:•拦截器(Interceptor):负责在请求前后进行统一处理,可以用来进行身份验证、日志记录等操作。
•动作(Action):负责处理用户请求,包括接收请求参数、调用业务逻辑方法等。
•结果(Result):负责生成并返回视图,可以是JSP、Freemarker、JSON等。
•值栈(ValueStack):用于存储Action处理过程中的数据,支持OGNL表达式读取和赋值操作。
•配置文件(struts.xml):用于配置拦截器、动作、结果等,实现URL与处理类之间的映射关系。
工作流程Struts2框架的工作流程如下:1.客户端发送请求到Struts2框架的前端控制器(例如:DispatcherFilter)。
2.前端控制器根据请求的URL找到对应的处理类(Action)。
3.前端控制器将请求参数、上下文信息等传递给Action,同时执行拦截器的前置处理逻辑。
4.Action处理用户请求,并根据业务逻辑生成相应的结果。
5.前端控制器将结果传递给结果组件,选择合适的视图进行渲染。
6.前端控制器将渲染后的视图返回给客户端。
3. Struts2框架的应用Struts2框架在Web应用开发中具有广泛的应用,以下是一些主要的应用场景:1. 构建Web应用程序Struts2框架提供了许多构建Web应用程序的工具和技术,包括表单验证、国际化、文件上传等功能。
Struts2配置 (1)Action接受请求参数 (6)拦截器 (10)OGNL表达式 (16)输入校验 (22)文件上传下载 (26)Struts2配置1、Struts2框架配置文件Struts2框架按照如下顺序加载struts2配置default.properties 该文件保存在 struts2-core-2.3.7.jar 中 org.apache.struts2包里面struts-default.xml 该文件保存在 struts2-core-2.3.7.jarstruts-plugin.xml 该文件保存在struts-Xxx-2.3.7.jarstruts.xml 该文件是web应用默认的struts配置文件struts.properties 该文件是Struts的默认配置文件web.xml 该文件是Web应用的配置文件如果多个文件配置了同一个struts2 常量,则后一个文件中配置的常量值会覆盖前面文件配置的常量值2、Struts2常量配置∙指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法和freemarker 、velocity的输出<constant name="struts.i18n.encoding" value="UTF-8"/>∙该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。
如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开<constant name="struts.action.extension" value="action"/>∙设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭<constant name="struts.serve.static.browserCache"value="false"/>∙当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开<constant name="struts.configuration.xml.reload" value="true"/>∙开发模式下使用,这样可以打印出更详细的错误信息<constant name="struts.devMode" value="true" />∙默认的视图主题<constant name="struts.ui.theme" value="simple" />∙与spring集成时,指定由spring负责action对象的创建<constant name="struts.objectFactory" value="spring" />∙该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。
Struts2介绍1、 Struts2工作原理Struts2请求响应流程:在struts2的应用中,从用户请求到服务器返回相应响应给用户端的过程中,包含了许多组件如:Controller、ActionProxy、ActionMapping、Configuration Manager、ActionInvocation、Inerceptor、Action、Result等。
下面我们来具体看看这些组件有什么联系,它们之间是怎样在一起工作的。
(1)客户端(Client)向Action发用一个请求(Request)(2) Container通过web.xml映射请求,并获得控制器(Controller)的名字(3)容器(Container)调用控制器(StrutsPrepareAndExecuteFilter或FilterDispatcher)。
在Struts2.1以前调用FilterDispatcher,Struts2.1以后调用StrutsPrepareAndExecuteFilter(4)控制器(Controller)通过ActionMapper获得Action的信息(5)控制器(Controller)调用ActionProxy(6) ActionProxy读取struts.xml文件获取action和interceptor stack的信息。
(7) ActionProxy把request请求传递给ActionInvocation(8) ActionInvocation依次调用action和interceptor(9)根据action的配置信息,产生result(10) Result信息返回给ActionInvocation(11)产生一个HttpServletResponse响应(12)产生的响应行为发送给客服端。
工作原理在Struts2框架中的处理大概分为以下几个步骤1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)3 接着FilterDispatcher(StrutsPrepareAndExcuteFilter),2.1前用FilterDispatcher后面版本用StrutsPrepareAndExcuteFilter,被调用,FilterDispatcher(StrutsPrepareAndExcuteFilter)根据ActionMapper来决定这个请是否需要调用某个Action4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy5 ActionProxy通过Configuration Manager查询框架的配置文件,找到需要调用的Action类6 ActionProxy创建一个ActionInvocation的实例。
一、表单标签_checkbox复选框如果集合为list<s:checkboxlist name="list"list="{'Java','.Net','RoR','PHP'}"value="{'Java','.Net'}"/>生成如下html代码:<input type="checkbox"name="list"value="Java" checked="checked"/><label>Java</label><input type="checkbox"name="list"value=".Net" checked="checked"/><label>.Net</label><input type="checkbox"name="list" value="RoR"/><label>RoR</label><input type="checkbox"name="list"value="PHP" /><label>PHP</label><input type="checkbox"name="list"value="PHP" /><label>PHP</label>************************************************ *****<br>如果集合为MAP<s:checkboxlist name="map"list="#{1:'瑜珈用品',2:'户外用品',3:'球类',4:'自行车'}"listKey="key"listValue="value"value="{1,2,3}"/>生成如下html代码:<input type="checkbox"name="map"value="1" checked="checked"/><label>瑜珈用品</label><input type="checkbox"name="map"value="2" checked="checked"/><label>户外用品</label><input type="checkbox"name="map"value="3" checked="checked"/><label>球类</label><input type="checkbox"name="map"value="4"/><label>自行车</label>******************************************************<br>如果集合里存放的是javabean(id和name为Person的属性)<%Person person1 = new Person(1, "第一个");Person person2 = new Person(2, "第二个");List<Person> list = new ArrayList<Person>();list.add(person1);list.add(person2);request.setAttribute("persons", list);%><s:checkboxlist name="beans"list="#request.persons"listKey="id"listValue="name"/>生成如下html代码:<input type="checkbox"name=“beans" value="1"/><label>第一个</label><input type="checkbox"name=“beans" value="2"/><label>第二个</label>************************************************ ******<br>表单标签_radio单选框<a href="radio.jsp">测试</a><br>表单标签_select单选框<a href="select.jsp">测试</a>代码运行结果如下:----------------------------------------------------------------------------------------------------------------------------二、表单标签_radio下拉选择框如果集合里存放的是javabean(id和name为Person的属性) <%Person person1 = new Person(1, "第一个");Person person2 = new Person(2, "第二个");List<Person> list = new ArrayList<Person>();list.add(person1);list.add(person2);request.setAttribute("persons", list);%>< s:radio name="beans" list="#request.persons" listKey="id"listValue="name"/> 生成如下html代码:<input type="radio"name="beans"id="beans1" value="1"/><label>第一个</label><input type="radio"name="beans"id="beans2" value="2"/><label>第二个</label>************************************************ **************<br>该标签的使用和checkboxlist复选框相同。
标题:深度解析struts2burp的使用方法1.引言在网络安全领域中,渗透测试是一项不可或缺的任务。
而在渗透测试过程中,要对Web应用程序进行测试,就需要用到一些工具来检测和利用漏洞。
其中,struts2burp是一个非常重要的工具,它能够帮助渗透测试人员发现和利用Struts 2框架的漏洞。
2.简介struts2burpstruts2burp是Burp Suite的一个插件,它专门针对Struts 2框架进行渗透测试。
Struts 2框架是一个流行的开源Java Web应用程序框架,但它也因为一些漏洞而备受关注。
struts2burp的使用方法对于渗透测试人员来说是非常重要的。
3.核心功能在使用struts2burp时,首先需要了解它的核心功能。
它能够帮助用户主动识别Struts 2漏洞,并自动生成漏洞检测payload。
struts2burp还能够辅助用户进行Struts 2注入、执行任意命令和文件上传等攻击。
通过这些功能,渗透测试人员能够更有效地测试Web 应用程序的安全性。
4.使用方法通常情况下,使用struts2burp需要经过以下几个步骤:1) 安装Burp Suite:首先要确保已经安装了Burp Suite,并且安装了struts2burp插件。
2) 配置struts2burp:在Burp Suite中加载struts2burp插件,并进行相关配置。
3) 发现漏洞:使用struts2burp对目标应用程序进行漏洞扫描,发现Struts 2框架的漏洞。
4) 利用漏洞:根据漏洞的类型,使用struts2burp生成相应的payload,并进行测试。
5.个人观点作为一名网络安全工作者,我认为struts2burp是一款非常强大且实用的工具。
它能够帮助渗透测试人员快速发现和利用Struts 2框架的漏洞,提高渗透测试的效率和准确性。
在实际工作中,我也经常使用struts2burp来测试Web应用程序的安全性,它为我的工作提供了很大帮助。
为什么要使用struts2 与struts1相比,它的优点:●在软件设计上Struts2没有像struts1那样跟ServletAPI和strutsAPI有着紧密的耦合,Struts2的应用可以不依赖于ServletAPI和strutsAPI。
Struts2的这种设计属于无入侵式设计,而Struts1却属于入侵式设计。
●Struts2提供了拦截器,利用拦截器可以进行AOP编程,实现如权限拦截等功能●Struts2提供了类型转换器,我们可以把特殊的请求参数转换成需要的类型。
在Struts1中,如果我们要实现同样的功能,就需要向Struts1的底层实现BeanUtil注册类型拦截器才行。
●Struts提供支持多种表现层技术,如:jsp、freeMarker、Velocity等●Struts2的输入校验可以对指定的方法进行校验,解决了struts1长久之痛●Struts2提供了全局范围、包范围和Action范围的国际化资源文件管理实现1.s truts2(struts2.1.8)环境的搭建1>导入jar包:commons-fileupload-1.2.1.jar:文件上传组件,struts2.1.6版本后必须加入此文件上传commons-logging-1.0.4.jar:ASF出品的日志包,Struts框架使用这个日志包来支持Log4J 和JDK1.4+的日志记录freemarker-2.3.15.jar:Struts2的UI标签的模版使用FreeMarker编写ognl-2.7.3.jar:对象图导航语言(Object Graph Navigation Language),struts2框架通过其读写对象属性struts2-core-2.1.8.jar: Struts2框架的核心类库xwork-core-2.1.6.jar :XWork类库,Struts2在其上构建2> 编写Struts2的配置文件<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD StrutsConfiguration 2.0//EN""/dtds/struts-2.0.dtd"> <struts><package name="action"namespace="/test"extends="struts-default"> <action name="helloword"class="com.lizhong.action.HelloWordAction"method="execute"><result name="success"type="redirect">/index.jsp</result> </action></struts>3> 在web.xml中加入Struts2 MVC框架启动配置<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAnd ExecuteFilter</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>2.A ction名称的搜索顺序1)获得请求路径的URL.例如url是:http://servlet/struts2/path1/parth2/parth3/test.action2)首先寻找namespace为/path1/parth2/parth3的package,如果不存在这个package则执行步骤3;如果存在这个package,则在这个package中寻找名字为test的action,当在该package下寻找不到action时就会直接跑到默认namespace的package里面去寻找action(默认的命名空间为空字符串“”),如果在默认的namespace的package里面还是寻找不到该Action,页面提示找不到action3)寻找namespace为/path1/parth2的package,如果不存在这个package则执行步骤4;如果存在这个package,则在这个package中寻找名字为test的action,当在该package下寻找不到action时就会直接跑到默认namespace的package里面去寻找名字为test的action,如果在默认的namespace的package里面还是寻找不到该Action,页面提示找不到action4)寻找namespace为/path1的package,如果不存在这个package则执行步骤5;如果存在这个package,则在这个package中寻找名字为test的action,当在该package下寻找不到action时就会直接跑到默认namespace的package里面去寻找名字为test的action,如果在默认的namespace的package里面还是寻找不到该Action,页面提示找不到action5)寻找namespace为/的package,如果存在这个package,则在这个package中寻找名字为test的action,当在该package下寻找不到action时就会直接跑到默认namespace的package里面去寻找名字为test的action,如果在默认的namespace的package里面还是寻找不到该Action,页面提示找不到action3.A ction配置中的各项默认值<!-- 如果不定义class属性,默认使用ActionSupport类,method默认值:execute --> <action name="addUI"><!-- result没有定义name属性,默认值是success --><result>/WEB-INF/page/addstudent.jsp</result></action>4.Action配置中的各种视图转发类型<!-- 浏览器重定向到视图使用type=redirect --><action name="redirect"><result type="redirect">/index.jsp</result></action><!-- 重定向到Action,使用type=redirectAction --><action name="redirect"><!—重定向到不同包下的action --><result type="redirectAction"><!-- action的名称 --><param name="actionName">redirect</param><!-- action的命名空间 --><param name="namespace">/test</param></result><!—重定向到同一包下的action,redirect为同一包下action的名称--><result type=" redirectAction">redirect</result></action><!-- 原样返回页面的源代码,不会执行里面的内容 --><action name="plainText"><result type="plainText"><!-- 要返回的页面 --><param name="location">/index.jsp</param><!-- 使用的编码方式 --><param name="charSet">UTF-8</param></result></action>5.为Action的属性注入值<action name="setter"class="com.lizhong.action.SetterTestAction"method="execute"><param name="savepath">/images/111</param><result>/WEB-INF/page/setter.jsp</result></action>首先:在SetterTestAction中要存在savepath属性的setter方法,如果需要在页面上显示,要提供getter方法.其次:在配置该Action时,使用<param name="savepath">/images/111</param>来为savepath 注入值,name指定需要注入值的属性名称.6.Struts2的常量配置常量可以在struts.xml或struts.properties中配置,建议在struts.xml中配置,两种配置方式如下:在struts.xml文件中配置常量<struts><constant name="struts.action.extension"value="do,action"/> </struts>在struts.properties文件中配置常量struts.action.extension=do因为常量可以再下面多个配置文件中进行定义,所以我们需要了解struts2加载常量的搜索顺序: struts-default.xmlstruts-plugin.xmlstruts.xmlstruts.propertiesweb.xml如果在多个文件中配置了同一个常量,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值常用的常量介绍:<!-- 该属性指定需要Struts2处理的请求后缀的请求后缀 ,该属性默认值是action,即所有匹配*.action的请求都有Struts2处理.如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号隔开--><constant name="struts.action.extension"value="do,action"/><!--指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法和Freemarker,Velocity的输出--><constant name="struts.i18n.encoding"value="UTF-8"/><!--设置浏览器是否缓存静态内容,默认值为ture(生产环境下使用),开发环境下最好关闭 --> <constant name="struts.serve.static.browserCache"value="false"/><!--当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 --><constant name="struts.configuration.xml.reload"value="true"/><!-- 开发环境下使用,这样可以打印出更详细的错误信息 --><constant name="struts.devMode"value="true"/><!--默认的视图主题 --><constant name="struts.ui.theme"value="simple"/><!-- 与spring集成时,指定由Spring负责action对象的创建 --><constant name="struts.objectFactory"value="spring"/><!--该属性设置Struts2是否支持动态方法调用,该属性的默认值为true,如果需要关闭动态方法调用,则可设置该属性为false,使用通配符调用方法也是如此--><constant name="struts.enable.DynamicMethodInvocation"value="false"/><!--上传文件的大小限制--><constant name="struts.multipart.maxSize"value="10240000"/>7.S truts2的处理流程StrutsPrepareAndExecuteFilter是struts2框架的核心控制器,它负责拦截有<url-pattern>/*</url-pattern>指定的所有用户请求,当用户请求到达时,该Filter会过滤用户的请求.默认情况下,如果用户请求的路径不带后缀或者后缀以.action结尾,这是请求将被转入struts2框架处理,否则struts2框架将略过该请求的处理.当请求转入struts2框架处理时会先经过一系列的拦截器,然后再到Action.与Struts1不同,Struts2对用户的每一次请求都会创建一个Action,所以Struts2中的Action是线程安全的.8.为应用指定多个Struts配置文件在struts.xml中配置:<include file="struts-department.xml"/><include file="struts-employee.xml"/>在实际项目开发中,一般使用多个struts配置文件,多个配置文件以模块进行划分.然后在struts.xml进行包含,struts.xml中主要配置一些全局性的常量9.动态方法调用和使用通配符定义Action1)动态方法调用相应Action方法在请求路径中使用Action的name+”!”+要调用的方法名称+后缀如: http://localhost:8080/struts2/control/department/list!execute.action list----对应的Actionexecute---Action中的方法如果不想使用动态方法调用,我们可以通过struts.enable.DynamicMethodInvocation关闭动态方法调用.如果设置该属性为false,使用通配符调用方法也会失效<constant name="struts.enable.DynamicMethodInvocation"value="false"/> 在官方文档上已经不推荐使用这种方法2)使用通配符调用相应的Action方法<action name="list_*"class="com.lizhong.action.SetterTestAction"method="{1}"><result name="success">/WEB-INF/page/setter.jsp</result> </action>然后在url中使用list_+对应的方法来调用Action相应的方法.如: http://localhost:8080/struts2/control/department/list_execute.do10.接收请求参数●采用基本类型接收请求参数(get/post)在Action类中定义与请求参数同名的属性,struts2便能自动接收请求参数并赋予给同名的属性.请求路径:http://localhsot:8080/test/view.action?id=78public class ProductAction {private Integer id;//通过反射技术调用与请求参数同名的属性的setter方法来获取请求参数的值public void setId(Integer id){this. id = id;}}●采用复合类型接收请求参数在表单中使用复合类型变量+复合类型的属性作为字段的名称,例如:product.id/在Action中提供该复合类型变量的setter方法.请求路径:http://localhsot:8080/test/view.action?product.id=78public class ProductAction {private Product product;public void setProduct(Product product) {this.product = product;}}Struts属性通过反射技术调用Product的默认构造器创建product对象,然后再通过反射技术调用product中与请求参数同名的属性的setter方法来获取请求参数值.11.自定义类型转换器定义一个类型转换器:public class DateConverter extends DefaultTypeConverter {@Overridepublic Object convertValue(Map<String, Object> context, Object value, Class toType) {SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");try {if (toType == Date.class) {//从字符串转换为Date类型String[] params = (String[])value;//request.getParameterValues()return sdf.parse(params[0]);}else if(toType == String.class){//从Date类型转换为字符串Date date = (Date)value;return sdf.format(date);}} catch (ParseException e) {}return null;}}在Struts2中注册:局部类型转换器在要被类型转换的Action的包下新建一个属性文件:SetterTestAction-conversion.propertiesSetterTestAction---Action的简单名称conversion.properties---固定写法.在属性文件里面设置:birthday=com.lizhong.conversion.DateConverterbirthday--需要类型转换的属性名称DateConverter—自定义的类型转换器全局类型转换器在类路径下/src目录下新建一个属性文件:xwork-conversion.properties在properties文件中的内容为:待转换的类型=类型转换器的全类名对本例而言,xwork-conversion.properties文件中的内容为:java.util.Date=com.lizhong.conversion.DateConverter12.怎么样向request,application,session范围添加属性和获取对象在Struts2中对以上三个类进行了封装,使用封装的类可以进行属性的添加:import com.opensymphony.xwork2.ActionContext;public String execute() throws Exception{ActionContext cxt = ActionContext.getContext();cxt.put("req", "request范围");//往request里放入reqcxt.getSession().put("ses", "session范围");//往session里放入ses//往ServletContext放入appcxt.getApplication().put("app", "application范围");return"success";}获得HttpServletRequest/HttpServletResponse/ServletContext/HttpSession对象: 方法一:通过ServletActionContext直接获得:public String rsa(){HttpServletRequest request = ServletActionContext.getRequest();HttpServletResponse response = ServletActionContext.getResponse();HttpSession session = request.getSession();ServletContext context = ServletActionContext.getServletContext();return"scope";}方法二:实现指定接口,由struts框架运行时注入:public class HellowordAction implements ServletContextAware,ServletRequestAware, ServletResponseAware {HttpServletRequest request;HttpServletResponse response;ServletContext context;@Overridepublic void setServletResponse(HttpServletResponse response) { this.response = response;}@Overridepublic void setServletRequest(HttpServletRequest request) {this.request = request;}@Overridepublic void setServletContext(ServletContext context) {this.context = context;}}13.struts2的文件上传第一步:在WEB-INF/lib下加入commons-fileupload-xxx.jar,commons-io-xxx.jar,这两个文件可以再/下载第二步:把form表单的enctype设置为:”multipart/form-data”,如下:<form action=""method="post"enctype="multipart/form-data"> <input type="file"name="uploadfile"/></form>第三步:在Action类中添加以下属性,属性红色部分队员表单中字段的名称:public class FileUploadAction {private File uploadfile; //得到上传的文件private String uploadfile FileName;//得到文件的名称private String uploadfile ContentType;//得到文件的类型//这里省略了熟悉的getter/setter方法public String upload() throws Exception{String savePath = ServletActionContext.getServletContext().getRealPath("/images");File file = new File(savePath,this.uploadfileFileName);if(!file.getParentFile().exists()) file.getParentFile().mkdirs();FileUtils.copyFile(uploadfile, file);return"upload";}}14.struts2的多文件上传第一步:导入jar包.第二步:把form表单的enctype设置为:”multipart/form-data”,如下:<form action=""method="post"enctype="multipart/form-data"><input type="file"name="uploadfiles"/><input type="file"name="uploadfiles"/></form>第三步:在Action类中添加以下属性,属性红色部分队员表单中字段的名称:public class FileUploadAction {private File[] uploadfiles; //得到上传的文件private String[] uploadfiles FileName;//得到文件的名称private String[] uploadfiles ContentType;//得到文件的类型//这里省略了熟悉的getter/setter方法public String upload() throws Exception{String savePath = ServletActionContext.getServletContext().getRealPath("/images");File file = new File(savePath);if(!file.exists()) file.mkdirs();for(int i = 0 ; i < uploadfiles.length ; i++ ){FileUtils.copyFile(uploadfiles[i],new File(file,uploadfilesFileName[i]));}return"upload";}}15.自定义拦截器要自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor接口:public class PermissionInterceptor implements Interceptor {@Overridepublic void destroy() {}@Overridepublic void init() {}@Overridepublic String intercept(ActionInvocation invocation) throws Exception { //进入拦截器if(session里存在用户){return invocation.invoke();//返回执行Action后所返回的视图名称}else{return"message";}}}在配置文件中进行配置:<package name="employee"namespace="/employee"extends="struts-default"> <interceptors><interceptor name="permission"class="xxx"/><interceptor-stack name="permissionStack"><interceptor-ref name="defaultStack"/><interceptor-ref name="permission"/></interceptor-stack></interceptors><action name="interceptor_*"class="xxx"method="{1}"><interceptor-ref name="permissionStack"/></action></package>因为Struts2中如文件上传,数据校验,封装请求参数到Action等功能都是有系统默认的defaultStack中的拦截器实现的,所以我们定义的拦截器需要引用系统默认的defaultStack,这样应用才可以使用Struts2框架提供的众多功能.如果希望包下所有的Action都是用自定义的拦截器,可以通过<default-interceptor-refname=”permissionStack”/>把拦截器定义为默认的拦截器.注意:每一个包只能定义一个默认的拦截器.另外,一旦我们为该包中的某个Action显示指定了某个拦截器,则默认拦截器不会起作用.16.Struts2输入校验在Struts2中我们可以对Action的所有方法进行输入校验或对Action的指定方法进行输入校验对于输入校验Struts2提供了两种实现方式:1)采用手工编写代码实现.对Action所有方法进行校验通过重写validate()方法实现,validate()方法会校验Action中所有与execute方法签名相同的方法.当某个数据校验失败时,我们应该调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,Action可以继承ActionSupport),如果系统的fieldErrors包含失败信息,Struts2会将请求转发到名为input的result.在input视图中可以通过<s:fielderror/>显示失败信息.validate()使用例子:public void validate() {if(username == null || "".equals(username.trim())){this.addFieldError("username", "用户名不能为空");}if(mobile == null || "".equals(mobile.trim())){this.addFieldError("mobile", "手机号不能为空");}elseif(!pile("^[1][358]\\d{9}$").matcher(this.mobile) .matches()){this.addFieldError("mobile", "手机号格式不正确");}}校验失败后,请求转发至input视图:<result name="input">/validate.jsp</result>在validate.jsp页面中使用<s:feilderror/>显示错误信息.对Action中指定方法进行校验通过validateXxx()方法实现, validateXxx()只会校验Action中方法名为Xxx的方法.其中Xxx的第一个字母要大写.当某个数据校验失败时,我们应该调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,Action可以继承ActionSupport),如果系统的fieldErrors包含失败信息,Struts2会将请求转发到名为input的result.在input视图中可以通过<s:fielderror/>显示失败信息.validateXxx()方法使用例子:public String save(){return"message";}public void validateSave(){//对Action中的save()方法进行校验if(username == null || "".equals(username.trim())){this.addFieldError("username", "用户名不能为空");}}校验失败后,请求转发至input视图:<result name="input">/validate.jsp</result>在validate.jsp页面中使用<s:feilderror/>显示错误信息.输入校验的流程(1).类型转换器对请求参数执行类型转换,并把转换后的值赋给Action中的属性.(2).如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActinContext中,conversionError拦截器将异常信息封装到fieldErrors里.不管类型转换是否出现异常,都会进入第三步(3).系统通过反射技术先调用Action中的validateXxx()方法,Xxx为方法名.(4).再调用Action中validate()方法.(5).经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图.如果系统中的fieldErrors没有任何错误信息,系统将执行Action中的处理方法.2)采用xml配置方式实现输入校验.对Action中所有方法进行校验使用基于XML配置方式实现输入校验时,Action也需要继承ActionSupport,并且提供校验文件,校验文件和Action类放在同一个包下,文件的取名格式为:ActionClassName-validation.xml, 其中ActionClassName为action的简单类名,-validation为固定写法.如果Action类为erAction,那么该文件的取名应为: UserAction-validation.xml.下面是校验文件的模版:<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator 1.0.3//EN""/xwork/xwork-validator-1.0.3.dtd"><validators><field name="username"><field-validator type="requiredstring"><param name="trim">true</param><message>用户名不能为空</message></field-validator></field><field name="mobile"><field-validator type="regex"><param name="expression"><![CDATA[^[1][358]\d{9}$]]></param><message>手机号格式不正确</message></field-validator></field></validators><field>指定Action中要校验的属性,<field-validator>指定校验器,上面指定的校验器requiredstring是由系统提供的,系统提供了满足大部分验证需求的校验器,这些校验器的定义可以再xwork-2.x.jar中的com.opensymphony.xwork2.validator.validators下的default.xml中找到.<message>为校验失败后的提示信息,如果需要国际化,可以为message指定key属性,key的值为资源文件中的key.在这个校验文件中,对Action中字符串类型的username属性进行校验,首先要求调用trim()方法去掉空格,然后判断用户名是否为空.还对Action的字符串类型mobile属性进行校验,使用了正则表达式校验器,传入参数expression的值为正则表达式字符串.由于字符串中含有xml的特殊字符,所以使Struts2提供的校验器列表:required(必填校验器,要求field的值不能为null)requiredstring(必填字符串校验器,要求field的值不能为null,并且长度大于0默认情况下会对字符串去前后空格)stringlength(字符串长度校验器,要求field的值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去字符串前后空格)regex(正则表达式校验器,检查被校验的field是否匹配一个正则表达式.expression参数指定正则表达式,caseSensitive参数指定进行正则表达式匹配时,是否区分大小写,默认值为true) int(整数校验器,要求field的整数值必须在指定范围内,min—最小值,max—最大值)double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内, min—最小值,max—最大值)fieldexpression(字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过) email(邮件地址校验器,要求如果field的值为非空,则必须是合法的邮件地址)url(网址校验器,要求如果field的值非空,则必须是合法的url地址)date(日期校验器,要求field的日期必须在指定范围内, min—最小值,max—最大值)conversion(转换校验器,指定在类型转换失败时,提示的错误信息)visitor(用于校验Action中的复合属性,它指定一个校验文件用于校验复合属性中的属性)expression(OGNL表达式校验器, expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过.该校验器不可用在字段校验器风格中的配置中)对Action中指定方法进行校验使用基于XML配置方式实现输入校验时,Action也需要继承ActionSupport,并且提供校验文件,校验文件和Action类放在同一个包下,文件的取名格式为:ActionClassName-ActionName-validation.xml,其中ActionClassName为action的简单类名, ActionName为Action在Struts.xml中action的名称.-validation为固定写法.例如:在实际应用中常有以下配置:<action name="list_*"class="com…ValidateAction"method="{1}"><result name="input">/validate.jsp</result></action>ValidateAction有以下两个处理方法:public String update(){………..}public String save(){……..}要对update()方法实施校验,校验文件的取名:ValidateAction-list_update-validation.xml要对save()方法实施校验,校验文件的取名:ValidateAction-list_save-validation.xml基于XML校验的一些特点当为某个action提哦那个了ActionClassName-ActionName-validation.xml和ActionClassName-validation.xml两种规则的校验文件时,系统会按下面顺序寻找校验文件:(1).ActionClassName-validation.xml(2). ActionClassName-ActionName-validation.xml系统寻找到第一个校验文件时还会继续搜索后面的校验文件,当搜索到所有校验文件时,会把校验文件里的所有校验规则汇总,然后全部应用于action方法的校验.如果两个校验文件中指定的校验规则冲突,则只使用后面文件中的校验规则.当action继承了另一个action,父类action的校验文件会先被搜索到.假设UserAction继承了BaseAction:<action name=”user” class=”…UserAction” method=”{1}”></action>访问上面action,系统先搜索父类的校验文件:BaseAction-validation.xml,BaseAction-user-validation.xml,接着搜索子类的校验文件:UserAction-validation.xml, UserAction-user-validation.xml.应用上面action的校验规则为这四个文件的总和.17.国际化准备资源文件,资源文件的命名格式如下:baseName_language_country.propertiesbaseName_language.propertiesbaseName.properties其中baseName是资源文件的基本名,我们可以自定义,但language和country必须是java支持的语言和国家.如:中国大陆: baseName_zh_CN.properties美国: baseName_en_US.properties现在为应用添加两个资源文件(在类路径下/src目录下):第一个存放中文:itcast_zh_CN.properties内容为:welcome=欢迎来到传智播客第二个存放英文(美国):itcast_en_US.properties内容为:welcome=welcome to itcast对于中文的属性文件,我们编写好后,应该使用jdk提供的native2ascii命令把文件转换为unicode 编码的文件.命令使用方式如下:native2ascii 源文件.properties 目标文件.properties配置全局资源文件与输出国际化信息当准备好资源文件之后,我们可以在struts.xml中通过struts.custom.i18n.resources常量把资源文件定义为全局资源文件,如下:<constant name="struts.custom.i18n.resources"value="itcast"/>itcast为资源文件的基本名.后面我们就可以再页面或在action中访问国际化信息:●在jsp页面中使用<s:text name=””/>输出国际化信息:<s:text name=”user”/>,name为资源文件中的key●在Action类中,可以继承ActionSupport,使用getText()方法得到国际化信息,该方法的第一个参数用于指定资源文件中的key●在表达标签中,通过key属性指定资源文件中的key,如:<s:textfield name=”realname” key=”user”/> key为资源文件中的key输出带占位符的国际化信息资源文件中的内容如下:welcome={0},欢迎来到传智博客{1}在jsp页面中输出带占位符的国际化信息<s:text name=”welcome”><s:param><s:property value=”realname”/></s:param><s:param>学习</s:param></s:text>在Action类中获取带占位符的国际化信息继承ActionSupport,使用getText(String key,String[] args)或getText(String key, List args)方法.国际化---包资源文件在一个大型应用中,整个应用有大量的内容需要实现国际化,如果我们把国际化的内容都放置在全局资源属性文件中,显然会导致资源文件的过于庞大,臃肿,不便于维护,这个时候我们可以针对不同模块,使用包范围来组织国际化文件.方法如下:在java的包下放置package_language_country.properties资源文件,package为固定写法,处于该包及子包下的的Action都可以访问该资源.当查找指定key的消息时,系统会先从package资源文件查找,当找不到对应的key时,才会从常量struts.custon.i18n.resource指定的资源文件中寻找.国际化—Action范围资源文件我们也可以为某个action单独指定资源文件,方法如下:在Action类所在的路径,放置ActionClassName_language_country.properties资源文件, ActionClassName为action类的简单名称.当查找指定key的消息时,系统会先从ActionClassName_language_country.properties资源文件查找,如果没有找到对应的key,然后沿着当前包往上查找基本名为package的资源文件,一直找到对顶层包.如果还没有找到对应的key,最后会从常量struts.custon.i18n.resource指定的资源文件中寻找.18.OGNL表达式语言OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目.Struts2框架使用OGNL作为默认的表达式语言.相对于EL表达式,它提供了平时我们需要的一些功能,如:●支持对象方法调用,如xxx.sayHello();●支持静态方法调用和值访问,表达式的格式为@[类全名(包括路径)]@[方法名 | 值名],例如:@ng.String@format(…foo %s‟,‟bar‟)或@cn.itcast.Constant@App_Name;●操作集合对象.Ognl有一个上下文(Context)概念,说白了上下文就是一个Map结构,它实现了java.utils.Map接口,在Struts2中上下文(Context)的实现为ActionContext,下面是上下文的结构示意图如下:当Struts2接收一个请求时,会迅速创建ActionContext,ValueStack,action.然后把action 存放进ValueStack,所以action的实例变量可以被OGNL访问.访问上下文(Context)中的对象需要使用#符号标注命名空间,如#application,#session另外OGNL会设定一个根对象(root对象),在Struts2中根对象就是ValueStack(值栈).如果要访问跟对象(即ValueStack)中对象的属性,则可以省略#命名空间,直接访问该对象的属性即可.在Struts2中,根对象ValueStack的实现类我饿OgnlValueStack,该对象不是我们想象的只存放单个值.而是存放一组对象.在OgnlValueStack类里有一个List类型的root变量,就是使用它存放一组对象在root变量中处于第一位的对象叫栈顶对象.通常我们在OGNL表达式里直接写上属性的名称即可访问root变量里对象的属性,搜索顺序是从栈顶对象开始寻找,如果栈顶对象不存在该属性,就会从第二个对象寻找,如果没有找到就从第二个对象寻找,如果没有找到就从第三个对象寻找,依次往下访问,直到找到为止.注意:Struts2中,OGNL表达式需要配合Struts标签才可以使用.如:<s:propertyvalue=”name”/>由于ValueStack(值栈)是Struts2中OGNL的根对象,如果用户需要访问值栈中的对象,在jsp页面可以直接通过下面的EL表达式访问ValueStack(值栈)中对象的属性${foo}//获得值栈中某个对象的foo属性如果访问其他Context的对象,由于他们不是根对象,所以在访问时,需要添加#前缀.●application对象:用于访问ServletContext,例如#或者#application[…name‟],相当于调用ServletContext的getAttribute(“name”)●session对象:用来访问HttpSession,例如#或者#session[…name‟],相当于调用session.getAttribute(“name”)。
struts2通配符的使用详解(5篇)第一篇:struts2通配符的使用详解struts2的配置文件是 struts.xml..在这个配置文件里面可以使用通配符..其中的好处就是,大大减少了配置文件的内容..当然,相应付出的代价是可读性..使用通配符的原则是约定高于配置.在项目中,我们有很多的命名规则是约定的...我们使用通配符那就必须有一个统一的约定.否则通配符将无法成立看下面的例子.(1)先看我们的action配置/user_{1}.jsp 带红字的解释下,第一个带“*” 表示的是后面匹配任意字符...这个很容易理解{1}表示的是第一个“*”的内容...注意,这里的大括号,比如,如果是user_add.那么{1}就是表示add..当然,这里只有一个“*”.你可以有两个,甚至三个四个..比如这样写*_* 这样就是两个“*”.那么我们也可以用{1},{2}来分别的表示他们.(2)对应的action 内容package com.test.action;importcom.opensymphony.xwork2.ActionSupport;@SuppressWarnings (“serial”)public class UserAction extends ActionSupport { public String add(){ return SUCCESS;} public String delete(){ return SUCCESS;} public String update(){ return SUCCESS;} public String select(){ return SUCCESS;} } 因为是举例子,所以每个方法里面都没实现内容(3)其他就是几个jsp页面.其中user_*.jsp页面没什么好说的,就是显示一句话.比如user_add.jsp就是显示“这是添加页面” 其他的类似.就是为了让我们看到已经跳转到对应的页面.index.jsp写一下<%@ page language=“java” contentType=“text/html;charset=UTF-8”pageEncoding=“UTF-8”%> <% Str ing path = request.getContextPath();String basePath = request.getScheme()+“://”+request.getServerName()+“:”+request.getServerPort()+path+“/”;%>”>添加页面删除页面修改页面查找页面第二篇:action通配符首先,看一个struts2的配置文件:Java代码1.2.3./Student{1}_success.jsp4.5.这里,“{1}”表示第1个*,例如,当请求以下路径时:引用*为add,因此method=“add”,返回的页面为/Studentadd_success.jsp 即实际调用的是StudentAction中的add 方法。
Struts 2拦截器的研究与应用Struts 2是一个开源的Java Web应用程序框架。
它是MVC(Model-View-Controller)框架的一种实现,它可以帮助开发人员快速构建灵活和可维护的Web应用程序。
Struts 2拦截器是在Web请求的流程中,拦截控制器和Action等结构组件的执行过程中实现自定义处理的一种机制。
Struts 2框架在执行Action前后提供了很多的拦截器(Interceptor),我们可以通过自定义拦截器实现更灵活的处理。
Struts 2拦截器主要作用是处理控制器和Action等结构组件的执行过程。
对于Web应用程序,请求的处理通常会涉及到以下步骤:1. 请求到达服务器并被Servlet容器接收。
2. Servlet容器将请求发送给Struts2框架。
3. Struts2框架使用ActionContext对象包装请求。
4. Struts2框架使用拦截器链来处理请求。
5. 如果所有拦截器都成功运行,就会执行Action。
6. Action返回结果给Struts2框架。
7. Struts2框架呈现结果给客户端。
可以看出,拦截器在Struts2框架中占据着非常重要的位置。
它们可以对Struts2框架的请求流程进行干预和修改,执行一些通用的、与业务逻辑无关的操作,例如权限判断、登录验证、日志记录等。
拦截器的实现在Struts2中,拦截器是在struts.xml中配置的,每个拦截器都有一个名字和一个类名。
下面是一个拦截器的配置例子:```xml<interceptor name="loginInterceptor" class="com.example.LoginInterceptor" />```以上配置中,interceptor标签用于声明一个拦截器,name属性指定拦截器的名字,class属性指定拦截器的实现类。