Stuts2是基于MVC设计模式成熟的Web应用框架。不仅仅是Struts1的下一个版本,是一个全新的Struts架构。由WebWork社区跟Strut社区联手打造的。(教程来自W3Cschool)
Struts2框架的特性
- POJO表单和POJO操作——Struts2去掉了Struts中的Action Forms部分。在Struts框架中,你可以用任意pojo来接收表单输入,同样的,你可以把任意pojo是为一个Action类。
- 标签支持——Struts2改进了标签表单,让开发人员写更少的代码。
- AJAX支持——Struts2被认可接受进Web2.0技术,并创建了功能类似标准Struts2标签的AJAX标签,把AJAX支持整合到其结果中。
- 易整合——可以与现在多种框架整合。
- 模板支持——支持使用模板生成视图。
- 插件支持——有大量的插件可用于Struts2.
- 性能分析——Struts2 为调试和配置应用程序提供综合的性能分析,此外,Struts也以嵌入调试工具的形式提供集成调试。
- 标签易修改——在Struts2 中,可使用Freemarker的模板对标签标记进行调整,而修改标签不需要JSP或是Java知识,基本的HTML、XML和CSS知识就足够了
- 促进减少配置——Struts2 使用各种设置的默认值促进减少配置,而你不需要再配置什么除非是偏离了Struts2 设定的默认设置
- 视图技术——Struts2为多种视图技术提供支持。
Struts2框架的缺点
- 更大的学习曲线——使用Struts MVC,你必须要熟悉JSP、Servlet APIs标准以及一个大型、复杂的框架。
- 文档缺乏——相比于Servlet和JSP APIs标准,Struts的在线资源较少,许多初学者会发现Apache在线文档混乱并缺乏整理。
- 不够透明——相比于使用正常的基于Java的Web应用程序,使用Struts的应用程序有许多是进行在后台,这使得框架不易于理解。
Struts2架构
MVC拉动的框架,通过以下五个部分实现的。
- 操作(Actions)
- 拦截器(Interceptors)
- 值栈(Value Stack)/OGNL
- 结果(Resut)/结果类型
- 视图技术
上图描述了Struts2 高级系统架构下的模型、视图及控制器。控制器是通过Struts2 分派servlet过滤器以及拦截器进行实现,模型是通过Actions进行实现,而视图则是结果类型和结果的结合。值栈和OGNL提供共同的路线、链接以及与其他组件之间的集成。
请求的生命周期
- 用户发送一个资源需求的请求到服务器。
- 核心控制器查看请求后确定适当的动作。
- 使用验证、文件上传等配置拦截器功能。
- 执行选择的动作来完成请求的操作。
- 如果有需求,配置的拦截器可做任何后期处理。
- 视图显示结果并返回给用户。
Hello World
示例查看 https://www.w3cschool.cn/struts_2/struts_examples.html
注意:W3Cschool中示例用的struts-2.2.3,在我使用struts-2.50版本的时候出异常:Class not found:FilterDisparcture
自2.1.3版本开始,ActionContextCleanUp和FilterDispatcher都由StrutsPrepareAndExecuteFilter代替。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>Struts</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<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>
</web-app>
struts2配置文件
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>Struts</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<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>
</web-app>
struts.xml
<?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>
<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>标签声明不同的包,这里的<package>标签允许配置的分离和模块化。这在你进行一个大的项目并且项目分为多个不同的模块时,是非常有用的
<package>标签具有以下属性:
属性 | 描述 |
---|---|
names(必许) | 为package的唯一标识 |
extends | 指定package指定另一package的所有配置。通常情况下使用struts-default作为package的基础 |
abstract | 定义package是抽象的,如果定义为true,则package不能被最终用户使用。 |
namespace | Actions的唯一命名空间 |
<constant>标签以及name和value属性将用于覆盖default.properties中定义的任意属性,就像我们设置的struts.devMode属性一样。设置struts.devMode属性允许我们在日志文件中查看更多的调试消息。
我们定义<action>标签对应我们每一个想要访问的url,并且使用excute()方法定义一个访问相应的URL时将要访问的类。
<reuslt>(结果)确定到执行操作后返回到浏览器的内容,而从操作返回的字符串应该是结果的名称。<result>按照上述操作或作为“全局”配置结果,可用于包中的每个操作。<result>有name和type属性可选,默认的name值是“success”
struts.xml文件可以随着时间的推移而增长,因此通过包打破它是使它模块化的一种方式,但struts提供了另外一种模块化struts.xml的方法,可以将文件拆分成多个xml文件,并用以下方式导入他们:
<?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>
<include file="my-struts1.xml"/>
<include file="my-struts2.xml"/>
</struts>
struts-default.xml文件包含struts的标准配置设置,所以不必在很多项目中重复这些配置。
struts-config.xml
struts-config.xml文件是Web Client中View和Model组件之间的链接。一般不会使用这些设置。主要包含元素:
序号 | 拦截器和说明 |
---|---|
1 | struts-config 这是配置文件的根节点 |
2 | form-beans 这是你将ActionForm映射到name的位置,你可以在struts-config.xml文件的其余部分,甚至在JSP页面上,将这个name用作ActionForm的别名 |
3 | global fowards 此部分将你web-app上的页面映射到name,你可以使用这个name来引用实际页面。这避免了你对网页上的url进行硬解码。 |
4 | action-mappings 这是你声明表单处理程序的地方,也被称为操作映射(action mappings)。 |
5 | controller 这部分是配置struts内部,在实际情况中很少使用。 |
6 | plug-in 这部分是告诉struts在哪里找到属性文件,它包含提示和错误消息 |
示例:
<?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.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
Action动作
Action是struts2的核心,因为它们使用与所有的MVC框架。每个URL映射到特定的action,其提供处理用户请求所需的处理逻辑。
action的两个重要功能:
- action在将数据从请求到视图(无论是JSP还是其他类型的结果)方面起着重要的作用。
- action必须协助框架确定那个结果应该响应在请求的视图中。
创建Action
必须有一个无参方法返回String或者Result对象,必须是POJO。
没有指定无参方法时默认使用excute()方法。
可以扩展ActionSupport类,该类实现六个接口,包括Action接口:
public interface Action(){
public static final String SUCCESS = "success";
public static final String NONE = "none";
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final Stirng LOGIN = "login";
public String execute() throws Exception;
}
可以扩展上例中的HelloWorldAction方法:
packge com.kfw5264.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport{
private String name;
public String excute() throws Exception{
if("SECRET".equals(name)){
return SUCCESS;
}else{
return ERROR;
}
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
由于继承了ActionSupport类,所以我们可以使用String常量。此时,可以将struts.xml修改为:
<?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>
<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>
创建多个Actions
- 定义不同类
package com.kfw5264.struts2;
import com.opensymphony.xwork2.ActionSupport;
class MyAction extends ActionSupport{
public static String GOOD = SUCCESS;
public static String BAD = ERROR;
}
public class HelloWorld extends ActionSupport{
...
public String execute()
{
if ("SECRET".equals(name)) return MyAction.GOOD;
return MyAction.BAD;
}
...
}
public class SomeOtherClass extends ActionSupport{
...
public String execute()
{
return MyAction.GOOD;
}
...
}
- xml配置action
<?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>
<constant name="struts.devMode" value="true" />
<package name="helloworld" extends="struts-default">
<action name="hello"
class="cn.w3cschool.struts2.HelloWorld"
method="execute">
<result name="success">/HelloWorld.jsp</result>
<result name="error">/AccessDenied.jsp</result>
</action>
<action name="something"
class="cn.w3cschool.struts2.SomeOtherClass"
method="execute">
<result name="success">/Something.jsp</result>
<result name="error">/AccessDenied.jsp</result>
</action>
</package>
</struts>
网友评论