1. Struts2是基于请求响应模式的应用framework,由如下几个逻辑结构组成:
a) 控制器(Controller):控制整个framework组件协调工作。
b) 业务逻辑层(Business Logic):概念性组件,与具体的业务有关。
c) 数据逻辑层(Data Logic):主要提供数据访问的接口。
2. Java Web 应用结构的发展:
a) JSP独立、自主完成所有任务
b) JSP Model1:引入JavaBean
c) JSP Model2:采用MVC模式。JSP负责生成动态网页,Servlet负责流程控制,JavaBean负责业务逻辑。
3. 手工配置Struts2
a) 新建Web Project
b) 加入最小使用的jar(针对Struts2.2.0):
Commons-fileupload.jar/commons-io.jar/commons-logging.jar/ognl.jar/struts2-core.jar/xwork-core.jar/freemarker.jar/javaassist共8个。
c) 在web.xml中配置Struts2。使用一个过滤器进行处理。代码如下:
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts.dispatcher.ng.filter.strutsPrepareAndExecuteFilter
</filter-class>
<filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
d) 在src目录下新建struts.xml配置文件。实际上是在WEB-INF中的class文件夹中创建struts.xml,但是myeclipse不支持显示WEB-INF下的class文件夹,因此在src中创建。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="struts2" extends="struts-default">
<action name="login" class="com.shengsiyuan.struts2.LoginAction" method="myExecute">
<result name="success">/result.jsp</result>
</action>
</package>
</struts>
e) 新建LoginAction,处理逻辑。Getter和setter方法默认调用(不要求该Action中的属性跟JSP中的名字相同,只需是setXXX和getXXX中的XXX与JSP相同就行),execute方法返回suess,用于定向页面。
f) 在JSP页面中,使用action=”login[.action]”调用。
4. Struts2内置类型转换功能。Struts2的类型转换,对于8个原生数据类型以及Date,String等常见类型,Struts2 可以使用内建的类型转换器实现自动的转换;但对于自定义的对象类型来说,就需要我们自己指定类型转换的方式了。对于自定义的类型转换器来说需要提供3个信息:Action的名字、Action 中待转换的属性名(Action包下创建properities文件,名字为action名字-conversion.properities)以及该属性对应的类型转换器(继承defaultTypeConverter,ognl包中,重写convertValue方法)。其中Action的名字是通过属性文件名来获得的、Action中待转换的属性名是通过属性文件中的key来获得的,该属性对应的类型转换器是通过该key所对应的value来获得的。
可以使用Struts2框架自带的类型转换器StrutsTypeConverter简化类 型 转换 代 码 的 编 写 ,StrutsTypeConverter 继 承 于DefaultTypeConverter 父类,并且提供了两个抽象方法:convertFromString与convertToString,分别表示从页面的字符串转换为后台对象以及从后台对象转换为页面的字符串,我们只需实现这两个抽象方法即可实现类型转换。
全局类型转换。在src目录下新建xwork-conversion.properties,该文件的内容是待转换的类=转换器的名字,即com.shengsiyuan.bean.User=com.shengsiyuan.converter.UserConverter2
5. 编写的Action继承自ActionSupport,然后重写validate方法进行数据校验。使用this.addActionError(“valid”);报告错误。在JSP中通过<s:actionerror/>显示错误提示信息。
具体执行过程:
a) 首先进行类型转换
b) 进行输入校验,执行validate方法
c) 如果出现错误,不执行execute,转向struts.xml中该action的名为input的result所对应的页面。如果没有出现错误,指向该action中名为success的result的页面。
使用addFieldError添加FieldError,在jsp中通过<s:fielderror/>显示该error。
错误与信息分为action级别和field级别。
6. Struts2可以调用自定义方法。在Struts.xml中该action中通过method指明调用的方法,这样默认的execute将不调用。此时,执行顺序仍为:validate->自定义方法。此外,可以自己编写校验方法,名字为validate+自定义方法名。此时的执行顺序为:自定义validate->validate->自定义方法。优先调用自定义validate方法。
7. Struts2校验分为两种:字段优先校验器(validate方法)和校验器优先校验器(有效的xml文件,放在待校验action包名下,名字为:action名字-validation.xml)。示例如下:
<validators>
<field name=”username”>
<field-validator type=”requiredstring”>
<message>username can’t be blank!</message>
</field-validator>
<field>
</validators>
Struts2框架校验执行的先后顺序:
1. 首先执行框架校验(xml文件)
2. 执行自定义的校验方法
3. 执行validate校验方法
Struts.xml中的配置,局部优先于全局。
8. Struts2定义五个常量:
a) SUCCESS
b) FAILED
c) INPUT
d) ERROR
e) EXCEPTION
9. Struts2的分层体系架构:Action<-Service<-DAO。每一层向上层提供服务。
10. Struts2分为模型驱动(将页面中属性定义成对象)和属性驱动。
a) 属性驱动灵活,准确;模型驱动不灵活;
b) 模型驱动更加符合面向对象的变成风格,使得我们获得的是对象而不是一个个离散的值。
c) 推荐使用属性驱动。
模型驱动需要在struts中调用servlet的api,例如使用ServletActionContext.getRequest获取请求对象等。
11. 采用请求转发的方式完成表单内容的添加会造成内容的重复插入(显示结果时进行刷新操作)。采用重定向的方式实现数据的添加不会导致数据的重复插入。
12. 拦截器(Intereptor):拦截器是struts2的核心,实现类似于Filter。用于在action执行前和执行后执行,也可以取消某个action的执行。自定义需要实现Interceptor接口。三种方法:init、intercept、destroy。在xml中配置如下:
//拦截器定义
<interceptors>
<interceptor name=”” class=””/>
</interceptor>
</interceptors>
//在action中调用
<interceptor-ref name=””/>
拦截器的配置步骤:
1. 编写实现Interceptor接口的类
2. 在struts.xml中定义拦截器
3. 在action中使用拦截器
定义了自己的拦截器,将其配置到action后,我们需要在action的最后加上默认的拦截器栈:defaultStack。定义拦截器时可以直接继承AbstractInterceptor抽象类,然后实现其intercept方法即可。