Struts2学习笔记.doc_第1页
Struts2学习笔记.doc_第2页
Struts2学习笔记.doc_第3页
Struts2学习笔记.doc_第4页
Struts2学习笔记.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Struts2学习笔记Struts2项目的构建与配置21. 配置struts.xml22. 配置web.xml23. 配置Struts2的jar包2Struts.xml的配置21. 的属性与配置22. 的属性与配置33. 的属性与配置54. 的属性与配置65. 配置perties66. 与67. 68. 69. 710. 711. 712. 7Struts的常见问题71. 超链接路径问题的说明72. 声明式的异常处理83. i18n国际化84. 拦截器85. 类型转换9OGNL表达式101. 访问值栈中action的属性102. 访问方法103. 访问集合114. 投影(过滤的作用)115. 使用“”访问元素11Struts2的标签111. $、#、%的区别112. 控制标签113. 数据输出标签124. 通用标签135. HTML非表单标签136. HTML表单标签(很少用)147. AJAX标签(很少用)15作者:李志伟编写完成时间:2013-11-21Struts2项目的构建与配置1. 配置struts.xml(1) struts.xml文件位置:在项目的src目录下创建该文件,并配置。但是要注意的是项目src目录下的文件被编译后都会被放到WEB-INF的classes文件夹下。(2) 配置struts.xml可以参考下载的struts--all.zip解压后的apps文件夹下的参考项目的struts.xml文件。(3) 主要的配置如下:/hello.jsp value=true表示是开发模式,当修改了配置时服务器会自动加载修改后的配置,不需要中期服务器,方便开发。(4) namespace=/与浏览器的访问地址有关,namespace的默认值为空。(5) /hello.jsp action的name值与浏览器的访问地址有关,当地址是“http:/hello”时,浏览器就会返回result中的hello.jsp的页面。2. 配置web.xml(1) 配置web.xml也可以参考下载的struts--all.zip解压后的apps文件夹下的参考项目的web.xml文件(2) 主要配置如下:struts2org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterstruts2/*3. 配置Struts2的jar包(1) 复制下载的struts--all.zip解压后的apps文件夹下的参考项目的WEB-INFlib文件夹下的所有的jar包到我们自己项目的WEB-INFlib文件夹下即可。Struts.xml的配置1. 的属性与配置(1) package的使用说明:类似于Java程序里的package,主要用于区分同名的action。在真正的项目开发中package通常来区分不同的模块。例如:(2) 属性介绍:在Struts2框架中是通过包来管理action、result、interceptor、interceptor-stack等配置信息的。包属性如下:属性 是否必需描述name 是 包名,作为其它包应用本包的标记 extends 否 设置本包继承其它包 namespace否 设置包的命名空间 abstact 否 设置为抽象包 (3) extends属性的详解当一个包通过配置extends属性继承了另一个包的时候,该包将会继承父包中所有的配置,包括 action、result、interceptor等。由于包信息的获取是按照配置文件的先后顺序进行的,所以父包必须在子包之前被定义。通常我们配置struts.xml的时候,都继承一个名为“struts-default.xml”的包,这是struts2中 内置的包。(4) namespace的详解namespace主要是针对大型项目中Action的管理,更重要的是解决Action重名问题,因为不在同一 个命名空间的Action可以使用相同的Action名的。如果使用命名空间则URL将改变,比如我们有一下配置文件:/success.jsp则此配置下的Action的URL为http:/localhost:8080/login.action假如为这个包指定了命名空间/success.jsp则此配置下的Action的URL为http:/localhost:8080/user/login.action默认命名空间:Struts2中如果没有为某个包指定命名空间,该包使用默认的命名空间,默认的命名空 间总是。指定根命名空间:当设置了命名空间为“/”,即指定了包的命名空间为根命名空间时,此时所有根 路径下的Action请求都会去这个包中查找对应的资源信息,即http:/localhost:8080/*.action。2. 的属性与配置(1) action的使用说明:action是配置在package里的,一个package可以配置多个action,每一个action都可以处理一种请求,通常一个action就是一个含有public String execute()方法的Java类,根据execute方法的不同的返回值来返回相应的页面给用户。例如:(2) 属性介绍属性名称 是否必须 功能描述name 是 请求的Action名称 class 否 Action处理类对应具体路径 method 否 指定Action的方法名,如果没有指定method则默认执行execute方法converter否 指定Action使用的类型转换器 (3) method动态方法调用(BMI)可以在浏览器地址栏里动态的指定调用action的那一个方法,如:http:/localhost:8080/Struts2/hello/hello!add。调用格式为:http:/action名!方法名(4) 使用通配符动态调用action及其方法并动态的返回页面例如: /hello_1.jsp /1_2.jsp 第一个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,就会调用com.lzw.UserAction类里的add()方法,并返回User_add.jsp页面。注意:在项目开发的时候一定要谨记“约定优于配置”原则,要约定好各个文件、方法以及类的起名规则!(5) 请求向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方法,否则无法传值!(6) action实现ModelDriven接口,进行参数传递例如:当一个action里含有一个属性u而且这个属性不是基本类型,而是User类型(用户自定义类型),该类型里也含有name与age属性和相应的set与get方法,若要通过请求的方式给u对象赋值;由于action实现了ModelDriven接口,就会重写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;(7) 参数传递的乱码简单解决方式:在struts.xml配置如下代码:根据配置value的值来配置编码,但是请求方式应尽量使用post,避免使用get。注意:此方式在某些Struts2版本中使用时并不能解决问题,是因为那些版本存在bug。本次实验使用的是struts-版本,能够成功解决乱码问题!(8) action的简单数据验证如果action需要对接收到的参数进行验证,而要把验证到的信息返回给页面显示,常用且简单的做法是让此action继承ActionSupport,并在方法里增加相应验证代码,例如:public String add()if(name=null | .equals(name)this.addFieldError(name, 参数不能为空!);return hello;其中的this.addFieldError(name, 参数不能为空!)就是向Value Stack Contents里添加错误信息(也可以向一个参数名添加多个错误信息),添加的信息可以在页面里取出来。在页面里取出错误信息的代码如下:当错误信息不为空时,错误信息就会显示出来,但是要想使用这些标签必须还要在页面里添加以下代码: (9) 在action里访问Web元素(request、response、session、application等)a) 例如:用户登录后action把用户名放到session里,在action里的主要代码如下:private Map session;public String add()session=ActionContext.getContext().getSession();/得到sessionsession.put(name, name);/设置值到session里return hello;在前台JSP页面里取的name值得代码如下:也可也使用Struts2的标签取得name值,具体代码如下:注意:上面action里得到的session对象并不是真正服务器里的session对象,且该session对象是Map类型的,它只是Struts2模拟的session,只是Struts2能够把开发对此session的操作映射到真正的session上去。所以操作此session是等效的。b) 第二种在action里取得Web元素的方法,此时的action要实现SessionAware接口,并重写里的setSession方法,具体实现如下:(此种方式最常用)public void setSession(Map arg0) session=arg0;/使用了依赖注入,由框架注入值(这样的代码就能完成问题)c) 第三种在action里取得Web元素的方法,此方法并不常用,代码如下:private HttpServletRequest request=ServletActionContext.getRequest();private HttpSession session=request.getSession();private ServletContext application=session.getServletContext();d) 第四种在action里取得Web元素的方法,此方法是action实现ServletRequestAware接口,重写如下方法:(此方法也不常用)public void setServletRequest(HttpServletRequest arg0) HttpServletRequest request=arg0;HttpSession session=request.getSession();ServletContext application=session.getServletContext();(10) 默认action的配置例如下面的配置: /UnderConstruction.jsp使用了default-action-ref定义了默认的action,定义默认action后,当用户访问此namespace下的不存在的action时,这些请求都会交给默认的action处理。3. 的属性与配置(1) 使用说明:result是配置在action里的,用来定义action的处理后返回给用户的页面。例如:/hello/Error.jsp(2) name属性:action处理请求会返回一个字符串与此属性的值匹配,若匹配成功服务器就会返回该result所映射的页面。此属性的常用值有 :success、none、error、input、login;默认值是success。(3) type属性:此属性的值与页面的跳转方式有关,此属性值有:chain、dispatcher、freemarker、httpheader、redirect、redirect-action、stream、velocity、xslt、plaintext,其中最常用的有:dispatcher、redirect、chain、redirect-action。其具体的含义如下:dispatcher:是默认值,表示服务器跳转,只能跳转到页面,不能是action。redirect:客户端跳转到页面,不能是action。chain:表示服务器跳转到一个action。redirect-action:客户端跳转到action。(4) 配置全局的result,例如:/Error.jsp/Error.jspLogon!input配置了global-results在一个package内的所有的action里就都含有了这些result的配置,相当于这个package里所有的action共用这些result。(5) 利用result动态的返回结果集,配置如下: $r 使用“$”与“”来动态的得到跳转的页面路径,其中的参数“r”就是action里的一个属性,此action对应的HelloAction.java文件的主要代码如下:public String add()r= /index.jsp;return SUCCESS;其实当action执行add方法时使得r的值为“/index.jsp”,执行完毕后该action所有属性都保存到了Value Stack Contents之中,而result里的“$r”会取到r的值,就会跳转到index.jsp页面了。(6) 带参数的结果集,类似于上例,配置如下: /login.jsp?name=$r 其实现的原理与上例相同,但是值得注意的是:只有当使用客户端跳转时才要传递参数。4. 的属性与配置(1) 使用说明:使用include可以把struts.xml文件模块化,每个模块都可以是一个xml配置文件,使用include把其中的每个模块导入到struts.xml文件里,便于项目开发时的模块的划分与分配。例如:(2) file属性:其值是需要导入的配置文件地址。5. 配置perties在struts.xml文件中配置perties文件的属性。6. 与这两个标签都是用来配置发生异常时对应的视图信息的,只不过一个是Action范围的,一个是包范围的,当同一类型异常在两个范围都被配置时,Action范围的优先级要高于包范围的优先级.这两个标签包含的属性也是一样的:属性名称是否必须 功能描述name 否 用来表示该异常配置信息 result 是 指定发生异常时显示的视图信息,这里要配置为逻辑视图 exception是 指定异常类型 示例代码为:7. 当我们在配置Action的时候,如果没有为某个Action指定具体的class值时,系统将自动引用标签中所指定的类。在Struts2框架中,系统默认的class为ActionSupport,该配置我们可以在xwork的核心包下的xwork-default.xml文件中找到。例如:public class DefaultClassRef public void execute()System.out.println(默认class开始执行);在struts.xml中配置/index.jsp8. 如果在请求一个没有定义过的Action资源时,系统就会抛出404错误。这种错误不可避免,但这样的页面并不友好。我们可以使用来指定一个默认的Action,如果系统没有找到指定的Action,就会指定来调用这个默认的Action。/jsp/actionError.jsp9. 该标签用来设置整个包范围内所有Action所要应用的默认拦截器信息。事实上我们的包继承了struts-default包以后,使用的是Struts的默认设置。我们可以在struts-default.xml中找到相关配置:在实际开发过程中,如果我们有特殊的需求是可以改变默认拦截器配置的。当时一旦更改这个配置,“defaultStack”将不再被引用,需要手动最加。10. 通过该标签可以向Struts2框架中注册拦截器或者拦截器栈,一般多用于自定义拦截器或拦截器栈的注册。该标签使用方法如下:11. 通过该标签可以为其所在的Action添加拦截器功能。当为某个Action单独添加拦截器功能后,中所指定的拦截器将不再对这个Action起作用。12. 该标签用于设置包范围内的全局结果集。在多个Action返回相同逻辑视图的情况下,可以通过标签统一配置这些物理视图所对应的逻辑视图。/index.jspStruts的常见问题1. 超链接路径问题的说明(1) 问题的引出action的配置如下: /hello.jsp helo.jsp页面的主要代码如下:进入index.jsp与hello.jsp文件同一位置的index.jsp文件的主要代码如下:index在浏览器地址栏输入“http:/localhost:8080/Struts2/hello/hello”访问hello.jsp效果如下:点击超链接,效果如下:(注意浏览器的地址栏)出现了404错误!由于namespace=/hello把hello.jsp的路径映射成/hello/hello,从而导致hello.jsp中的超链接路径也成了/hello/index.jsp,也就出现404地址错误了。(2) 解决此路径问题的方法只要使用了绝对路径便可解决该问题,具体做法是在hello.jsp文件中添加如下代码:此时的basePath的值就是当前的文件路径,在使用超链接时只需要把该值加到前面即可,例如:a href=进入index.jsp还可以使用base标签更为方便的解决问题,只需要在head标签里加入如下代码:base href=此时超链接的写法不变还是进入index.jsp2. 声明式的异常处理(1) 使用说明:使用exception-mapping配置action的异常处理页面。 /Login.action/DataAccess.jsp(2) exception属性:配置异常的类型,此类型应该和action程序抛出的异常类型相对应。(3) result属性:此类型的值表示出异常后的返回页面位置,与相应的result的配置对应。(4) 在配置时为每个action都配置异常实在太繁琐,这时就可以使用全局的异常处理,如下(该配置应放在package里):3. i18n国际化(1) action级别的国际化使用action级别的国际化,该action必须继承ActionSupport,而且国际化资源文件必须与该action在同一目录下,文件名也必须是该action的类名加后缀(如:LoginAction_en_US.properties);取得该资源文件的方式是在JSP页面里使用以下语句:,其实该代码是调用了当前action的getText方法。(2) 包(package)级别的国际化使用包级别的国际化,国际化资源文件必须在该包的目录下,文件名也必须是类似package_en_US.properties的形式,前缀必须是package。(3) APP级别的国际化使用APP级别的国际化,国际化资源文件必须与struts.xml配置文件在同一目录下,文件名可以任意,但必须在struts.xml文件里配置,例如:国际化资源文件名为lzwAPP_en_US.properties,则配置如下:,其value值就是国际化资源文件名的前缀。取得该资源文件的方式是在JSP页面里使用以下语句:(4) 向国际化文件里传参数例如:国际化资源文件里有“welcome.msg=欢迎0登录,1”,则可以向01里传参数,代码如下:上午好!若user的值为“李志伟”,则前台的显示效果:欢迎李志伟登录,上午好!(5) 动态的语言切换实现方法:在页面地址后传递一个参数就可以实现语言的切换。例如:http:/login?request_locale=en_US(切换到英语)4. 拦截器(1) 说明:拦截器就是在请求交给action前的拦截处理。(2) 自定义拦截器自定义拦截器时可以继承Interceptor类,实例程序如下:public class ApplicationInterceptor implements Interceptor public String intercept(ActionInvocation invocation) throws Exception /编写自己的拦截处理代码 return invocation.invoke();public void destroy() public void init() (3) 拦截器的配置在package里配置拦截器,代码如下:在action里使用拦截器时,代码如:system/log_list.jsp注意:在action中要使用自定义的拦截器,必须加上以下代码,否则只使用了自定义的拦截器,未使用系统的拦截器。5. 类型转换(1) 说明:类型转换是http请求向action里的属性(成员变量)传值时,其值的类型的转换过程。(2) 默认转换a) 若action里有一个int型的age成员变量,则http请求是:http:/action名?age=20b) 若action里有一个Date型的d成员变量,则http请求是:http:/action名?d=2013-08-04 16:12:33,或者是http:/action名?d=2013-08-04在JSP页面里格式化显示如下:c) 若action里有一个List型的interests成员变量,则http请求是:http:/action名?interests=english&interests=mathd) 若action里有一个Map型的m成员变量,则http请求是:http:/action名?ma=aaa&mb=bbb(3) 自定义转换器(很少用)a) 当action里的成员变量是用户自定义的类型时,则用户要相应的编写转换器。b) 编写自定义转换器需要继承DefaultTypeConverter或StrutsTypeConverter类,示例程序如下:继承DefaultTypeConverter:public class MyPointConverter extends DefaultTypeConverterOverridepublic Object convertValue(Object value, Class toType) if(toType = Point.class) Point p = new Point();String strs = (String)value;String xy = strs0.split(,);p.x = Integer.parseInt(xy0);p.y = Integer.parseInt(xy1);return p;if(toType = String.class) return value.toString();return super.convertValue(value, toType);继承StrutsTypeConverter:public class MyPointConverter extends StrutsTypeConverterOverridepublic Object convertFromString(Map context, String values, Class toClass) Point p = new Point();String strs = (String)values;String xy = strs0.split(,);p.x = Integer.parseInt(xy0);p.y = Integer.parseInt(xy1);return p;Overridepublic String convertToString(Map context, Object o) return o.toString();c) 编写自定义转换器后还要进行注册才能正常转换,注册方式有两种:局部注册、全局注册(常用)。局部注册的方法:创建局部注册文件,且该文件要与相应的action放在同一目录下,文件名规定是:action名-perties。文件内容应是:action里成员变量名=自定义转换器名(使用类点包名)。例p=com.lzw.MyPointConverter。全局注册的方法:创建全局注册文件,且该文件要与s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论