Struts2--配置

(一)Struts2简介+基础的配置

简介:

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的通配符配置

首先需要注意的是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>

而在UI中,如果是 Teacher_add,那么class就是com.bjsxt.struts2.action.TeacherAction,method就是add.那么就会进入action-->TeacherAction,寻找并执行add方法.

如果成功了,那么就跳转到result=success中的页面 /{1}_{2}_success.jsp==>Teacher_add_success.jsp. 

所以你可以发现,使用通配符后,你新建的action,UI页面,完全可以按照这个配置的规则.而不需要在struts.xml中写新的配置.

所以使用通配符,必须要在小组内约定好规则.写一份详细的文档,不费多少时间的,但能给整个项目的开发带来效率.文档宁可让人觉得罗嗦,别让人觉得搞不清楚细节.

你可能感兴趣的:(Struts2--配置)