Struts2开发基础

struts2采用拦截器的机制来处理用户的请求,使得业务逻辑控制器能够与ServletAPI完全脱离开。

1. Hello World!

配置web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app id="WebApp_9" 

version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>Struts Demo</display-name>

    <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>

    <welcome-file-list>

        <welcome-file>index.html</welcome-file>

    </welcome-file-list>

</web-app>

配置struts.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"

"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

<package name="default" namespace="/" extends="struts-default">

        <action name="HelloWorld" class="example.HelloWorld">

            <result name = "success" >/WEB-INF/jsp/example/HelloWorld.jsp</result>

        </action>

    </package>

</struts>

Hello.java

import com.opensymphony.xwork2.ActionSupport;

public class Hello extends ActionSupport {

    public final static String  MESSAGE = "Hello World!";

    private String msg;

    public String getMessage() {

        return msg;

    }

    public void setMessage(String msg) {

        this.msg = msg;

    }

    public String execute() throws Exception {

        setMessage(MESSAGE);

        return SUCCESS;

    }

}

将struts2应用部署到Tomcat

  1. 编译.java文件
  2. 在Tomcat/webapps/appname文件夹下建立WEB-INF文件夹
  3. 将struts2必须的包放入到站点/WEB-INF/lib下,
  4. 将编译好的相应class文件按照包的结构放在/WEB-INF/classes/相应的包目录下。
  5. 将struts.xml放入/WEB-INF/classes/文件夹下
  6. 启动Tomcat,在浏览器中访问localhost:protal/appname/HelloWorld或者localhost:protal/appname。(建议指定Action)

struts2原理

当Web容器收到请求(HttpServletRequest)时,它将请求传递给一个标准的过滤链。接下来调用FilterDispatcher核心控制器,然后它调用ActionMapper确定请求哪个Action。ActionMapper返回一个收集Action详细信息的ActionMaping对象。

接下来FilterDispatcher将控制权委派给ActionProxy,ActionProxy调用配置管理器(ConfigurationManager) 从配置文件中读取配置信息(struts.xml),然后通过反射创建ActionInvocation对象。ActionInvocation在调用Action之前会依次的调用所用配置拦截器(Interceptor ).

一旦执行结果返回结果字符串,ActionInvocation负责查找结果字符串对应的(Result)然后执行这个Result。Result会调用一些模版(JSP)来呈现页面,之后拦截器(Interceptor)会被反向执行,处理响应(response)。

简单地说,Strusts2起到一个过滤器控制器的作用,这点从web.xml中可以看出来。

2.  Struts2 配置设置

配置Action是struts2配置的核心内容。

(1) 包和命名空间

struts2使用包来组织Action,在xml配置文件中使用<package>标签来组织一个包,Action使用<action>子元素来完成。

<package name="default" namespace="/" extends="struts-default">

<package>标签必须指定name属性,它是访问的唯一标识,extends属性指定继承的父包,子包可以在父包中集成Action,拦截器,拦截器栈等配置。还有可选的abstract属性,abstract="true"表示该包不能进行Action配置。

struts2的命名空间机制用来避免命名冲突,同一命名空间下不允许Action等重名,不同命名空间下允许重名。<package>标签的namespace属性用于指定命名空间,不允许对单独的Action指定空间。

如果<package>没有指定namespace属性则属于默认命名空间。设置<package namespace = "/">指定为根命名空间。如果请求为/space/*.actionweb容器会先在space命名空间中寻找Action,如果未找到则在默认命名空间中寻找Action,若仍未找到则会出现错误。如果请求为/*.action则在根命名空间中寻找Action,这也说明了根命名空间和默认命名空间的区别。

(2) 配置Action

   <action name="HelloWorld" class="example.HelloWorld">

         <result name = "success" >

                 /WEB-INF/jsp/example/HelloWorld.jsp

         </result>

 </action>     

Action必须指定URL,struts2的Action所处理URL即为namspace/actioname.action,或省略.action后缀。

Action作为逻辑控制器并不直接生成响应,而是返回一个代表处理结果的字符串,<result>子标签将返回的结果与物理视图对应。

(3) 配置常量

struts2框架采用下列顺序加载struts2常量:

1. struts-default.xml struts2-core.jar

2.struts2-plugin.xml

3.struts.xml

4.struts.properties

5.web.xml

后面加载的常量会覆盖前面的常量。

为了模块化的配置,struts.xml可以使用include标签包含其它xml配置文件:

<include file="example.xml"/>

(4) 配置结果

1. result配置

struts2在struts.xml中使用<result>元素配置处理结果。处理结果依照作用域可以分为全局结果和局部结果,默认作为局部结果。

<action name="HelloWorld" class="example.HelloWorld">

         <result name = "success" >

                    /WEB-INF/jsp/example/HelloWorld.jsp

         </result>

 </action> 

<result>元素要配置的属性包括:

(1)name:对应Action返回的结果字符串,若缺省则默认为"SUCCESS"

(2)type: 指定result的类型

(3)location: 指定实际视图资源,若缺省则使用<result></>之间的字符串作为视图资源。

(4)parse: 是否允许在<result>中使用OGNL表达式,默认为"true"。

2. result类型

<result-type>可以在xml中自定义,struts-default.xml中定义了常用的result-type。

(1)dispatcher:

dispatcher是用于指定jsp视图的结果类型,若缺省type则默认为此类型。

(2)plainText:

plainText用于以纯文本方式返回视图的源代码。plainText结果类型可指定如下参数:

loacation:指定实际视图资源

charSet:   指定字符集

(3)redirect

dispatcher使用请求转发的方式返回视图资源,redirect使用重定向的方式返回视图资源。redirect类型会调用HttpServlet.sendRedirect方法来重定向,此方法将会重新建立一个request,原请求中的数据将会全部丢失。

redirect方式允许配置loaction和parse两个属性。

(4)redirectAction

redirectAction类型与redirect类似,同样是生成一个新的请求。区别在于,redirectAction使用ActionMapperFactory的ActionMapper来将请求重定向到另一个Action。

redirect需要指定namespace和actionName来指定目标Action的namespace和Actionname。

3. 全局结果

<result>用来配置局部结果,只对它所属的action有效。<globla-result>标签用于配置全局结果,对于所有Ation都有效。

<global-results>

            <result name="error">/WEB-INF/jsp/error.jsp</result>

 </global-results>

在匹配结果时优先匹配局部结果,当局部结果不匹配时才会匹配全局结果。

3. 开发Action

(1) 实现Action

struts2 不要求Action类实现任何接口或继承任何类,但为了标准化编程,struts2提供了Action接口定义了规范化的Action类,并为其提供了一个ActionSupport实现类( com.opensymphony.xwork2.ActionSupport;),通常我们继承ActionSupport类并重写public String execute(void)方法。ActionSupport定义了数据校验,获取国际化信息的方法,在struts.xml的Action配置中若省略class属性则会使用ActionSupport作为实现类。

execute方法返回一个代表处理结果的字符串,并根据xml中的配置将其映射为物理视图。strust2定义了5个标准字符串:"SUCCESS","ERROR","LOGIN","INPUT","NONE";实际上仍可使用自定义的字符串作为处理结果。

(2) 访问Servlet API

1. 使用ActionContext

struts2的Action不再与Servlet API耦合,但提供了访问Servlet API的方法。struts2提供了ActionContect类,并通过该类访问Servlet API。

(1) ActionContext ctx = ActionContext.getContext();

getContext()方法可以获得ActionContext实例。

(2) Map session = ctx.getSession();

获得session实例。

(3) Map sctx = ctx.getApplication();

获得ServletContext实例

(4) void setSession(Map session);

设置session。

(5) void setApplication(Map application)

设置Application。

(6) Map getParameters()

等价于HttpServletRequest.getParameterMap()方法,得到请求的参数。

(7) Object get(Object key)

等价于HttpServletRequest.getAttribute(String key)方法。

2. 使用ServletActionContext

ServletActionContext提供静态方法获取相应对象。

(1)获得PageContext对象。

static PageContext getPageContext()

(2)获得HttpServletRequest对象。

static HttpServletRequest getRequest()

(3)获得HttpServletReponse对象。

static HttpServletReponse getReponse()

(4)获得ServletContext对象。

static ServletContext getServletContext()

3. 实现Aware系列接口

(1)ServletResponseAware

实现该接口该接口的类可以直接访问HttpServletResponse对象,但必须实现setServletResponse()接口。

class MyAction 

implements Action, ServletResponseAware 

{

  private HttpServletResponse response;

  public void setServletResponse (HttpServletResponse response) {

    this.response = response;

    }

} 

(2)ServletRequestAware

与ServletResponseAware类似,实现该接口的类可以访问HttpServletRequest对象,只要实现方法:

public void setServletRequest(HttpServletRequest request)

(3) ServletContextAware

与ServletResponseAware类似,实现该接口的类可以访问HttpServletContext对象,只要实现方法:

public void setServletContext(HttpServletContext request)

Struts2开发基础的更多相关文章

  1. Struts2框架基础

    Struts2框架基础 1.Java的框架 1.1.框架简介 在大型项目开发过程中,经常会使用到一些框架,这样做好的好处是能够提高工作效率,在java中最常用的的框架就是SSH,这其实是三个框架的简称 ...

  2. 1.Struts2简介和Struts2开发环境搭建

    一.Struts2简介: 1.什么是Struts2? 著名的SSH三大框架分别为:表现层(Struts).业务逻辑层(Spring),持久化层(Hibernate). Struts2是在WebWork ...

  3. .NET基础拾遗(5)多线程开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  4. .NET基础拾遗(6)ADO.NET与数据库开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...

  5. IOS开发基础知识碎片-导航

    1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可 ...

  6. JavaEE开发基础

    1 JavaEE简介 Java平台有三个版本,分别是JavaSE(Java Platform, Standard Edition),JavaEE(Java Platform, Enterprise E ...

  7. ASP.Net开发基础温故知新学习笔记

    申明:本文是学习2014版ASP.Net视频教程的学习笔记,仅供本人复习之用,也没有发布到博客园首页. 一.一般处理程序基础 (1)表单提交注意点: ①GET通过URL,POST通过报文体: ②需在H ...

  8. 从零3D基础入门XNA 4.0(1)——3D开发基础

    [题外话] 最近要做一个3D动画演示的程序,由于比较熟悉C#语言,再加上XNA对模型的支持比较好,故选择了XNA平台.不过从网上找到很多XNA的入门文章,发现大都需要一些3D基础,而我之前并没有接触过 ...

  9. Android 开发基础及环境配置

    2011年买了第一部安卓操作系统的手机,当时势头正盛的HTC不可思议(incredible),当时的想法就是想学习下智能手机开发,但是由于各种原因,客观上是公司的项目太忙了,忙于项目管理.团队建设.客 ...

随机推荐

  1. CI、CD和dev-ops概念

    传统的开发方式是:需求方提供文档,实现方按照文档一步步开发,中间很少变动和修改. 但是随着市场的变化,产品更新迭代的加快,也要求开放方更快的响应变化,用最短的时间开发,部署上线. 这样,持续集成(CI ...

  2. Python自动化开发 -进程、线程和协程(二)

    本节内容 一.线程进程介绍 二. 线程 1.线程基本使用 (Threading) 2.线程锁(Lock.RLock) 3.信号量(Semaphore) 4.事件(event) 5.条件(Conditi ...

  3. MySql字段类型说明

    bigint 从 -^ (-) 到 ^- () 的整型数据(所有数字).存储大小为 个字节. P.S. bigint已经有长度了,在mysql建表中的length,只是用于显示的位数 int 从 -^ ...

  4. Python 模块之wxpython 的应用

    第一个应用程序:“Hello World” 作为传统,我们首先将要写一个小的“Hello World”程序,下面是他的代码: #!/usr/bin/env python import wx app = ...

  5. Select count(*)、Count(1)、Count(0)的区别和执行效率比较

    记得很早以前就有人跟我说过,在使用count的时候要用count(1)而不要用count(*),因为使用count(*)的时候会对所有的列进行扫描,相比而言count(1)不用扫描所有列,所以coun ...

  6. CuratorFramework使用

    CuratorFrameworkFramework是ZooKeeper Client更高的抽象API 自动连接管理: 1. 当ZooKeeper客户端内部出现异常, 将自动进行重连或重试, 该过程对外 ...

  7. 设置 Linux 下打印机的几种方式

    设置 Linux 下打印机的几种方式 一.使用 cups 进行设置 如若遇到 cups 也没有驱动的话可以前往 openprinting.org 找寻对应驱动. 二.前往 official 下载驱动 ...

  8. iOS-项目创建多个target

    在开发中,有时需要两个或多个APP版本,每个版本的改动,不是很多,但是需要另外打包,那么我们就有两套方案: 1.重新开发,把代码复制一遍,然后在修改: 2.用一套代码,根据需求生成不同的包: 我们一般 ...

  9. linux(乌班图)下执行pip没有问题,执行sudo pip报错的问题

    最近刚装好linux的虚拟机,在装一个套件时提示权限不足,于是添加上了 sudo 命令,结果直接报以下错误, Traceback (most recent call last): File " ...

  10. Flask-WTF

    Flask-WTF 提供了简单地 WTForms 的集成. 官方文档:http://www.pythondoc.com/flask-wtf/index.html 功能 集成 wtforms. 带有 c ...