Struts2入门2 Struts2深入

链接: http://pan.baidu.com/s/1rdCDh 密码: sm5h

前言:

前面学习那一节,搞得我是在是太痛苦了。因为在Web项目中确实不知道该添加那些Struts2的包,不该添加那些。当我一股脑的将所有的包都加进去的时候,悲剧照样是发生,估计是因为Web项目导致的。将上面那个例子配置好真心费事,然后就是最好不要使用FilterDispatcher这个类当做Struts2在web.xml配置的拦截器,转到使用org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.

这一节我们深入的学习一下Struts2的知识:struts.xml文件的主要元素、Action的实现方式、Action对于ActionContext的访问方式、Action对于ServletAPI的访问方式、Action的配置方式以及通配符的使用、掌握处理结果的流程、利用通配符配置result、掌握dispatcher,redirect,redirectAction等结果类型的使用、掌握Struts异常机制。

1.配置文件详解

Struts2配置文件是整个框架的联系纽带,Struts通过配置文件将核心控制器StrutsPrepareAndExecuteFilter、业务控制器Action和视图组件联系在一起。配置文件在Struts2框架中起着调度的作用,同时配置文件的使用也降低了类之间的耦合程度。Struts2的核心配置文件就是struts.xml,负责管理Struts2框架的业务控制器Action。默认情况下放在类的根目录下面。

1.1常量的配置

在struts.properties、struts.xml或者是web.xml中配置。常量的加载顺序是struts.xml,struts.properties, web.xml,所以如果在struts.xml中定义的A,如果在web.xml中也定义了,就会出现web.xml覆盖struts.xml中的A

常见的属性:

struts.configuration

struts.local

struts.i18n.encoding

struts.xslt.nocache

struts.configuration.files 加载struts2的多个配置文件,多个文件使用,隔开

struts.multipart.saveDir 长传文件的临时保存目录

struts.multipart.maxSize 文件最大的字节数

struts.customer.propertiex 指定加载自定义的属性文件

struts.mapper.class         指定HTTP请求映射到Action的映射器,默认是org.apache.struts2.mapper.DefaultActionMapper

struts.action.extension 指定请求后缀,默认是action,也就是所有的后缀是.action的请求都是有Struts2处理的

struts.serve.static.browserCache

struts.configuration.xml.reload      struts.xml修改之后是否重新加载该文件

struts.devMode 开发模式

1.2包配置

Struts2中包的概念,每一个包就是有若干个Action、拦截器和拦截器引用组成的集合。Struts2通过包来管理Action和拦截器等核心组件。

<package name=”packagename” extends=”struts-default” namespace=”” abstract=””>

Abstract抽象包是不可以定义<action>

1.3命名空间配置

通过创建包,可以将逻辑上相关的Action或者是拦截器等组件放在同一个包中,

<package name=”p1” extends=”struts-default”>

<action name=”login” class=”com.yang.stru2.action.LoginAction”>

<result name=”error”>/error.jsp</result>

<result name=”success”>/success.jsp</result>

</action>

</package>

<package name=”p2” extends=”struts-default”>

<action name=”login” class=”com.yang.stru2.action.LoginAction”>

<result name=”error”>/error.jsp</result>

<result name=”success”>/success.jsp</result>

</action>

</package>

这种情况下,p1和p2包中都定义了一个login的action,当请求访问p1的Action就会发现负责处理请求的始终是p2中的Action,因为p2将p1中的请求给覆盖掉了,使得p1中的Action没有机会处理请求,可以使用namespace来解决。

<package name=”p1” extends=”struts-default” namespace=”/admin”>

<action name=”login” class=”com.yang.stru2.action.LoginAction”>

<result name=”error”>/error.jsp</result>

<result name=”success”>/success.jsp</result>

</action>

</package>

<package name=”p2” extends=”struts-default”>

<action name=”login” class=”com.yang.stru2.action.LoginAction”>

<result name=”error”>/error.jsp</result>

<result name=”success”>/success.jsp</result>

</action>

</package>

这样,当用户请求是namespace+action的规则: http://ip:port/WebProj/admin/login.action

访问p2中的请求 http://ip:port/webProj/login.action

如果不指定命名空间的话,默认是namespace=””.某个包可以显示的指定命名空间是根目录namespace=”/”

Struts2执行Action搜索:

查找指定命名空间下的Action,找到则执行;如果找不到,则转入到默认的命名空间下查找Action,找到则执行;还没有找到的话,就会报错。

1.4包含其他文件的配置信息

使用<include file=”bookshop-product.xml”/>位于struts根目录下,通常情况下,会将所有的struts的配置文件放到根目录下,其中饮用的每一个配置文件必须是有效的struts的配置文件

2.Action详解

对于Struts2 来说Action是应用的核心,每一个Action类就是一个工作单元,包含了对于用户请求的逻辑处理,因此Action也被称为业务控制器。在开发过程中,开发者需要根据处理逻辑的不同写出不同的Action诶,并且在struts.xml中配置好每一个Action类。Struts2框架负责将请求和Action进行匹配,匹配成功的话,这个Action就会被Struts2框架调用,进而完成请求的处理。

2.1Action的实现

POJO方式实现,必须包含一个特定的方法public String execute(),在上面的例子中已经实现过了,这里注意参数传递的时候,Action中的属性名字不一定要和表单中的元素名称完全一致,但是对已表单中的每一个元素名在Action中一定要有对应的getter/setter方法。比如表单中的是userName,那么在Action中必须有setUserName() & getUserName(),但是Action的对应的属性名臣却可以是不同的。

实现Action接口,统一execute返回的规范:

继承ActionSupport类:提供了Action的一个实现类就是ActionSupport,该类提供了许多方法,比如国际化信息的方法,数据校验,默认处理用户请求的方法,实际上ActionSupport是Struts2默认的Action的处理类,当用户在Action没有指定Action的时候使用的是这个ActionSupport

package com.yang.stru2.action;

import com.opensymphony.xwork2.ActionSupport;

public class RegAction extends ActionSupport {

private String userName;

private String password;

public String getUserName(){ return this.userName;}

public void setUserName(String userName){this.userName = userName;}

public String getPassword(){return this.password;}

public void setPassword(String password){ this.password = password;}

@Override

public void validate(){

if(this.userName == null ||this.userName.equals( "")){

this.addFieldError("userName", "用户名不可以为空");

System.out.print("用户名为空");

}

if(this.password== null || this.password.equals("")){

this.addFieldError("password", "密码不可以为空");

System.out.println("密码为空");

}

}

@Override

public String execute(){

System.out.println("---------注册用户信息如下------");

System.out.println("用户名:" + userName);

System.out.println("密码:" + password);

return SUCCESS;

}

}

<package name="reg" extends="struts-default">

<action name="reg" class="com.yang.stru2.action.RegAction">

<result name="success">/reg_success.jsp</result>

<result name="input">/reg.jsp</result>

</action>

</package>

这个比较智能,所以推荐使用ActionSupport这种方式,在执行execute之前还可以进行数据校验。

2.2Action访问ActionContext

Struts2没有直接和ServletAPI进行耦合,这是Struts2的改进,但是Action也需要访问ServletAPI,比如HttpSession HttpServletSession ServletContext

在Struts2中提供了一个ActionContext的class,Struct可以通过它来访问ServletAPI:

Object get(Object key)

Map getApplication() 返回一个Map对象,类似ServtletContext

ActionContext getContext() 获取系统的ActionContext

Map getParameters()

Map getSession()

void setApplication(Map application)

void setSession(Map session);

ActionContext是Action的执行上下文,Action在执行的时候需要用到相关的Servlet对象比如request, session,所以每一次执行的时候都会创建一个ActionContext对象的副本,多线程下访问是不会出现问题的(其实在Struts2内部使用的是ThreadLocal对象来处理ActionContext)

访问Servlet资源

public class CounterAction extends ActionSupport {

@Override

public String  execute(){

ActionContext actionContext = ActionContext.getContext();

Integer counter = (Integer) actionContext.getApplication().get("counter");

if(counter == null){

counter = 1;

System.out.println("counter null");

}else{

counter++;

}

actionContext.getApplication().put("counter", counter);

System.out.println("counter:"+counter);

return SUCCESS;

}

}

2.3Action直接访问ServletAPI

虽然可以通过ActionContext间接地操作ServletAPI,但是有的时候需要在Action中直接访问Servlet API.Struts2 提供了一系列的接口,通过Action实现这些接口便可以直接访问Servlet API:

ServletContextAware 对应 ServletContext

ServletRequestAware 对应HttpServletRequest

ServletResponseAware 对应 HttpServletResponse

当然了在Action中还可以使用ServletActionContext类来间接操作Servlet API:

static PageContext getPageContext()

static HttpServletRequest getRequest()

static HttpServletResponse getResponse()

static ServletContext getServletContext()

在开发过程只能够,为了避免Action于Servlet API直接耦合,推荐使用ActionContext来间接操作ServletAPI,如果在Action中必须使用Servlet API,可以通过ServletActionContext类的帮助,从而以更加简单的方式直接访问Servlet API。

2.4Action的配置

编写Action之后,需要在struts.xml文件中配置对应的Action信息,从而使Struts2框架知道该Action的存在,从而调用该Action来处理用户请求。

Struts2 使用包的概念组织action,在struts.xml中通过使用关键字package下的action元素配置Action。在配置Action的时候,需要指定action的name属性,action还有一个class属性指定器实现的类,但这个class属性不是必须的,默认使用的是ActionSupport 类

2.5动态方法的调用

在实际的开发中通常一个action对应多个处理逻辑,比如一条记录有编辑和删除,但是分别交给Action的不同方法处理,可以根据actionName!methodName.action的形式访问Action,比如reg!del.action直接访问RegAction中的del()方法。这种方式被称为DMI(Dynamic Method Invocation,动态方法调用)

<a href=”user!del.action”></a>

<a href=”user!edit.action”></a>

在UserAction.java 中增加两个方法,返回值是String

配置信息struts.xml

<package name=”user” extends=”struts-dedault”>

<action=”user” class=”com.yang.stru2.action.UserAction”>

<result name=”del”>/user/del.jsp</result>

</action>

</package>

同时需要在struts.properties中配置DMI开启

struts.enable.DynamicMethodInvocation=true,否则默认是会将它关闭的

2.6通配符匹配方式

除了DMI方式之外,还可以使用配置通配符来使用Action不同方法处理请求,在配置action元素的时候,需要指定name, class, method属性,这三个属性都支持通配符,但是不建议使用

YangTengfei

2013.11.30

Struts2入门2 Struts2深入的更多相关文章

  1. Struts2入门1 Struts2基础知识

    Struts2入门1 Struts2基础知识 20131130 代码下载: 链接: http://pan.baidu.com/s/11mYG1 密码: aua5 前言: 之前学习了Spring和Hib ...

  2. Struts2入门(七)——Struts2的文件上传和下载

    一.前言 在之前的随笔之中,我们已经了解Java通过上传组件来实现上传和下载,这次我们来了解Struts2的上传和下载. 注意:文件上传时,我们需要将表单提交方式设置为"POST" ...

  3. Struts2 入门

    一.Struts2入门案例 ①引入jar包 ②在src下创建struts.xml配置文件 <?xml version="1.0" encoding="UTF-8&q ...

  4. Struts2入门3 深入学习

    Struts2入门3 深入学习 处理结果和异常 前言: Struts学习的差不多了,还有最后的一点就收官了就是结果处理和异常处理.前面学习Struts主要围绕就是Action以及struts.xml配 ...

  5. Jqgrid入门-结合Struts2+json实现数据展示(五)

    DEMO用的是ssh框架实现的,具体怎么搭建的就不多做说明了.分页表格的数据操作难点就是数据展现.至于增删改直接用hibernate原生的方法实现即可.         初步分析:表格要实现分页,那么 ...

  6. struts2入门程序

    struts2入门程序 1.示例 搭建编程环境就先不说了,这里假设已经搭建好了编程环境,并且下好了strut2的jar包,接下来程序. 1.1 新建web项目 点击File->New->D ...

  7. struts2框架(1)---struts2入门

    struts2框架 如果你之前在MVC模式的时候一直都是通过servlet,获取和返回数据,那么现在开始学习struts2框架, Struts是一个实现MVC设计模式的优秀的框架.它的许多优点我就不说 ...

  8. [java]struts2入门

    摘要 本文是struts2入门,配置教程.如何在IntelJ Idea中进行手动配置.在使用idea新建struts2web项目的时候,在下载jar包的过程中,下载失败,没办法就直接手动进行下载jar ...

  9. ---web模型 --mvc和模型--struts2 入门

    关于web模型: 早期的web 应用主要是静态页丽的浏览〈如新闻的制监),随着Internet的发展,web应用也变得越来越复杂,不仅要 和数据库进行交互 ,还要和用户进行交互,由此衍生了各种服务器端 ...

随机推荐

  1. XML Xpath学习

    Xpath是一门在xml文档中查找信息的语言. Xpath可用来在xml文档中对元素和属性进行遍历. <1>路径表达式1: 斜杠(/)作为路径内部的分隔符 同一个路径有绝对路径和相对路径两 ...

  2. Odoo10尝鲜: 退货

    Odoo sale / purchase 在 v9 改进之后, 开立发票的入口 不再像之前的版本,有多个来源,例如 订单 交货单 记工单 分析分录     现在只有一个入口,只需要在 订单上开票,这样 ...

  3. ubuntu下完全安装mcrypt

    源文章: ubuntu下安装mcrypt 1.首先要下载三个软件 0libmcrypt-2.5.8.tar.gz 下载地址:http://sourceforge.net/project/showfil ...

  4. NOIP2012 题解

    Vigenère 密码 这个名字实在打不来... 题解:模拟 #include <cstdio> #include <cstring> +; bool cj; int cl, ...

  5. MySQL日期时间函数大全(转)

    MySQL日期时间函数大全 DAYOFWEEK(date)  返回日期date是星期几(1=星期天,2=星期一,……7=星期六,ODBC标准)mysql> select DAYOFWEEK('1 ...

  6. 数据库知识整理<五>

    简单的数据查询: 5.1查询的基本结构: Sql语句:select [distinct] (* | column [alias],...) from table [where condition] [ ...

  7. LDO-XC6216C202MR-G

    XC6216C202MR-G 1.改产品是特瑞士(TOREX)公司电源管理芯片,输入电压可达28V,输出可调23V,最大输出电流150mA.压差最小为300mV.该系列有固定式输出和可调式       ...

  8. 我的Win32开发抉择,Delphi老将复出

    这两天在开发公司的一个教学软件客户端,因为要考虑到给PHP.平面设计等班的同学使用,为了避免安装.Net Framework.JRE的麻烦(如果把.Net Framework.JRE打包到安装包,也会 ...

  9. Swift 笔记

    苹果官方文档 https://developer.apple.com CocoaChina帮助文档 http://www.cocoachina.com/special/swift/ 74个Swift标 ...

  10. 设计模式之美:Creational Patterns(创建型模式)

    创建型模式(Creational Patterns)抽象了对象实例化过程. 它们帮助一个系统独立于如何创建.组合和表示它的那些对象. 一个类创建型模式使用继承改变被实例化的类. 一个对象创建型模式将实 ...