3.1.1 - Model1和Model2
Model1与Model2很不同,Model2基于MVC
3.1.2 - MVC思想及其优势
Model、View、Controller三个部分以最少的耦合协作,使应用具有较好的可扩展性和可维护性
3.2 3.3 - 创建第一个struts2项目
-
下载Struts2包
-
IDEA创建Struct2项目,将Struts2的lib文件夹下的几个必须的包复制到WEB-INF/lib路径下
-
编辑web.xml配置文件,配置Struts2的核心Filter,使拦截所有用户请求
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
-
创建登录的Action类:LoginAction
-
创建登录页面:login.jsp;登录成功页面:welcome.jsp
-
配置struts.xml,配置LoginAction来处理login.jsp的请求
3.4.1 - 常量配置:
Struts2按如下搜索顺序加载常量:
struts-default.xml -> struts-plugin.xml -> struts.xml -> struts.properties -> web.xml ,这些配置文件中都可以配置struts常量
struts2常量对整个应用起作用,也被称为struts2属性
3.4.2 - 包含其他配置文件
为避免struts.xml文件过于庞大,可分为多个配置文件,然后在struts.xml中通过include导入
3.5.1 - action接口和actionsupport基类
使用Action来封装HTTP请求参数,因此Action类中应包含与请求参数对应的属性,并为属性提供对应的setter和getter方法,Action类中的execute()方法用于处理用户请求并返回result
struts2只提供了Action接口
public interface Aciton
{
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final String LOGIN = "login";
public static final String NONE = "none";
public static final String SUCCESS = "success";
public String execute() throws Exception;
}
另外struts2为Action接口提供了一个实现类:ActionSupport,该类中提供了许多默认方法,自定义的Action类只需继承ActionSupport类,大大简化开发
3..5.2 - Action访问Servlet API
Struts2提供了ActionContext类,可通过该类访问Servlet API,获得request、session、application等对象
3.5.3 - Aciton直接访问Servlet API
除了通过ActionContext访问,Struts2还提供以下几个接口使直接访问Servlet API:
ServletContextAware 实现该接口的Action可直接访问ServletContext实例
ServletRequestAware 实现该接口的Action可直接访问HttpServletRequest实例
ServletResponseAware 实现该接口的Action可直接访问HttpServletResponse实例
3.5.4 - 使用ServletActionContext工具类访问Servlet API
3.5.2的ActionContext需要实例化对象,3.5.3需要实现接口,通过ServletActionContext工具类不须实例化,直接调用对应方法获取API对象,更加简单
3.6 - 配置Action
在struts.xml中配置Action,目的是完成用户请求和Action之间的对应关系,让Struts2知道哪个Action处理哪个请求
<package name="com" namespace="/lky" extends="struts-default">
<action name="login" class="com.LoginAction">
<result name="success">/welcome.jsp</result>
<result name="login">/login.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
3.6.1 - 包package 和 命名空间namespace
Action必须放在包<package.../>定义下,每个package元素配置一个包
通过为包指定namesapce属性为包下面的所有Action指定共同的命名空间,若没指定则处于默认包空间下
命名空间主要为解决同名Action发生冲突,不同命名空间内可以有同名Action
指定了命名空间后,Action处理的URL应变为 命名空间+Action名
extends 继承 struts2源码中的struts-default抽象包,该包下包含了大量结果类型定义、拦截器定义、拦截器引用定义等,是配置普通Action的基础,开发者定义的package通常应该继承struts-default包
3.6.2 - action的基本配置
name属性:指定Action的名字,也代表Action所处理的请求的URL
class属性:指定该Action的实现类,非必需,若不指定class则默认使用系统的ActionSupport类
method属性:指定Action类中处理请求的方法,若不指定则默认使用execute()方法
result元素:配置Action与视图资源(JSP)的关系,Action处理完请求后,将指定的视图资源呈现给用户,不同result对应不同视图,result中需指定name属性
3.6.3 - 使用action的动态方法调用DMI
作用:实现form表单提交到action的不同方法
例子:原本<form action="login" method="post" >是提交到名为login的Action的默认方法处理,
现在<form action="login!regist" method="post" >则可以提交到名为login的Action的regist()方法处理
设置DMI应在struts.xml中配置以下属性
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<global-allowed-methods>regist</global-allowed-methods>
3.6.4 - 指定method属性
对于一个Action需要处理多个控制逻辑,可将Action配置成多个逻辑Action
如下,第一个配置action默认使用execute()方法控制,第二个配置action使用regist()方法控制
<action name="login" class="com.LoginAction" >
<result name="success">/welcome.jsp</result>
<result name="login">/login.jsp</result>
<result name="error">/error.jsp</result>
</action>
<action name="login" class="com.LoginAction" method="regist">
<result name="success">/welcome.jsp</result>
<result name="login">/login.jsp</result>
<result name="error">/error.jsp</result>
</action>
使用通配符:
以下的配置很大部分相同,代码冗余,使用通配符简化如下
<action name="*Action" class="com.LoginAction" method="{1}">
<result name="success">/welcome.jsp</result>
<result name="login">/login.jsp</result>
<result name="error">/error.jsp</result>
</action>
*Action定义为:只要用户请求的URL时*Action的模式,都可以使用该Action来处理,method属性{1}表示该值为name属性值中第一个*的值
因此若用户请求form提交的url为loginAction,则调用Action类中的login()方法处理,若提交的action为registAction,则调用regist()方法处理
除此之外,class、<result.../>也可以使用{N}来代表前面第N个星号(*)所匹配的子串
3.6.5 - 配置默认Action
通过<default-action-ref.../>元素配置,当用户请求找不到对应的Action时,默认的Action会处理用户请求
3.6.6 - 配置默认Action的默认处理类
通过<default-class-ref.../>元素配置,当用户请求找不到对应的Action时,默认的Action会执行定义的默认处理类来处理用户请求
3.7.1 - 理解处理结果
Action处理完用户请求后,并未直接将请求转发到具体的物理视图资源,而是返回一个逻辑视图(即一个普通字符串),由Struts2框架通过这个字符串去把请求转发给对应的视图资源
3.7 2 - 配置结果
为了完成Action返回的普通字符串与物理视图资源的映射,需要在struts.xml的<action.../>中配置<result.../>元素
<result name="success" type="dispatcher">/welcome.jsp</result>
<result.../>元素下有两个属性:
-
name:指定所配置的逻辑视图名,与Action返回的字符串对应,省略则默认为success
-
type:指定结果类型,省略则默认为dispatcher
3.7.3 - struts2支持的结果类型(type)
chain:Action链式处理
dispatcher:-> 将请求forward到指定的视图资源,不会丢失请求参数
freemarker:用于指定使用FreeMarker模板作为视图
httpheader:用于控制特殊的HTTP行为
redirect:-> 将请求redirect到指定的视图资源,重定向会丢失所有的请求参数、属性和Action处理结果
redirectAction:-> 将请求redirect到指定的视图资源其他Action
stream:用于向浏览器返回一个InputStream(一般用于文件下载)
velocity:用于指定使用Velocity模板作为视图
xslt:用于与XML/XSLT整合
plainText:用于显示某个页面的原始代码(用得少)
3.7.7 - 动态结果
通过在<result.../>的name中使用表达式{N},可实现动态返回视图界面
3.7.8 - action属性值决定物理视图资源
3.7.9 - 全局结果
<global-result>
<result...>...</result>
</global-result>
全局结果对所有的Action对起作用
3.7.10 - 使用PreResultListener:
PreResultListener监听器可以在Action完成控制处理之后,系统转入实际的物理视图之前被回调
添加PreResultListener监听器的方法:
通过ActionIovocation(由ActionContext.getContext().getActionInvocation()方法获得)的addPreResultListener()方法完成
网友评论