第一个Struts2入门案例
Struts2的下载与安装
源码下载地址:http://struts.apache.org/download.cgi
源码目录结构说明:
- apps:框架本身提供一些案例(学习);
- docs:框架本身提供的文档(指南和API)。不保证100%正确;
- lib:Struts2框架需要的jar包及第三方的jar包;
- src:Struts2框架源码。
Struts2入门理论
开发步骤
1. 创建WEB 工程;
2. 导入必要jar包;
3. 编写JSP 页面;
4. 编写Action 服务器端处理逻辑;
5. 进行框架配置web.xml、struts.xml;
6. 运行测试。
导入必要jar包
Struts运行必要jar包说明:
- struts2-core-2.3.1.1.jar:Struts 2框架的核心类库;
- xwork-core-2.3.1.1.jar:Command模式框架,WebWork和Struts2都基于xwork;
- ognl-3.0.3.jar:对象图导航语言(Object Graph Navigation Language), struts2框架通过其读写对象的属性;
- freemarker-2.3.18.jar:Struts 2的UI标签的模板使用FreeMarker编写;
- commons-logging-1.1.x.jar:ASF出品的日志包,Struts 2框架使用这个日志,包来支持Log4J和JDK 1.4+的日志记录;
- commons-fileupload-1.2.2.jar: 文件上传组件,2.1.6版本后需要加入此文件;
- commons-io-2.0.1.jar:传文件依赖的jar包;
- commons-lang-2.5.jar:对java.lang包的增强。
备注:开发中为了方便导入,可以使用app/struts2-blank.war 携带jar包。
编写JSP 页面
helloword.jsp (发起请求页面)
<body>
<!-- 添加对Struts2框架的访问链接,Struts2框架默认处理的URL扩展名
1、不加后缀的;
2、以.action后缀结尾的;
3、不符合以上后缀形式的URL,不会进入到Struts2框架内部进行处理,过滤器
StrutsPrepareAndExecuteFilter检查不符合规则时,直接将其返回给浏览器。
-->
<a href="${pageContext.request.contextPath}/struts2/hello.action">HelloWorld</a>
</body>
success.jsp (结果页面)
<body>
你好,Struts2!!!
</body>
编写Action 服务器端处理逻辑
package com.study.java.struts2;
package com.study.java.struts2;
/**
* @Name: HelloAction
* @Description: Struts2动作类:是一个普通的JavaBean(POJO对象)
* @Author: XXX
* @CreateDate: XXX
* @Version: V1.0
*/
public class HelloAction {
/**
* @Name: execute
* @Description: Struts2动作方法
* @Author: XXX
* @Version: V1.0
* @CreateDate: XXX
* @Return: String 返回处理结果逻辑视图
*/
public String execute() {
System.out.println("hello world !!!");
return "success" ;
}
}
说明:struts2 的Action类似Servlet程序,可以处理用户提交请求,但是Struts2的Action可以POJO对象。
进行框架配置web.xml、struts.xml
配置Struts2核心控制器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>struts2-hello</display-name>
<!-- 配置Struts2核心过滤器 -->
<filter>
<filter-name>Struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<!-- 修改struts2框架的动作访问后缀 -->
<!--
<init-param>
<param-name>struts.action.extension</param-name>
<param-value>action,do</param-value>
</init-param>
-->
</filter>
<!-- 过滤器配置/* , 但是struts2默认处理.action结尾请求,分发到相应Action类 -->
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
配置struts.xml
- 在src目录下建立struts.xml;
- 参加doc下 hello-world-using-struts-2.html.
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 指定Struts2配置文件的DTD约束 -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<!-- 根元素 -->
<struts>
<!-- struts2框架常量配置,详情参考后边章节 -->
<constant name="struts.devMode" value="true"></constant>
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<constant name="struts.serve.static.browserCache" value="true"></constant>
<!--
package标签:定义包
作用:对应用中的动作进行模块化管理,如同把类放在不同的包中进行管理一样。
属性:
name:包名,整个struts配置范围内唯一。
extends:继承包名,Struts2中的包是可以继承的,开发环境,自己的包一般都要继承“struts-default”
abstract:抽象包,没有任何action资源的包可以定义为抽象包。
namespace:名称空间,默认为""。
动作访问路径——http://域名/应用名称/namespace/动作名称.action
-->
<package name="p1" extends="struts-default" namespace="/struts2">
<!--
action标签:定义动作
属性:
name:动作的名称,包范围内唯一
class:动作类的全名,可选,默认为com.opensymphony.xwork2.ActionSupport类:
位于xwork-core-2.3.15.3.jar核心包中,该类在struts-default.xml中指定。
method:动作类中的动作方法,可选,默认为ActionSupport类中的execute()方法
<action name="index">
<result>/index.jsp</result>
</action>
result标签:定义动作方法执行完成后转向的结果视图。
属性:
name:字符串,对应于动作方法的返回值
type:转向的类型,默认为转发——dispatcher类型
value:返回的结果视图。
-->
<action name="index">
<result>/index.jsp</result>
</action>
<action name="hello" class="com.study.java.struts2.HelloAction" method="execute">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
</package>
</struts>
运行测试
访问index.jsp,点击HelloWorld链接,结果页面显示,struts2框架访问成功。
Struts2处理流程
体系架构
处理流程
客户端初始化一个指向Servlet容器(例如Tomcat)的请求 (客户端提交一个HttpServletRequest请求。);
请求被提交到一系列的过滤器(Filter):如(ActionContextCleanUp、其他过滤器(SiteMesh等)、 FilterDispatcher。注意:这里是有顺序的,先ActionContext CleanUp,再其他过滤器(Othter Filters、SiteMesh等),最后到FilterDispatcher。FilterDispatcher是控制器的核心,就是MVC的Struts 2实现中控制层(Controller)的核心;
FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个(HttpServlet Request)请求,如果ActionMapper决定需要调用某个Action,FilterDispatcher则把请求的处理交给ActionProxy;
ActionProxy通过Configuration Manager(struts.xml)询问框架的配置文件,找到需要调用的Action类;
ActionProxy创建一个ActionInvocation实例,同时ActionInvocation通过代理模式调用Action。但在调用之前,ActionInvocation会根据配置加载Action相关的所有Interceptor(拦截器);
Action执行完毕后,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果result。
拦截器与过滤器
1、拦截器是基于java反射机制的,而过滤器是基于函数回调的。
2、过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
3、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
4、拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
5、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。
在上述过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。
Struts2的目标很简单–使Web开发变得更加容易。为了达成这一目标,Struts2中提供了很多新特性,比如智能的默认设置、annotation的使用以及”惯例重于配置”原则的应用,而这一切都大大减少了XML配置。Struts2中的Action都是POJO,这一方面增强了Action本身的可测试性,另一方面也减小了框架内部的耦合度,而HTML表单中的输入项都被转换成了恰当的类型以供action使用。开发人员还可以通过拦截器(可以自定义拦截器或者使用Struts2提供的拦截器)来对请求进行预处理和后处理,这样一来,处理请求就变得更加模块化,从而进一步减小耦合度。模块化是一个通用的主题–可以通过插件机制来对框架进行扩展;开发人员可以使用自定义的实现来替换掉框架的关键类,从而获得框架本身所不具备的功能;可以用标签来渲染多种主题(包括自定义的主题);Action执行完毕以后,可以有多种结果类型–包括渲染JSP页面,Velocity和Freemarker模板,但并不仅限于这些。