上篇中谈到了Struts需要以下基础jar包,这里粗略补充一下各个jar包的作用:
一、Struts2的访问流程及架构
1.1Struts2访问流程
此图仅仅帮助理解Struts2访问流程
1.2Struts2架构
Struts核心——拦截器
1.表面上看,拦截器帮助我们封装了很多功能。
2.拦截器优秀的设计——可插拔式设计。3.aop(面向切面编程)思想。
二、struts.xml配置
下面是struts.xml中的部分配置:
<struts>
<constant name="struts.devMode" value="true" />
<package name="Struts2_StudyDemo" namespace="/hello" extends="struts-default">
<action name="index" class="com.zl.action.HelloAction" method="excute">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
2.1 package元素
将Action配置封装,就是可以在package中配置很多action。(和Java中的package不能混为一谈)
属性:
《1》name:给包起个名字,起标识作用,随便起,不能与其他包同名。
《2》namespace:给action的访问路径中定义一个命名空间。
《3》extends:继承一个指定包(必选)。
《4》abstract:包是否为抽象的,标识性属性,标识该包不能独立运行,专门被继承。
2.2 action元素
配置Action类。
属性:
《1》name:设定了Action访问资源名。
《2》class:Action的完整类名。
《3》method:指定调用Action中的哪个方法处理请求。
2.3 result属性
结果配置。
属性:
《1》name:标志结果处理的名称,与action方法的返回值对应。
《2》type:指定调用哪一个Result类来处理结果,默认使用转发。
《3》标签体:填写页面的相对路径
三、Struts2常量配置
3.1 修改Struts2常量配置
Struts2默认常量配置位置:
打开default.properties,可以看到如下的一些常量配置信息:
想要修改这些配置信息,有如下三种方式:
《1》在struts.xml中配置(重点):在struts标签下添加<constant>标签。如下:
<constant name="struts.i18n.encoding" value="GBK"></constant>
《2》在src下新建一个struts.properties文件(了解):把需要修改的配置信息复制粘贴过来,修改。如下: struts.i18n.encoding=GBK
《3》在web.xml中配置(了解):在<web-app>标签下添加<context-param>标签。具体如下:
<context-param>
<param-name>struts.i18n.encoding</param-name>
<param-value>GBK</param-value>
</context-param>
注:上述写的《1》《2》《3》顺序也是它们的加载顺序,后面加载的会覆盖前面加载的。
不过在真正的开发中只会在struts.xml配置即第《1》种。
3.2常量配置
《1》struts.i18n.encoding=UTF-8(国际化)——解决Post提交乱码
《2》struts.action.extension=action,,(指定访问action的后缀名)
《3》struts.devMode = false(指定Struts2 是否以开发模式运行,默认为false)
为true时:1.热加载主配置文件(不需要重启struts.xml即可生效)
2.提供更多的错误提示信息,方便开发时的调试
3.3使用<include>元素引入其他struts配置文件
例,在src下的struts.xml中引入com.zl.action包中的struts.xml:
<include file="com/zl/action/struts.xml"></include>
四、Struts2配置的进阶
4.1 动态方法调用(重点)
左图BookAction中有四种方法,根据用户不同的选择,这四种方法每一个方法都需要在struts.xml里注册一个action元素(右图),过于繁琐。在这种情况下,可以使用动态方法来配置。
有以下两种配置方法:
《1》在struts.xml中设置常量struts.enable.DynamicMethodInvocation的值为true
该常量表示配置动态方法调用是否开启,默认是关闭的,需要开启。
<struts>
<contant name="struts.action.extension" value="action"></constant><!--指定访问时的action的后缀名为.action-->
<constant name="struts.enable.DynamicMethodInvocation" value="true" ></constant>
<package name="IntercepterStruts2Demo" namespace="/" extends="struts-default">
<!-- 关于book操作 -->
<action name="BookAction" class="com.zl.action.BookAction">
<result>/success.jsp</result>
</action>
</package>
</struts>
在访问add方法时:
http://localhost:8080/IntercepterStruts2Demo/BookAction!add.action
在访问find方法时:
http://localhost:8080/IntercepterStruts2Demo/BookAction !find.action以此类推,这种方式显然很麻烦,所以一般用下面这种:
《2》*通配符方式:使用{1}取出第一个*通配的内容
(*前面的下划线可以是#或者没有或者别的,但一般都会用下划线)
<struts>
<constant name="struts.devMode" value="true" />
<package name="IntercepterStruts2Demo" namespace="/" extends="struts-default">
<action name="BookAction_*" class="com.zl.action.BookAction" method="{1}">
<result>/success.jsp</result>
</action>
</package>
</struts>
访问find()方法:
http://localhost:8080/IntercepterStruts2Demo/BookAction_find.action
4.2 Struts2中的默认配置(了解即可)
<struts>
<package name="IntercepterStruts2Demo" namespace="/" extends="struts-default">
<default-action-ref name="loginAction"></default-action-ref>
<action name="loginAction" class="com.zl.action.LoginAction" method="excute">
<result name="login">/login.jsp</result>
</action>
</package>
</struts>
《1》<action>中的class属性:默认为com.opensymphony.xwork2.ActionSupport。<default-action-ref>(需要自己手动配)用来修改默认Action,其中的name属性表示找不到包下的Action时,上例中会使用loginAction作为默认的Action处理请求。
《2》<action>中的method属性:可以不写,默认为”execute“。
《3》<result>中的name属性:默认为success。
《4》<result>中的type属性:dispatcher转发。
五、Action类配置
《1》创建一个类,可以是POJO。
POJO:表示不用继承任何父类,也不需要实现任何接口。
使struts2框架的代码侵入性更低。
《2》实现一个接口Action。
package com.zl.action;
import com.opensymphony.xwork2.Action;
public class ActionDemo implements Action{
@Override
public String execute() throws Exception {
return null;
}
}
里面必须要实现execute()方法,提供action方法的规范。为了方便,Action接口预置了一些字符串,可以在返回结果时使用。
《3》继承一个类ActionSupport。(推荐使用)
帮我们实现了Validateable、ValidationAware、TextProvider、LocalProvider这些接口,当我们需要用到这些接口的实现时,不需要自己来实现了。