Struts 是 Apache软件基金会(ASF)赞助的一个开源项目。它最初是 Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。它通过采用 Java Servlet/JSP 技术,实现了基于Java EE Web应用的MVC设计模式的应用框架,是MVC经典设计模式中的一个经典产品。
在 Struts 中,已经由一个名为 ActionServlet 的 Servlet 充当 控制器(Controller)的角色,根据描述模型、视图、控制器对应关系的 struts-config.xml 的配置文件,转发视图(View)的请求,组装响应数据模型(Model)。在 MVC 的 模型(Model)部分,经常划分为两个主要子系统(系统的内部数据状态与改变数据状态的逻辑动作),这两个概念子系统分别具体对应 Struts 里的 ActionForm 与 Action 两个需要继承实现超类。在这里,Struts 可以与各种标准的数据访问技术结合在一起,包括Enterprise Java Beans(EJB), JDBC 与 JNDI。在 Struts 的视图(View) 端,除了使用标准的JavaServer Pages(JSP)以外,还提供了大量的标签库使用,同时也可以与其他表现层组件技术(产品)进行整合,比如 Velocity Templates,XSLT 等。通过应用 Struts 的框架,最终用户可以把大部分的关注点放在自己的业务逻辑(Action)与 映射关系的配置文件(struts-config.xml)中。
在 Java EE 的Web应用发展的初期,除了使用 Servlet 技术以外,普遍是在 JavaServer Pages (JSP)的源代码中,采用 HTML 与 Java 代码混合的方式进行开发。因为这两种方式不可避免的要把表现与业务逻辑代码混合在一起,都给前期开发与后期维护带来巨大的复杂度。为了摆脱上述的约束与局限,把业务逻辑代码从表现层中清晰的分离出来,2000年,Craig McClanahan 采用了 MVC 的设计模式开发Struts。后来该框架产品一度被认为是最广泛、最流行 JAVA 的 WEB 应用框架。
2006年,WebWork 与 Struts 这两个优秀的Java EE Web框架(Web Framework〕的团体,决定合作共同开发一个新的,整合了 WebWork 与 Struts 优点,并且更加优雅、扩展性更强的框架,命名为 “Struts 2”,原Struts的1.x 版本产品称为“Struts 1”。
至此,Struts项目并行提供与维护两个主要版本的框架产品——Struts 1 与 Struts 2。
Struts1 JavaDoc:http://www.oschina.net/uploads/doc/struts-1.3.9/index.html
Struts2 JavaDoc:http://www.oschina.net/uploads/doc/struts-2.1.2/index.html
基础配置:
http://struts.apache.org/download.cgi#struts2312
在此下载Struts2的jar包,最好下载Full Distribution.
struts-2.3.1.2-all\struts-2.3.1.2\apps\struts2-blank.war
拖出war包中的jar包,web.xml,struts.xml
基本就搭成了一个Struts2的简易项目.
1.web.xml中的配置解释:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- 下面是Struts2的配置 --> <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>/*</url-pattern> </filter-mapping> <!-- Struts2配置完成 --> </web-app>
上面的过滤器中的2个都是定式,无需修改.
2.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.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="false" /> <package name="default" namespace="/" extends="struts-default"> <default-action-ref name="index" /> <global-results> <result name="error">/error.jsp</result> </global-results> <global-exception-mappings> <exception-mapping exception="java.lang.Exception" result="error"/> </global-exception-mappings> <action name="index"> <result type="redirectAction"> <param name="actionName">HelloWorld</param> <param name="namespace">/example</param> </result> </action> </package> <include file="example.xml"/> --> <!-- 下面是设定开发模式,设定为true,方便修改action name后的热部署 --> <constant name="struts.devMode" value="true" /> <!-- package区分包,namespace是访问路径,如 name是user,namespace就是/user,按模块划分 --> <!-- namespace不写,就等于namespace="",URL为任意项目名/xxx下的index --> <package name="default" namespace="/" extends="struts-default"> <!-- action name is Visit URL's path,you can write 'hello.jsp' or 'hello' or 'hello.action' --> <action name="hello"> <!-- result不写name,其实name就是 name="success" --> <result> /hello.jsp </result> </action> <!-- 如果不写class,默认执行的是Action所要继承的类:ActionSupport --> <action name="hello" class="org.credo.action.IndexAction"> <!-- result不写name,其实name就是 name="success" --> <result> /hello.jsp </result> </action> </package> <!-- Add packages here --> </struts>
这个xml里的很多东西,我都写了注释,具体的配置后面还是有的.
3.action类:
package org.credo.action; import com.opensymphony.xwork2.ActionSupport; public class IndexAction extends ActionSupport{ /** * 企业开发一般都必须使用继承ActionSupport接口来做. */ private static final long serialVersionUID = 1L; public String execute(){ return "success"; } }
默认执行的方法是execute.是在struts中,不指定method参数的情况下去执行这个方法.
一般都是继承actionSupport类.
下面的不推荐使用,忘记即可:
package org.credo.action; import com.opensymphony.xwork2.Action; public class IndexAction2 implements Action{ /** *这个方法一般不会使用.以及第三种方法:自己写execute,不去实现/继承action/actionSupport. */ @Override public String execute() throws Exception { // TODO Auto-generated method stub return "success"; } }
4.UI页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %>
主要是加入struts2的标签库.
至此,这个就是Struts2的趋形.
首先需要注意的是Struts2的struts.xml,必须要遵循一个规范,那就是 约定优于配置.
在Struts2中,为了减少配置量,而使用了通配符的配置.
<?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="actions" extends="struts-default" namespace="/actions"> <action name="Student*" class="org.credo.action.StudentAction" method="{1}"> <result>/Student{1}_success.jsp</result> </action> <action name="*_*" class="org.credo.action.{1}Action" method="{2}"> <result>/{1}_{2}_success.jsp</result> <!-- {0}_success.jsp --> </action> </package> </struts>
UI页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <% String context = request.getContextPath(); %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> 使用通配符,将配置量降到最低<br /> <a href="<%=context %>/actions/Studentadd">添加学生</a> <a href="<%=context %>/actions/Studentdelete">删除学生</a> <br /> 不过,一定要遵守"约定优于配置"的原则 <br /> <a href="<%=context %>/actions/Teacher_add">添加老师</a> <a href="<%=context %>/actions/Teacher_delete">删除老师</a> <a href="<%=context %>/actions/Course_add">添加课程</a> <a href="<%=context %>/actions/Course_delete">删除课程</a> </body> </html>
可以看到,第一个action配置,对应UI中的2个学生.
如果点击第一个"添加学生",那么 第一个action配置中的*就是 add.
那么配制中的method也就是 add方法体.进入方法体将会执行add方法. 删除学生就是执行delete方法.
这个是通配符的简易应用.
现在再看第二个配置.就是下面这些配置:
<action name="*_*" class="org.credo.action.{1}Action" method="{2}"> <result>/{1}_{2}_success.jsp</result> <!-- {0}_success.jsp --> </action>
如果成功了,那么就跳转到result=success中的页面 /{1}_{2}_success.jsp==>Teacher_add_success.jsp.
所以你可以发现,使用通配符后,你新建的action,UI页面,完全可以按照这个配置的规则.而不需要在struts.xml中写新的配置.
所以使用通配符,必须要在小组内约定好规则.写一份详细的文档,不费多少时间的,但能给整个项目的开发带来效率.文档宁可让人觉得罗嗦,别让人觉得搞不清楚细节.