【SSH2(理论篇)】--Struts2配置详解

上篇博客讨论了SSH2框架模型,在开发过程中发现SSH2的开发模型其实类似于经典的三层模式,在每一层中分别添加了不同的框架,显示层使用的是Struts2进行配置的,业务逻辑层使用的是Spring配置,数据持久层则采用的是Hibernate,开发模式简单易懂,接下来将会分别从三层着手讨论每一层的运行内容。

一、Struts体系简介

struts,是Apache软件基金会(ASF)赞助的一个开源项目,它通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-Controller〔MVC〕设计模式的应用框架〔WebFramework〕,是MVC经典设计模式中的一个经典产品。

1、Struts1

Struts1是Struts最早的版本,该框架以ActionServlet作为系统的核心控制器,整个应用由客户端请求驱动。对于整个Struts1而言,控制器是它的核心,Struts1的控制器由两部分组成:核心控制器和业务逻辑控制器。其中的业务逻辑控制器就是用户自定义的Action,它是由开发者提供的。

图1 Struts1程序运行流程图       

当用户发送一个HTTP请求时,该请求会被ActionServlet拦截到,ActionServlet对请求进行解析,解析完成后会ActionServlet会有两种不同的回应方式,如果用户请求的只是URL,则ActionServlet将会直接将请求转发给用户,否则的话将该请求转发给对应的业务逻辑控制器,业务逻辑控制器调用相应的模型处理用户请求。

2、Struts2

Struts1虽然功能强大,但是遗留下了很多问题,其中最主要的是Struts1和JSP/Servlet的耦合性过高,在它的处理流程中都是直接在JSP/Servlet之间转发、处理请求,这就限制了Struts1的发展。因为Struts1的显示层使用的是JSP,如果遇到了其它的处理页面,Struts1就显得无能为力,另外一方面Struts1同样受制于Servlet API,严重依赖于Web服务器,一旦脱离了Web服务器,测试就会很困难。由于Struts1的设计缺陷及使用年代的久远,所以产生了Struts2。

Struts2相对于Struts1发生了巨大的改变,这种改变主要表现在处理核心上,Struts2是以WebWork为核心(xwork-core-2.2.3.jar),采用拦截器的机制来处理用户请求。它整合了Struts1和WebWork,将两者合二为一,不仅拥有Struts1丰富的页面标签,而且还拥有WebWork的处理核心。从它的改变上也可以Struts2是WebWork的更新产品。

图2 WebWork/Struts2的处理核心

从图可以看出,一个请求在 Struts2 框架中的处理大概分为以下几个步骤:

(1) 客户端初始化一个指向 Servlet 容器(例如 Tomcat)的请求;

(2) 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做 ActionContextCleanUp 的可选过滤器,这个过滤器对于 Struts2 和其他框架的集成很有帮助,例如:SiteMesh Plugin);

(3) 接着 FilterDispatcher 被调用,FilterDispatcher 询问 ActionMapper 来决定这个请求是否需要调用某个 Action;

(4) 如果 ActionMapper 决定需要调用某个 Action ,FilterDispatcher 把请求的处理交给ActionProxy;

(5) ActionProxy 通过 Configuration Manager 询问框架的配置文件,找到需要调用的 Action 类;

(6) ActionProxy 创建一个 ActionInvocation 的实例。

(7) ActionInvocation 实例使用命名模式来调用,在调用 Action 的过程前后,涉及到相关拦截(Intercepter)的调用。

(8) 一旦 Action 执行完毕,ActionInvocation 负责根据 struts.xml 中的配置找到对应的返回结果。

返回结果通常是(但不总是,也可能是另外的一个 Action 链)一个需要被表示的 JSP 或者 FreeMarker的模版。在表示的过程中可以使用 Struts2 框架中继承的标签。在这个过程中需要涉及到 ActionMapper。

学过设计模式的程序员能够看出,在这个处理核心中使用了设计模式,在请求访问Action的过程中使用了代理模式和工厂模式,FilterDispatcher没有直接来调用相应的Action而是通过代理,另外在ActionProxy工厂中创建ActionInvocation实例来调用相应的Action,设计的很巧妙。

二、Struts2的配置文件

Struts2 相关的配置文件有 web.xml,struts.xml,struts.properties,struts-default.xml,velocity.properties,struts-default.vm。其中 web.xml,struts.xml 是必须的,其它的配置文件可选择。它们在 web 应用中的功能如下:

web.xml:包含所有必须的框架组件的 web 部署描述符。

Struts.xml:配置包含 result/view 类型、action 映射、拦截器等的 Struts2 的主要配置文件。

Struts.properties:配置 struts2 的框架属性。

Struts-default.xml:在文件在 struts-action-x.x.jar 中,该文件是应该被包含在 struts.xml中的缺省配置。

Welocity.properties:重写了 velocity 的配置文件。

Struts-default.vm:相对于 velocity 的缺省配置。

<struts>
	<!-- Struts 2的全局变量,该属性设置了去除请求过程中的"名称.action"后缀".action"-->
	<constant name="struts.action.extension" value=","></constant>

	<!-- Struts 2的Action必须放在Package包中-->
	<package name="default" extends="struts-default">
		<!-- 定义一个login的Action,实现类为LoginAction -->
		 <action name="login" class="com.action.LoginAction">
			<!-- 配置Action返回成功时,转入Success.jsp页面-->
			 <result name="success">success.jsp</result>
			  <!-- 配置Action返回cancel时重定向到Welcome的Action-->
			 <result name="cancel" type="redirectAction">Welcome</result>
			 <!-- 配置Action返回expired时重定向到ChangePassword的Action链 -->
			 <result name="expired" type="chain">ChangePassword</result>
		</action> 

		<action name="Welcome" class="com.action.welcome">
    		<result name="cancel">Welcome.jsp</result>
    	       </action>

	</package>
</struts>

在上面的Struts2.xml文件中,定义了两个action,并使用constant设置了全局变量,其中struts.action.extension属性设置文件的action显示与否,值“,”表示所有action的名称后面可以不加action作为后缀。

标签中的type能够指定转向的资源类型,转向的资源多样既可以是JSP,也可以是其它类型的文件。另外在package标签中可以添加属性namespace,学习过xml的应该知道它指的是命名空间,它的作用是将标签进行分类,放到不同的空间内。

三、Struts2的标签库

Struts2的标签库也是Struts的重要组成部分,这些标签内容是在Struts1开始就有的,标签库提供了丰富的功能,基本上可以替代HTML标签。Struts2的标签使用方法类似于HTML及JSP标签,不同的是头文件的注册方法,而且Struts2的标签页面代码相较于JSP及HTML页面更简洁,如下面的示例。

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<s:form method="post" action="loginaction">
		<s:textfield label="名字" name="name"/>
		<s:textfield label="年纪" name="age"/>
		<s:textfield label="喜欢的颜色" name="answer"/>
		<s:submit/>
	</s:form>
</body>
</html>

四、Struts2配置

在开发的web项目中想要使用Struts2就必须要事先配置好相应的Struts环境,需要去官方网站下载相应的Struts2压缩包,然后把相应的jar包引入WebContent/WEB-INF/lib文件夹内,接下来还要在目录WebContent/WEB-INF下的web.xml文件中添加Struts2的FilterDispatcher,最后在项目的src文件夹内添加相应的struts.xml将action等内容写入该配置文件内。

Struts2官方下载地址:http://struts.apache.org/downloads.html

lib库中引入的jar包需要根据项目需求确定,不同的功能引入的jar也不相同,如果基本的应用的话只需要引入下面的四个jar包:

common-logging-版本号.jar:Jakarta的通用日志记录包,用于通用日志处理。log4j是最好用的;

freemarker-版本号.jar

ognl-版本号.jar:OGNL表达式语言,struts2支持该EL;

struts2-core-版本号.jar:struts2的核心库;

xwork-core-版本号.jar:webwork的核心库,由于Struts2是由xwork的延伸,有些类依然关联着xwork的类

引入jar包后还需要在web.xml中添加struts的FilterDispatcher,具体配置如下代码:

<?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" id="WebApp_ID" version="2.5">
  <display-name>Web</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>

  <!-- Struts的FilterDispatchor -->
  <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>
</web-app>

filter元素用于指定Web容器中的过滤器。在请求和响应对象被servlet处理之前或之后,可以使用过滤器对这两个对象进行操作。

filter-mapping元素用来声明Web应用中的过滤器映射。过滤器可被映射到一个servlet或一个URL模式。将过滤器映射到一个servlet中会造成过滤器作用于servlet上。将过滤器映射到一个URL模式中则可以将过滤器应用于任何资源,只要该资源的URL与URL模式匹配。过滤是按照部署描述符的filter-mapping元素出现的顺序执行的。

最后在项目的src文件夹内添加相应的struts.xml

<!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.action.extension" value=","></constant>
    <package name="login" extends="struts-default">
    	<action name="loginaction" class="com.action.loginAction">
    		<result name="success">success.jsp</result>
    		<result name="error">error.jsp</result>
    		<result name="cancel" type="redirectAction">Welcome</result>
    	</action>

    	<action name="Welcome" class="com.action.welcome">
    		<result name="cancel">Welcome.jsp</result>
    	</action>
    </package>

</struts>

Struts的配置比较简单,经过上面的配置后可以实现基本的页面跳转的功能,其中的web.xml文件中的过滤器不仅可以struts同样可以配置其它的框架在使用的时候多多积累吧,另外struts.xml也是必不可少的,页面的action、interceptor等,使用方法将会在下篇文章中讨论。

结语

文章讨论了struts的基本结构,从struts的发展历程了解了struts的内部运行机制,从运行机制看出struts2其实是webwork增强版,它集成了webwork作为处理的核心,所以它属于重量级框架。想要使用struts必须经过配置,并通过使用映射来实现动态的功能。

【SSH2(理论篇)】--Struts2配置详解,布布扣,bubuko.com

时间: 2024-08-02 02:42:44

【SSH2(理论篇)】--Struts2配置详解的相关文章

Struts2配置详解_配置Action

Struts2的核心功能是action,对于开发人员来说,使用Struts2主要就是编写action,action类通常都要实现com.opensymphony.xwork2.Action接口,并实现该接口中的execute()方法. public String execute() throws Exception Struts2并不是要求所有编写的action类都要实现Action接口,也可以直接编写一个普通的Java类作为action,只要实现一个返回类型为String的无参的public方

Struts2配置详解

1.Namespace 1)namespace决定action的访问路径,默认为“”,可以接受所有路径的Action:       2)namespace可以写为/,或者/xxx,或者/xxx/yyy,对应action访问路径为/index.action,/xxx/index.action或者/xxx/yyy/index.action       3)namespace最好也用模块来进行命名 当url中输入不存在的Action的时候,定向到默认的Action 1.1 struts2配置详解 1.

第三章 Struts2配置详解

3.1 Struts2执行过程    1.获取Struts2资源    2.在应用程序中导入Struts2的类库    3.在web.xml中配置StrutsPrepareAndExecuteFilter    4.编写Action类进行配置    5.配置返回结果与物理视图资源的关系    6.编写结果视图            web.xml <filter> <filter-name>struts2</filter-name> <filter-class&g

Struts2 配置详解

1. web.xml 此文件的配置可以参看struts2的示例文档 <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filte

Struts2学习笔记二 配置详解

Struts2执行流程 1.简单执行流程,如下所示: 在浏览器输入请求地址,首先会被过滤器处理,然后查找主配置文件,然后根据地址栏中输入的/hello去每个package中查找为/hello的namespace,然后在包下寻找名为HelloAction的action,反射创建控制器HelloAction对象,调用method指定的方法hello,拿到返回值“success”,去result的配置节找success对应的页面(hello.js),呈现给用户. 2.Struts的架构,具体参考这里

struts2基本配置详解2

接上篇struts2基本配置详解,还有一些配置没有讲到,下面将继续. struts.xml <package name="com.amos.web.action" namespace="/" extends="struts-default"> <action name="HelloWorldAction" method="execute"> <result name="

J2EE学习篇之--Struts2技术详解

前面说到了Struts1的相关知识,下面来说一下Struts2的相关知识,我们知道现在Struts2使用的比Struts1多,Struts2已经替代Struts1成为主流的框架了... 摘要 Struts2是在WebWork2基础发展而来的.和struts1一样, Struts2也属于MVC框架.不过有一点大家需要注意的是:尽管Struts2和Struts1在名字上的差别不是很大,但Struts2和struts1在代码编写风格上几乎是不一样的.那么既然有了struts1,为何还要推出struts

深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)[转]

上篇文章<深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)> 介绍了properties与environments, 本篇继续讲剩下的配置节点之一:typeAliases. typeAliases节点主要用来设置别名,其实这是挺好用的一个功能, 通过配置别名,我们不用再指定完整的包名,并且还能取别名. 例如: 我们在使用 com.demo.entity. UserEntity 的时候,我们可以直接配置一个别名user, 这样

struts2的执行流程与配置详解

本章主要讲解Struts的执行流程以及Struts的配置以及访问servletApi 全部代码下载: github链接:链接 写文章不易,欢迎大家采我的文章,以及给出有用的评论,当然大家也可以关注一下我的github:多谢: 1.Struts的执行流程: 1.服务器启动时: 加载项目web.xml 创建Struts核心过滤器对象, 执行StrutsPrepareAndExecuteFilter的doFilter 的 init()方法: 在StrutsPrepareAndExecuteFilter