Struts2学习笔记
Struts2学习笔记

Struts2项目的构建与配置 (2)1. 配置struts.xml (2)2. 配置web.xml (2)3. 配置Struts2的jar包 (2)Struts.xml的配置 (2)1. <package>的属性与配置 (2)2. <action>的属性与配置 (3)3. <result>的属性与配置 (5)4. <include>的属性与配置 (6)5. <constant>配置struts.properties (6)6. <exception-mapping>与<global-exception-mapping> (6)7. <default-class-ref> (6)8. <default-action-ref> (6)9. <default-interceptor-ref> (7)10. <interceptors> (7)11. <interceptor-ref> (7)12. <global-results> (7)Struts的常见问题 (7)1. 超链接路径问题的说明 (7)2. 声明式的异常处理 (8)3. i18n国际化 (8)4. 拦截器 (8)5. 类型转换 (9)OGNL表达式 (10)1. 访问值栈中action的属性 (10)2. 访问方法 (10)3. 访问集合 (11)4. 投影(过滤的作用) (11)5. 使用“[]”访问元素 (11)Struts2的标签 (11)1. $、#、%的区别 (11)2. 控制标签 (11)3. 数据输出标签 (12)4. 通用标签 (13)5. HTML非表单标签 (13)6. HTML表单标签(很少用) (14)7. AJAX标签(很少用) (15)作者:李志伟编写完成时间:2013-11-21Struts2项目的构建与配置1.配置struts.xml(1)struts.xml文件位置:在项目的src目录下创建该文件,并配置。
Struts2学习笔记

Struts1是一个优秀的框架,但是还是具有很多不好的地方,如Action和ActionForm严重倚赖系统框架中的API。
如ActionForm必须继承ActionForm,Action控制器继承Action,测试麻烦。
Struts2是基于webwork发展而来,并非struts1使用MyEclipse8.5版本,可自动添加依赖struts2的系统库Struts2原理:说明:Struts2没使用Servlet作为核心控制器,而是换做一个Filter过滤器来进行,其类是org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 过滤器所拦截的请求是<url-pattern>/*</ url-pattern>(当然根据版本的不同,过滤器类也不同,如Org.apache.Struts2.dispatcher.FilterDispatcher)如果请求中带有.action或.do,则转入Struts2框架处理。
配置文件:Web.xml中:<filter><filter-name>struts2</filter-name><!-版本不同这里的配置不同-→<!—<filter-class>Org.apache.Struts2.dispatcher.FilterDispatcher</filter-class>→<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFi lter</filter-class><init-param><param-name>config</param-name><param-value>struts-default.xml,struts-plugin.xml,../struts.xml </param-value></init-param></filter><filter-mapping><filter-name>struts2</ filter-name><url-pattern>/*</ url-pattern></filter-mapping>Struts.xml<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN""/dtds/struts-2.1.dtd"> <struts><!—这个package可以处理文件同名的情况,一般不会更换-- ><package name="default"extends="struts-default"namespace="\"> <action name="Login"class="com.test.action.LoginAction"><result name="cheng">/index.jsp</result><result name="bai">/fail.jsp</result></action></package></struts>配置文件说明:1、package中的name为了区分不同的包2、extends是继承的包名3、namespace是提交时区分的地址,如namespace=”user”,则提交时需要加入action=”/user/xxx.action”控制其中的代码,其中数据直接封装和页面表单元素名称对应。
struts2学习笔记(部分)

1、namespaece(最好用模块的名字命名)Namespace 为空时,用于处理其他package不能处理的全部的action2、Package 用于区分重名的情况3、copy项目的方法及注意事项修改它的启动项引入别人的项目的方法4、action4`1修改文件的默认编码4`2每次访问action都重新new出一个新的对象,不存在同步的问题执行过程4`3Action 继承ActionSupport5、路径:获取系统绝对路径<% String context = request.getContextPath(); %><%String path = request.getContextPath();String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>使用绝对路径6、ActionMethod动态调用方法7、ActionWildcard通配符使用通配符,将配置量减到最低约定优于配置8、数值传递ActionAttrParamInputDomainModelDrivenModel过程9、中文问题 2.1.6.的bug不能解决中文问题10、11、value stack值栈< s:property value=“Name”/>取值栈中的数值如:< s:property value=“error”/>< s:property value=“[0]Propertyvalue是一个map,name就是key name is error 就是value 13、访问页面元素访问Stack Context中的元素14、include,模块包含15、认Action (好处:访问不存在时自动跳转带默认页)Default-action-ref默认action引用16、result类型1)默认是dispatcher 常用服务器端跳转2)Rdiect 只能是视图不能是action 客户端跳转,最后显示jsp3)Chain ---forwordaction action前不可以加”/”action之间的跳转,最后显示action4)RedirectAction action跳转,最后显示jsp服务器断的跳转:17、Global_ResultExtends =“要继承的包名“Result name属性:18、取value stack中的值动态绑定的。
struts2学习笔记

(3).
HttpServletRequest request=ServletActionContext.getRequest();//得到request
(4).实现ServletRequestAware等
国际化实现中英文切换:
两个超链接:<s:a action="changeLanguage?flag=zh">中文</s:a>
<s:a action="changeLanguage?flag=en">英文</s:a>
ChangeLanguageAction中内容:
public class ChangeLanguageAction {
{
struts.i18n.encoding=UTF-8 //设置编码格式
}
6.重定向跳转也可传Action中的属性值
<param name="username">${ername}</param>
7.struts2 中设置request ,session,application值
locale=;
context.setLocale(locale);
}
context.getSession().put("WW_TRANS_I18N_LOCALE",locale);
//必须将此WW_TRANS_I18N_LOCALE存放在session中
return "input";
}
}
11.struts2 文件上传下载,下载时需配置如下
struts2学习笔记

1.包头的设置name是struts的包,与Java的包名效果类似,但不是按项目中SRC中包名设置的。
namescape是该包的命名空间。
将作为访问该报Action的路径的一部分。
默认命名空间为namescape=””;假设form 表单提交给helloworld的action ,其action=”/test/helloworld”exctends是表示该包继承的其他包struts_default是任何包都必须继承的包。
否则无法使用struts的核心功能,比如参数上传到action,文件上传,数据校验等。
abstract=”true”定义为抽象包,不得包含Action。
2.action的查找顺序(1)寻找namespace为path1/path2/path3/的包,有这个包:寻找test的Action有这个action:执行没有这个action:寻找namespace为””的命名空间(默认命名空间)是否有这action,没有的话提示找不到action没有这个包:寻找namespace为path1/path2/的包重复(1)步骤。
3.action的默认属性4.Action中各种result的转发类型dispatcher(默认类型)redirect(重定向)redirectAction (重定向到新的Action)plainText (显示原始文件内容)result转发还可包含参数,该参数取自Action中的属性。
例:<action name=”login” class=”xxxx.xxx.xxx.sdsds”><result name=”sucess”> /aaa.jsp?username=${ssss}</result></action>其中ssss是login这个Action中所必须具有的属性redirect书写格式1.<result name=”sucess” type=”redirectAction”>login</result>该写法只能访问位于同一包中的Action;2. <result name=”sucess” type=”redirectAction”><parma name=”actionname”>login</parama><parma name=”namespace”>/xxxxx</parama></result>该写法可访问位于其他包的ActionplainText书写格式1.<result type=”plainText”>/login.jsp</result>2. <result type=” plainText”><parma name=”location”>/login.jsp</parama><parma name=”charSet”>UTF-8</parama></result>全局转发只能在包内定义全局转发。
struts2学习笔记

一、Struts2的一些优点:1、struts2没有像struts1一样跟servletAPI和struts1API有紧密的耦合2、struts2提供了拦截器,利用拦截器可以进行AOP编程,实现权限拦截等功能。
3、struts提供了类型转换器,我们可以把特殊的请求参数转换成需要的类型,4、struts2提供支持多种表现层技术,如:JSP、freeMaker、velocity等。
5、struts2的输入校验可以对指定方法进行校验,解决了struts1长久之痛。
6、提供了全局范围、包范围和Action范围的国际化资源文件管理实现。
二、Struts2的开发环境搭建:1、寻找开发struts2应用以来的jar文件,至少需要的六个jar文件。
2、编写struts2的配置文件。
3、Struts2在web中的启动。
当filter被读取的时候就会启动配置文件三、struts2中配置的包介绍Struts-default中定义了struts中的一些核心功能,比如拦截器,用来实现文件上传,和数据验证。
四:Action名称的所搜顺序:Htpp://localhost:8080/struts/test/helloword,在默认命名空间的情况下,或者是命名空间为空的情况下可以这样访问Htpp://localhost:8080/struts/test/path2/path1/helloword,五:Action中的各项默认值:如果没有给action配置class,会默认为actionsupport,如果没哟配置method方法,会默认配置action中excute方法,如果没有配置result,也会默认为success。
六:struts视图研究(result各种转发类型):七、Action属性注值当数据经常发生变化时就会采用此种方法八、指定需要struts2处理的请求后缀:默认使用的是.action后缀访问Action,其实可以通过struts.action.extension进行修改的。
struts2学习笔记
struts2 的处理流程: 核心控制器(StrutsPrepareAndExecuteFilter)--->Interceptor--->action---->业务逻辑层--->dao 层
一.struts2 核心文件 struts.xml 的配置
<package name="struts2" namespace="" extends="struts-default"> <action name="sum" class="com.alex.FirstAction"> <result name="positive">/positive.jsp</result> <result name="negative">/negative.jsp</result> </action> <constant name="struts.action.extension" value="jun,lu"/> <!--指定需要 Struts 2 处理的请求后缀,多个之间用逗号分开--> <constant name="struts.enable.DynamicMethodInvocation" value="false"/> <!--关闭动态方法调用。--> <constant name="struts.custom.i18n.resources" value="message"/> </package> 说明:space 声明命名空间。这里和表单提交的要保持一致。例如: namespace="/mystruts" 那么在表单提交的时候应该<s:form action="mystruts/sum.action" > namespace="" 那么在表单提交的时候应该<s:form action="sum.action" > 2.<action name="sum" class="com.alex.FirstAction"> class 便是对应的 Action 类 name 对应 action 的唯一标识。和表单提交时保持一致。例如: name="yj" 那么在表单提交的时候应该<s:form action="yj" > 3.<result name="positive">/positive.jsp</result> 判断跳到哪一个页面,其中 name 是唯一标识。和"com.alex.FirstAction"的返回值进 行对比。相同就跳到相应的页面 4. <constant name="struts.custom.i18n.resources" value="message"/> 配置常量 资源文件--> 1.Action 范围:类名.properties (在国际化的时候,那么就应该是:类名_zh_CN.properties ) //配置一些类型转换错误信息和其他的信息 2.包范围:package.properties 需要放在包下面,只能被该包和子包访问 (在国际化的时候,那么就应该是:package_zh_CN.properties ) 3.全局范围:通过 struts.custom.i18n.resources 来定义全局资源文件,比如在 struts.xml 中配置: <constant name="struts.custom.i18n.resources" value="message"/> 那么全局资源文件就是 message.properties
struts2学习笔记
7. Struts1 的配置文件只需 struts-config.xml;Struts2 的配置文件有 struts.xml 和 struts.properties。struts.properties 中有两个 struts.devMode = fase 和 struts.configuration.xml.reload = true 很可爱,分别设置当前是开发还是生产模式,以及 struts.xml 改变后是否自动重新加载,免去了改配置手工重启应用的必须步骤。
Struts2 学习笔记(四)
1. 按这个顺序加载 Struts2 的常量,struts-default.xml、struts-plugin.xml、struts.xml、web.xml;后加载的会覆盖前面的同名常量。强烈不推荐在 web.xml 中配置 Struts2 常量。
2. Struts1 中有一种 Action 类型是 ForwardAction,而在 Struts2 中相应的配置方式是 <action name="Showcase"><result>/showcase.jsp</result></action>,Showcase.action 直接映射到 /showcase.jsp。
3. Struts1 的 Action 须继承抽象 Action 类,侵入了 Servlet API;而 Struts2 的 Action 可以实现 ActionSupport,或者只要一个纯净的 POJO 来充当,完全与 Servlet 绝缘。也因此带来测试性 Struts2 要比 Struts1 强,可把 Struts TestCase 扔到一旁去了。
Struts2学习笔记
</action>
</package>
要访问other()方法,可以通过这样的URL访问:/test/helloworld_other.action
9.OGNL
Struts2将应用范围里的数据以及Action处理的数据都存储在一个区域里。在Struts2中叫做值栈,valueStack。
OGNL就是从值栈中取出自己数据,并在某些条件下进行数据过滤和计算的表达式语言。先入后出。
OGNL中如果搜索的数据不是值栈里存储的数据,而是其他对象,特别是Struts2的ActionContext中的对象,则在访问
这些对象的时候,前面要加上“#”。
价格小于50元的建材
<s:iterator value="materials.{?#this.mainbid<50}">
<s:property value="materialName" />建材的价格是<s:property value="materialValue" />元!
</result>
当多个action中都使用到了相同视图,这时我们应该把result定义为全局视图。struts1中提供了全局forward,struts2中也提供了相似功能:
<package ....>
<global-results>
<result name="message">/message.jsp</result>
struts2课堂笔记(第一天)
八、 基于注解的struts2 开发
知识结构(原理及流程------>所有配置文件----->重点配置文件(struts.xml)----------->常量配置(还有Action)------>
Action类的编写------>action中方法调用-------->动态方法调用--------->ServletAPI获取三种方法
今天所学:
一、框架概述
二、Struts2开发快速入门
三、struts2 运行流程分析
四、 struts2 常见配置(配置文件加载顺序,struts.xml常用配置,常量配置)
五、 Action的访问(Action的三种编写方法,详细配置Action , 动态方法调用)
六、在Action中使用Servlet API
四、 struts2 常见配置
学习路径
1)、 struts.xml常量配置(配置文件顺序)、Action访问(Servlet API)、结果集 (使用Struts2 编写简单案例)
2)、 请求数据
3)、 响应页面生成
1、 struts2 配置文件的加载顺序
struts2 配置文件 由核心控制器加载 StrutsPrepareAndExecuteFilter (预处理init(),执行过滤)
init_DefaultProperties(); // [1] ---------- org/apache/struts2/default.properties
init_TraditionalXmlConfigurations(); // [2] --- struts-default.xml,struts-plugin.xml,struts.xml
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Struts2项目的构建与配置1.配置struts.xml(1)配置struts.xml可以参考下载的struts-2.3.14.1-all.zip解压后的apps文件夹下的参考项目的struts.xml文件。
(2)主要的配置如下:<constant name="struts.devMode"value="true"/><package name="hello"namespace="/"extends="struts-default"><action name="hello"><result>/hello.jsp</result></action></package><constant name="struts.devMode"value="true"/> value="true"表示是开发模式,当修改了配置时服务器会自动加载修改后的配置,不需要中期服务器,方便开发。
(3)namespace="/"与浏览器的访问地址有关,namespace的默认值为空。
(4)<action name="hello"><result>/hello.jsp</result></action> action的name值与浏览器的访问地址有关,当地址是“http://…/hello”时,浏览器就会返回result中的hello.jsp 的页面。
2.配置web.xml(1)配置web.xml也可以参考下载的struts-2.3.14.1-all.zip解压后的apps文件夹下的参考项目的web.xml文件(2)主要配置如下:<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>3.配置Struts2的jar包(1)复制下载的struts-2.3.14.1-all.zip解压后的apps文件夹下的参考项目的WEB-INF\lib文件夹下的所有的jar包到我们自己项目的WEB-INF\lib文件夹下即可。
Struts.xml的配置1.package的属性与配置(1)package的使用说明:类似于Java程序里的package,主要用于区分同名的action。
在真正的项目开发中package通常来区分不同的模块。
例如:<package name="hello"namespace="/login"extends="struts-default">…</package>(2)name属性:用于区分不同的package,此属性不能省略不写。
(3)extends属性:用于继承其他的package,继承了某个package就包含了某个package里的所有配置,此属性可以省略不写,默认继承struts-default。
(4)namespace属性:表示浏览器访问的路径,此属性可以省略不写,默认为空,当此属性为空时,该package里的action可以匹配浏览的任何请求的action。
(5)abstract属性:此属性的值为false表示此package非抽象的,若为true表示此package为抽象的。
2.action的属性与配置(1)action的使用说明:action是配置在package里的,一个package可以配置多个action,每一个action都可以处理一种请求,通常一个action就是一个含有public String execute()方法的Java类,根据execute方法的不同的返回值来返回相应的页面给用户。
例如:<action name="hello"class="login.Hello" method="execute">…</action>(2)name属性:定义action的名称,也表示浏览器访问的路径。
(3)class属性:定义该action所对应的具体的Java类,其值是具体的Java类的路径。
(4)method属性:定义该action调用Java类的具体方法,调用的方法的返回类型必须是String类型,如果用户没有定义该属性,则默认调用execute方法。
(5)method动态方法调用(BMI)可以在浏览器地址栏里动态的指定调用action的那一个方法,如:http://localhost:8080/Struts2/hello/hello!add。
调用格式为:http://…/action名!方法名(6)使用通配符动态调用action及其方法并动态的返回页面例如:<package name="hello"namespace="/hello"extends="struts-default"><action name="hello_*"class=" com.lzw.HelloAction"method="{1}"><result name="hello">/hello_{1}.jsp</result></action><action name="*_*"class="com.lzw.{1}Action"method="{2}"><result>/{1}_{2}.jsp</result></action></package>第一个action所对应的Java类已确定是:com.lzw.HelloAction。
但是对于不同的请求会调用该Java类里的不同的方法,并返回不同的页面,如:http://…/hello/hello_add,会调用add()方法,并返回hello_add.jsp页面;若想调用execute()方法,就会返回hello_execute.jsp页面,对应的请求就是:http://…/hello/hello_execute。
第二个action所对应的Java类并未确定,此action更为灵活,会根据不同的请求调用不同的action(即:Java类)以及其不同的方法,并返回不同的页面。
如在浏览器的地址栏输入:http://…/hello/User_add,就会调用erAction类里的add()方法,并返回User_add.jsp页面。
注意:在项目开发的时候一定要谨记“约定优于配置”原则,要约定好各个文件、方法以及类的起名规则!!!(7)请求向action传递参数例如:action里含有两个属性name与age,并且含有相应的get与set方法,则请求:http://…/hello/hello_add?name=lizhiwei&age=12,会把“lizhiwei”与“12”通过set方法赋值给name与age。
当action里还有一个属性u而且这个属性不是基本类型,而是User类型(用户自定义类型),该类型里也含有name与age属性和相应的set与get方法,若要通过请求的方式给u对象赋值,则请求如下:http:// …/hello/hello_add?name=lizhiwei&age=12&=li&u.age=13,该请求会使得u的name属性值为li,age值为13。
注意:通过这种方法一定要定义好相应的set与get方法,否则无法传值!!!(8)action实现ModelDriven<T>接口,进行参数传递例如:当一个action里含有一个属性u而且这个属性不是基本类型,而是User类型(用户自定义类型),该类型里也含有name与age属性和相应的set与get方法,若要通过请求的方式给u对象赋值;由于action实现了ModelDriven<T>接口,就会重写getModel()方法,此时在action里就不需要写属性u的set与get方法,但是需要用new来创建u 对象(而不是Struts2自动创建)。
请求:http://…/hello/hello_add?name=li&age=13,会把u的name属性赋值为li,age属性赋值为13。
重写getModel()方法的代码如下:public User getModel(){return u;}(9)参数传递的乱码简单解决方式:在struts.xml配置如下代码:<constant name="struts.i18n.encoding"value="UTF-8"></constant>根据配置value的值来配置编码,但是请求方式应尽量使用post,避免使用get。
注意:此方式在某些Struts2版本中使用时并不能解决问题,是因为那些版本存在bug。
本次实验使用的是struts-2.3.14.1版本,能够成功解决乱码问题!(10)action的简单数据验证如果action需要对接收到的参数进行验证,而要把验证到的信息返回给页面显示,常用且简单的做法是让此action继承ActionSupport,并在方法里增加相应验证代码,例如:public String add(){if(name==null || "".equals(name)){this.addFieldError("name", "参数不能为空!");}return"hello";}其中的this.addFieldError("name", "参数不能为空!")就是向Value Stack Contents里添加错误信息(也可以向一个参数名添加多个错误信息),添加的信息可以在页面里取出来。