w3cschool-Struts2 概述
Struts2 概述
Struts2 框架的优点
- POJO表单及POJO操作 - Struts2 去除掉了Struts框架中的Action Forms部分。在Struts2框架下,你可以用任何一POJO来接收表单输入,同样的,你可以把任一POJO视为一个Action类。
- 标签支持 - Struts2 改进了标签表单,而新的标签可让开发人员减少代码编写量。
- AJAX支持 - Struts2 被认可接收进Web 2.0技术,并创建了功能非常类似于标准的Struts2 标签的AJAX标签,把AJAX支持整合进其结果中。
- 易于整合 - Struts有多种整合方式可使用,现在与其他类型的框架,如Spring、Tiles、SiteMesh之类的,整合更为容易了。
- 模板支持 - 支持使用模板生成视图。
- 插件支持 - 有大量的插件可用于Struts2,而使用插件可以增强和扩大Struts2 核心行为。
- 性能分析 - Struts2 为调试和配置应用程序提供综合的性能分析,此外,Struts也以嵌入调试工具的形式提供集成调试。
- 易于修改标签 - 在Struts2 中,可使用Freemarker的模板对标签标记进行调整,而修改标签不需要JSP或是Java知识,基本的HTML、XML和CSS知识就足够了。
- 促进减少配置 - Struts2 使用各种设置的默认值促进减少配置,而你不需要再配置什么除非是偏离了Struts2 设定的默认设置。
- 视图技术 - Struts2 为多种视图选项(JSP、Freemarker、Velocity、XSLT等)提供支持。
Struts2 框架的缺点
需不断改进的缺点:
- 更大的学习曲线 - 使用Struts MVC,你必须要熟悉JSP、Servlet APIs标准以及一个大型、复杂的框架。
- 文档缺乏 - 相比于Servlet和JSP APIs标准,Struts的在线资源较少,许多初学者会发现Apache在线文档混乱并缺乏整理。
- 不够透明 - 相比于使用正常的基于Java的Web应用程序,使用Struts的应用程序有许多是进行在后台,这使得框架不易于理解。
Struts2 MVC架构
模型(Model)-视图(View)-控制器(Controller),通常简称MVC,是一种开发web应用程序的软件设计模式。该软件设计模式由以下三部分组成:
- 模型——属于软件设计模式的底层基础,主要负责数据维护。
- 视图——这部分是负责向用户呈现全部或部分数据。
- 控制器——通过软件代码控制模型和视图之间的交互。
![Struts的MVC Struts MVC](https://atts.w3cschool.cn/attachments/tuploads/struts_2/struts-mvc.jpg)
模型
视图
控制器
通过以下五个核心部分进行实现的:
- 操作(Actions)
- 拦截器(Interceptors)
- 值栈(Value Stack)/OGNL
- 结果(Result)/结果类型
- 视图技术
![Struts 2的架构](https://atts.w3cschool.cn/attachments/tuploads/struts_2/struts_2_architecture.gif)
请求生命周期
- 用户发送一个资源需求的请求到服务器(例如:页面)。
- 核心控制器查看请求后确定适当的动作。
- 使用验证、文件上传等配置拦截器功能。
- 执行选择的动作来完成请求的操作。
- 另外,如果需要的话,配置的拦截器可做任何后期处理。
- 最后,由视图显示结果并返回给用户。
Struts2 配置文件
配置文件中:web.xml、struts.xml、struts-config.xml以及struts.properties。
web.xml文件
WebContent/WEB-INF文件夹下创建
<filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
struts.xml文件
struts> <constant name="struts.devMode" value="true" /> <package name="helloworld" extends="struts-default"> <action name="hello" class="cn.w3cschool.struts2.HelloWorldAction" method="execute"> <result name="success">/HelloWorld.jsp</result> </action> <-- more actions can be listed here --> </package> <-- more packages can be listed here --> </struts>
<package>标签具有以下属性:
属性 | 描述 |
---|---|
name(必需) | 为package的唯一标识 |
extends | 指定package继承另一package的所有配置。通常情况下,我们使用struts-default作为package的基础。 |
abstract | 定义package为抽象的。如果标记为true,则package不能被最终用户使用。 |
namespace | Actions的唯一命名空间 |
<constant>标签以及name和value属性将用于覆盖default.properties中定义的任一属性,就像我们设置的struts.devMode属性一样。
<struts> <include file="my-struts1.xml"/> <include file="my-struts2.xml"/> </struts>
struts-config.xml文件
struts-config.xml配置文件是Web Client中View和Model组件之间的链接,但在你99.99%的项目里你不必使用这些设置。 struts-config.xml配置文件包含以下主要元素:
序号 | 拦截器和说明 |
---|---|
1 | struts-config
这是配置文件的根节点。 |
2 | form-beans
这是你将ActionForm子类映射到name的位置,你可以在struts-config.xml文件的其余部分,甚至在JSP页面上,将这个name用作ActionForm的别名。 |
3 | global forwards
此部分将你在webapp上的页面映射到name,你可以使用这个name来引用实际页面。这避免了对你网页上的URL进行硬编码。 |
4 | action-mappings
这是你声明表单处理程序的地方,也被称为操作映射(action mappings)。 |
5 | controller
这部分是配置Struts的内部,在实际情况中很少使用。 |
6 | plug-in 这部分告诉Struts在哪里找到属性文件,它包含提示和错误消息。 |
下面是struts-config.xml文件的示例:
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.0//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd"> <struts-config> <!-- ========== Form Bean Definitions ============ --> <form-beans> <form-bean name="login" type="test.struts.LoginForm" /> </form-beans> <!-- ========== Global Forward Definitions ========= --> <global-forwards> </global-forwards> <!-- ========== Action Mapping Definitions ======== --> <action-mappings> <action path="/login" type="test.struts.LoginAction" > <forward name="valid" path="/jsp/MainMenu.jsp" /> <forward name="invalid" path="/jsp/LoginView.jsp" /> </action> </action-mappings> <!-- ========== Controller Definitions ======== --> <controller contentType="text/html;charset=UTF-8" debug="3" maxFileSize="1.618M" locale="true" nocache="true"/> </struts-config>
有关struts-config.xml文件的更多详细内容,可查看Struts Documentation。
struts.properties文件
这个配置文件提供了一种机制来改变框架的默认行为。实际上,struts.properties配置文件中包含的所有属性也可以在web.xml中配置使用init-param,以及在struts.xml配置文件中使用constant标签。 但如果你想保持事件独立以及保留更多struts细节,那么你可以在WEB-INF/classes文件夹下创建这个文件。
struts.properties
文件中配置的值将覆盖
default.properties
中配置的默认值,这些值包含在struts2-core-x.y.z.jar分布中。有一些属性,你可以考虑改为使用
struts.properties
文件:
### When set to true, Struts will act much more friendly for developers struts.devMode = true ### Enables reloading of internationalization files struts.i18n.reload = true ### Enables reloading of XML configuration files struts.configuration.xml.reload = true ### Sets the port that the server is run on struts.url.http.port = 8080
Struts2 Actions动作
public class HelloWorldAction extends ActionSupport{
<struts> <constant name="struts.devMode" value="true" /> <package name="helloworld" extends="struts-default"> <action name="hello" class="cn.w3cschool.struts2.HelloWorldAction" method="execute"> <result name="success">/HelloWorld.jsp</result> <result name="error">/AccessDenied.jsp</result> </action> </package> </struts>
Struts2框架拦截器
Struts 2框架提供了一个良好的开箱即用的拦截器列表,这些拦截器预先配置好并可以使用。 下面列出了几个重要的拦截器:
序号 | 拦截器和说明 |
---|---|
1 | alias
允许参数在请求之间使用不同的别名。 |
2 | checkbox
通过为未检查的复选框添加参数值false,以辅助管理复选框。 |
3 | conversionError
将字符串转换为参数类型的错误信息放置到action的错误字段中。 |
4 | createSession
自动创建HTTP会话(如果尚不存在)。 |
5 | debugging
为开发人员提供一些不同的调试屏幕。 |
6 | execAndWait
当action在后台执行时,将用户发送到中间的等待页面。 |
7 | exception
映射从action到结果抛出的异常,允许通过重定向自动处理异常。 |
8 | fileUpload
便于文件上传。 |
9 |
i18n 在用户会话期间跟踪选定的区域。 |
10 | logger
通过输出正在执行的action的名称提供简单的日志记录。 |
11 | params
设置action上的请求参数。 |
12 | prepare
这通常用于执行预处理工作,例如设置数据库连接。 |
13 | profile
允许记录action的简单分析信息。 |
14 | scope
在会话或应用程序范围内存储和检索action的状态。 |
15 | ServletConfig
提供可访问各种基于servlet信息的action。 |
16 | timer
以action执行时间的形式提供简单的分析信息。 |
17 | token
检查action的有效性,以防止重复提交表单。 |
18 | validation
提供action的验证支持。 |
你可以阅读Struts 2文档,了解上述拦截器的完整信息。接下来我们会告诉你如何在Struts应用程序中使用拦截器。
<struts> <constant name="struts.devMode" value="true" /> <package name="helloworld" extends="struts-default"> <interceptors> <interceptor name="myinterceptor" class="cn.w3cschool.struts2.MyInterceptor" /> </interceptors> <action name="hello" class="cn.w3cschool.struts2.HelloWorldAction" method="execute"> <interceptor-ref name="params"/> <interceptor-ref name="myinterceptor" /> <result name="success">/HelloWorld.jsp</result> </action> </package> </struts>
Struts2 值栈/OGNL
值栈是一组对象,按照提供的顺序存储以下这些对象:
序号 | 对象和说明 |
---|---|
1 | Temporary对象
实际中存在各种在页面执行期间创建的temporary对象。例如,JSP标签循环集合的当前迭代值。 |
2 | Model对象
如果在struts应用程序中使用Model对象,则当前Model对象放在值堆栈上的action之前。 |
3 | Action对象
这是指正在执行的当前action对象。 |
4 | 命名对象
这些对象包括#application,#session,#request,#attr和#parameters以及所引用的相应的servlet作用域。 |
Struts2 文件上传
表单的enctype设置为multipart/form-data,
uploadFile.java是一个非常简单的类。要注意的重点是,FileUpload拦截器和Parameters拦截器为我们承担了所有的重工作量。默认情况下,FileUpload拦截器为你提供三个参数,它们分别按以下方式命名:
-
[文件名参数] - 这是用户已上传的实际文件。在这个例子中它将是“myFile”
-
[文件名参数]ContentType - 这是上传的文件的内容类型。在这个例子中,它将是“myFileContentType”
-
[文件名参数]FileName - 这是上传的文件的名称。在这个例子中,它将是“myFileFileName”
配置文件
以下是控制文件上传过程的Struts2 配置属性:
序号 | 属性和说明 |
---|---|
1 | struts.multipart.maxSize
可接受的上传文件的最大值(以字节为单位),默认值为250M。 |
2 | struts.multipart.parser
用于上传多部分表单的库,默认为jakarta。 |
3 | struts.multipart.saveDir
存储临时文件的位置,默认是javax.servlet.context.tempdir。 |
Struts2 数据库访问
String URL = "jdbc:mysql://localhost/struts_tutorial"; Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(URL, "root", "root123"); String sql = "SELECT name FROM login WHERE"; sql+=" user = ? AND password = ?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, user); ps.setString(2, password); ResultSet rs = ps.executeQuery();
Struts2 发送电子邮件
Session session = Session.getDefaultInstance(properties, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(from, password); }}); Message message = new MimeMessage(session); message.setFrom(new InternetAddress(from)); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); message.setSubject(subject); message.setText(body); Transport.send(message);
Struts2 验证框架
创建Action
那么,让我们定义一个小的action类:Employee,然后添加一个名为validate()的方法,如下Employee.java文件所示。确保action类扩展了ActionSupport类,否则将不会执行validate方法。
XML验证
第二种进行验证的方法是在action类旁边放置一个xml文件。Struts2 基于XML的验证提供了更多的验证方式,如email验证、integer range验证、form验证、expression验证、regex验证、required验证、requiredstring验证、stringlength验证等。
xml文件需要命名为'[action-class]'-validation.xml。因此,在我们的示例中,创建了一个名为Employee-validation.xml的文件,其含以下内容:
<validators>
<field name="name">
<field-validator type="required">
<message>
The name is required.
</message>
</field-validator>
</field>
</validators>
Struts2 本地化/国际化(i18n)
国际化(i18n)是规划和实施产品和服务以便更好地适应特定的当地语言和文化的过程,也就是本地化过程,而国际化过程有时也被称为翻译或本地化实现。国际化缩写为i18n,单词以i开头,以n结尾,是因为在第一个i和最后一个n之间有18个字符。
Struts2使用bundle资源束、拦截器和标签库提供本地化,即国际化(i18n)支持,主要用在以下几个地方:
-
UI标签
-
信息和错误。
-
Action类。
资源束
Struts2使用资源束为Web应用程序的用户提供多种语言和区域的设置选项。你不必担心需要用不同的语言编写页面,你需要做的只是为每种你想要的语言创建一个资源束。资源束将包含用户语言中的标题,消息和其他文本,是包含应用程序默认语言的一对key/value的文件。
资源文件最简单的命名格式是:
bundlename_language_country.properties
这里的bundlename可以是ActionClass,Interface,SuperClass,Model,Package,Global资源属性。下一部分language_country表示国家区域设置,例如西班牙语(西班牙)区域设置由es_ES表示,英语(美国)区域设置由en_US表示等。这里先跳过可选国家的部分。
当你通过key引用消息元素时,Struts框架按以下顺序搜索相应的信息束:
-
ActionClass.properties
-
Interface.properties
-
SuperClass.properties
-
model.properties
-
package.properties
-
struts.properties
-
global.properties
要以多种语言开发应用程序,你必须维护与这些语言/区域设置对应的多个属性文件,并根据每对key/value定义所有内容。例如,如果你要开发美国英语(默认),西班牙语和法语的应用程序,必须创建三个属性文件。这里我们将使用global.properties文件,你也可以使用不同的属性文件来分离不同类型的信息。
-
global.properties:默认情况下使用英语(美国)
-
global_fr.properties:这将用于法语环境。
-
global_es.properties:这将用于西班牙语环境。
Struts2 主题和模板
开始本章的内容学习之前,让我们看看http://struts.apache.org给出的几个定义:
术语 | 描述 |
---|---|
tag(标签) | 从JSP,FreeMarker或Velocity内部执行的一小段代码。 |
template(模板) | 一些代码,通常是写在FreeMarker上的,可以由某些标签(HTML标签)呈现。 |
theme(主题) | 封装在一起以提供公共功能的模板集合。 |
Struts2 异常处理
Struts2 注释
要在项目中开始使用注释,请确保WebContent/WEB-INF/lib文件夹中包含以下jar文件:
-
struts2-convention-plugin-x.y.z.jar
-
asm-x.y.jar
-
antlr-x.y.z.jar
-
commons-fileupload-x.y.z.jar
-
commons-io-x.y.z.jar
-
commons-lang-x.y.jar
-
commons-logging-x.y.z.jar
-
commons-logging-api-x.y.jar
-
freemarker-x.y.z.jar
-
javassist-.xy.z.GA
-
ognl-x.y.z.jar
-
struts2-core-x.y.z.jar
-
xwork-core.x.y.z.jar