文章目录
1 Struts 2.x简介
前提:Struts 1.x和Struts 2.x没有任何的关系,属于两个独立的版本。那么为什么会出现两个独立的版本呢?主要的原因还是在于Struts 1.x的设计结构上。在成名的MVC开发框架里面,Struts是最早出现的,但是由于最初的设计环境没有考虑到这么复杂,所以来讲到了今天与其它框架的整合会出现非常麻烦的问题,而且也存在有性能问题,同时自己本身的设计结构也出现了混乱,例如:如果要想使用验证框架(无用)那么必须使用第三方扩展包的形式,或者说如果要将对象与实例交由Spring管理,那么也需要以插件的形式出现。
这种种的一切几乎都在暗示着,Struts 1.x无法胜任于今天的开发,但是这个时候Apache也并没有开发Struts 2.x。任何事物的发展都是相生相克的。Struts 1.x发展带了框架的繁荣,那么繁荣之后,在某一个“角落”里面慢慢生长出一个新的框架——WebWork(ww),最早在整个Java行业里面有一个特别著名的开源项目——JIVE论坛,它融合了一个很有意思的特点——使用当前最新的开发技术,而WebWork就正好应用在此处,而后随着Struts 1.x的缺陷越来越明显,那么WebWork的优势越来越突出,长此以往下去,Struts 1.x已经丢失了大量的开发者,很多的开发者都转向了WebWork,它比Struts 1.x优秀在于以下几点:
(1)避免了Struts 1.x之中ActionForm类与Action类必须同时存在的窘境。
(2)在WebWork发展的时候考虑到了与第三方框架的整合,所以它可以轻松的实现与Spring的整合;
(3)WebWork的·配置更加的灵活;
(4)在验证框架部分要比Struts 1.x更加容易(这个也没什么用)。
在2005年的时候,Apache收购了WebWork项目,因为WebWork足够好用,但是没有Struts的名气大,而Struts 1.x本身问题很多,那么需要重新开发,所以Struts 1.x的名气+WebWork的实干=Struts 2.x,而在收购初期,Struts 2.x并没有对WebWork做更多的修改,但是千万要记住从2005年开始JDK 1.5出现了,而JDK 1.5出现所带来的行业内容的巨大的变革在于Annotation的技术应用,在Struts 2.x里面全面支持Annotation的配置以简化程序的编写。
Struts 2.x的基础是WebWork,但是请千万要记住一件事情,WebWork的起源也很早,只不过它凭借着自己超前的结构设计,才可以在今天继续发挥预热,但是Struts 1.x、Struts 2.x、JSF等等,现在随着时间的沉淀,会发现依然不如SpringMVC的设计更加优秀。
所有的框架设计思想只来源一点——反射机制,如果再有其它的核心技术也就是XML+DOM4J。
2 开发第一个Struts 2.x程序(搭建开发环境)
如果要想开发Struts 2.x的话最早的时候是没有开发工具的,从MyEclipse2012开始就支持了Struts 2.x开发,可以直接利用此工具自动进行Struts 2.x开发包的配置。
1、建立一个新的项目——MyStruts2Project
建立的时候一定要建立web.xml文件,因为几乎所有的MVC开发框架都必须有Servlet的支持或者是Filter支持,而Struts 1.x使用的是一个ActionServlet,在Struts 2.x里面使用的是一个Filter。所以考虑到配置问题必须生成web.xml。
2、框架的开发一定是一堆jar文件的配置过程
|——随后会询问你当前要使用的Struts 2.x版本。
|——Struts 1.x有一个特别著名的标志那么就是*.do
,所以当Apache将WebWork项目吸收进来之后,那么也提供了多种映射路径,当然,我们现在认为最合适的路径应该使用的是*.action
。
|——随后将进入到开发包的配置界面;
|——那么此时Struts 2.x的开发环境就搭建完成了。
3 开发第一个Struts 2.x程序(编写ECHO程序)
1、项目建立完成之后会自动在src目录之中建立一个struts.xml文件,这个文件就是struts 2.x的核心配置文件。同时也会在web.xml文件中增加如下配置:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
Struts 2.x的所有的处理操作都由过滤器完成的。
2、本次将完成一个ECHO程序,即:由用户在文本框中输入一段文字,而后在文字前增加“ECHO:”的信息返回到页面上进行显示。
范例:开发EchoAction
(1)所有的Struts 2.x应用程序都要求继承自ActionSupport父类。
package org.lks.action;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")
public class EchoAction extends ActionSupport {
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public String execute() throws Exception {
//执行操作
this.msg = "ECHO: " + this.msg;
return "echo.page"; //返回路径的映射的key
}
}
那么现在控制器就完成了。
3、所有的程序都一定要在struts.xml文件里面进行配置。
范例:修改struts.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<!-- 所有的Struts 2.x程序都要求设置命名空间 -->
<package name="root" namespace="/" extends="struts-default"></package>
</struts>
在此程序之中<package>
主要定义页面的可执行路径,如果设置为/
(namespace="/"),那么就表示映射到根路径下,但是在配置文件里面有一些是需要父配置文件给予的支持(例如:自动赋值、数据转换等),所以使用extends
继承一个父的配置文件(extends=“struts-default”)。每一个<package>
下具有多个<action>
的设置。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<!-- 所有的Struts 2.x程序都要求设置命名空间 -->
<package name="root" namespace="/" extends="struts-default">
<!-- 配置程序所需要的Action的名称以及对应的类型 -->
<action name="EchoAction" class="org.lks.action.EchoAction">
<!-- 定义跳转路径 -->
<result name="echo.page">echo.jsp</result>
</action>
</package>
</struts>
那么此时Struts 2.x的Action配置完成。
4、在根路径下开发echo.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>
<head>