`
tanghui
  • 浏览: 7288 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java零配置详解(一)

阅读更多

最近做了一个项目,我通过了学习,在我讲解和说明下,项目最终采用了零配置的方式,现在我来详细的说明一下原理及配置文件乃至做法,让我们的项目可以减少那些繁琐的配置文件!!

 

Introduction

struts2.1版本开始,Convention Plugin作为替换替换Codebehind Plugin来实现Struts2的零配置。

  • 包命名习惯来指定Action位置
  • 命名习惯制定结果(支持JSP,FreeMarker等)路径
  • 类名到URL的约定转换
  • 包名到命名空间(namespace)的约定转换
  • 遵循SEO规范的链接地址(即:使用my-action 来替代 MyAction
  • 基于注解的Action
  • 基于注解的拦截机(Interceptor
  • 基于注解的命名空间(Nameespace
  • 基于注解的XWork
  • 默认action以及默认的结果(比如:/products 将会尝试寻找com.example.actions.Products com.example.actions.products.Index进行处理)

无需配置Convention即可使用ConventionConvention的某些约束习惯可以通过配置属性来控制,您也可以在类中覆写其中的方法来达到扩展目地。

安装

使用Convention插件,你需要将其JAR文件放到你应用的WEB-INF/lib目录中,你也可以在你Macen项目的POM文件中添加下面包依赖

<dependency>

  <groupId>org.apache.struts</groupId>

  <artifactId>struts2-convention-plugin</artifactId>

  <version>2.1.6</version>

</dependency>

转换基于Codebehind项目到Convention

跳转到此页面,查看需要修改的变化和小提示

如果你想在你系统中结合Convention插件使用REST。需要在你项目的struts.xml中添加如下配置

<constant name="struts.convention.action.suffix" value="Controller"/>

<constant name="struts.convention.action.mapAllMatches" value="true"/>

<constant name="struts.convention.default.parent.package" value="rest-default"/>

Hello world

到目前为止,你已经在你项目中添加了Convention插件支持,首先我们从一个非常简单的例子开始入手。本例中,我们将演示根据访问URL来访问固定的Action,默认情况下,Convention会默认所有的结果页面都存储在WEB-INF/content下,你也可以在strutsproperties文件中设定struts.convention.result.path的值到一个新的路径。路径最后“/”是不必要的,Convention会自动进行处理。以下是本例的JSP文件

WEB-INF/content/hello-world.jsp

<html>

<body>

Hello world!

</body>

</html>

启动Tomcat或其他你所使用的JEE容器,在浏览器访问http://localhost:8080/hello-world 你可看到以下信息:

WEB-INF/content/hello-world.jsp

Hello world!

这表明,Convention已经能正常运行,并找到了结果。即使在没有action存在情况下,convention也会根据URL规则来找到结果页面。

Code behind hello world

我们继续扩展本例并添加代码实现类。为了实现本功能,首先需要Convention能正确找到我们的Action 类,默认情况下,Convention会找到com.opensymphony.xwork2.Action 的实现类,或制定包中以Action 结尾的类 action

Convention使用以下方法来搜索类路径,首先,Convention会从根package中寻找包名含有strutsstruts2action or actions 的任意packages。下一部,Convention从前一步找到的package以及其子package中寻找 com.opensymphony.xwork2.Action 的实现以及以Action结尾的类,下面为Convention寻找的类

Classes

com.example.actions.MainAction

com.example.actions.products.Display (implements com.opensymphony.xwork2.Action)

com.example.struts.company.details.ShowCompanyDetailsAction

每一个被Convention找到action都会对应一个明确的URL地址,URLpackage的名字以及Action类名为基础。

首先Convention从根package以及类所在的package名来确定对应的URL中的路径(namespace),以下就是根据package确定的URL namespace

Namespaces

com.example.actions.MainAction -> /

com.example.actions.products.Display -> /products

com.example.struts.company.details.ShowCompanyDetailsAction -> /company/details

接下来Convention需要确定URL的具体资源部分。第一步取消类名中的Action,并以”-”来分割类名的其他部分,且将每个分部的首字母转为小写。如下所示

Full URLs

com.example.actions.MainAction -> /main

com.example.actions.products.Display -> /products/display

com.example.struts.company.details.ShowCompanyDetailsAction -> /company/details/show-company-details

你也可以通过配置struts.convention.exclude.packages 来告诉Convention忽略某些包,也可以设置struts.convention.package.locators 用来更改Convention默认的根packages,最后你还可以设置  struts.convention.action.packages. 来让Convention只搜索特定package下的Action

以下就是action类的实现代码:

com.example.actions.HelloWorld

package com.example.actions;

 

import com.opensymphony.xwork2.ActionSupport;

 

public class HelloWorld extends ActionSupport {

  private String message;

 

  public String getMessage() {

    return message;

  }

 

  public String execute() {

    message = "Hello World!";

    return SUCCESS;

  }

}

编译以上代码,并将其class放到 WEB-INF/classes中,Convention将会将 /hello-world 映射到这个Action. 部署上面的类以后,我们在JSP文件中添加打印message的语句,具体代码如下:

WEB-INF/content/hello-world.jsp

<html>

<body>

The message is ${message}

</body>

</html>

启动应用服务器,在浏览器访问 http://localhost:8080/hello-world 地址,我们看到如下结果界面:

Result

The message is Hello World!

Results and result codes

Struts启动后,Convention将预设好应用中的所有的action,默认情况下,配置将包含在你应用中能找到的所有JSP文件。

同时您也可在Action代码中设置与习惯不同的结果页面。通常Action方法返回一个字符串,通过返回的字符串找到结果页面,而使用Convention允许你在action代码中指定和返回字符串不同的结果页面。

编译下面的例子。我们希望在action中返回zero 而不是success,第一步,我们更新action类,返回zero

com.example.actions.HelloWorld

package com.example.actions;

 

import com.opensymphony.xwork2.ActionSupport;

 

public class HelloWorld extends ActionSupport {

  private String message;

 

  public String getMessage() {

    return message;

  }

 

  public String execute() {

    if (System.currentTimeMillis() % 2 == 0) {

      message = "It's 0";

      return "zero";

    }

 

    message = "It's 1";

    return SUCCESS;

  }

}

接下来,我们添加一个新的JSP页面 WEB-INF/content/hello-world-zero.jsp 。需要注意的是,文件名的第一部分和action名是对应的,后面的部分和action返回的字符串对应。这就是convention确定具体使用那个页面来渲染结果。下面是修改后的JSP代码:

WEB-INF/content/hello-world.jsp

<html>

<body>

The error message is ${message}

</body>

</html>

现在,你可以编辑你的程序,重启应用,刷新页面,根据当前时间不通,会看到不通的渲染结果页面

结果页面的类型会自动匹配文件,支持的渲染页面的格式为:jsp.ftl,vm,html,htm.下面是actiong和结果模版的映射关系:

 

URL

Result

File that could match

Result Type

/hello

success

/WEB-INF/content/hello.jsp

Dispatcher

/hello

success

/WEB-INF/content/hello-success.htm

Dispatcher

/hello

success

/WEB-INF/content/hello.ftl

FreeMarker

/hello-world

input

/WEB-INF/content/hello-world-input.vm

Velocity

/test1/test2/hello

error

/WEB-INF/content/test/test2/hello-error.html

Dispatcher

Action

如果在一个action结果中调用另外一个action ,他们俩将被链接到一起,如果在第一个action代码中未定义result,如下代码:

com.example.actions.HelloWorld

package com.example.actions;

 

import com.opensymphony.xwork2.Action;

import com.opensymphony.xwork2.ActionSupport;

 

public class HelloAction extends ActionSupport {

    @Action("foo")

    public String foo() {

        return "bar";

    }

 

    @Action("foo-bar")

    public String bar() {

        return SUCCESS;

    }

}

 “foo” action执行时候,由于找不到结果,convention尝试在同一个包下寻找action名为”foo-bar”action。如果找到这样的actionconvention将会调用并返回相关联的result

XWork packages

为了避免冲突,可将action放在一个自定义XWORKpackage下。package命名由action所在的Java,action对应的URLnamespace部分以及actionparent XWork package三个部分组成。parent XWork package 值在属性 struts.convention.default.parent.package 中指定(默认为conventionDefault),package的属性值须继承于 strutsDefault

因此,Convention插件中XWORK packages 采用如下命名规则:

XWork package naming

<java-package>#<namespace>#<parent-package>

(待续)

分享到:
评论

相关推荐

    Java零基础 - 环境变量PATH配置.md

    ### Java零基础-环境变量PATH配置详解 #### 一、引言 对于初学者来说,配置Java开发环境可能是一项挑战性的任务。特别是当涉及到环境变量的设置时,很多新手可能会感到困惑。本篇文章旨在帮助Java初学者理解如何...

    Tomcat与java web 开发技术详解-孙卫琴-第二版

    7. **实战案例**:通常,书中会包含多个实例,演示如何从零开始构建一个完整的Java Web应用,包括用户登录、注册、数据操作等功能,使读者能够将理论知识应用于实践中。 8. **调试与优化**:这部分可能会涉及Tomcat...

    Java零基础基础教程

    ### Java零基础基础教程知识点详解 #### 一、Java简介 - **定义**:Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems公司于1995年推出。 - **特点**: - 跨平台性(Write Once, Run Anywhere,即编译...

    Struts2配置精要之常量constant配置详解(包括零配置Convention 的常量)

    Struts2是一款强大的Java Web框架,它为开发者提供了模型-视图-控制器(MVC)架构,便于构建可维护、可扩展的Web应用程序。在Struts2中,配置是其核心部分之一,它允许开发者定制框架的行为以满足特定需求。本文将...

    SpringMVC4零配置

    **SpringMVC4零配置详解** SpringMVC作为Spring框架的一部分,是用于构建Web应用程序的控制器层。在SpringMVC4版本中,引入了“零配置”概念,旨在简化开发流程,提高开发效率。本文将深入探讨SpringMVC4的零配置...

    Java零基础 - classpath环境变量详解.md

    ### Java零基础 - classpath环境变量详解 #### 1. classpath环境变量的定义与作用 **classpath** 是一个环境变量,在Java编程中扮演着极其重要的角色。它指定了Java虚拟机(JVM)搜索和加载类文件(class files)的...

    学习hadoop--java零基础学习hadoop手册

    **标题**:“学习hadoop--java零基础学习hadoop手册” **描述**:“学习hadoop--java零基础学习hadoop手册” 本手册旨在为完全没有Java基础的学习者提供一个从零开始学习Hadoop的路线图。Hadoop是一个能够处理大量...

    java 笔记详解

    总的来说,"Java笔记详解"覆盖了从零开始学习Java的所有基础环节,包括环境配置、基础语法、开发工具的使用以及必要的辅助工具,是Java初学者理想的参考资料。通过深入学习和实践,可以逐步掌握这门强大的编程语言,...

    Java零基础 - 环境变量PATH.md

    ### Java零基础 - 环境变量PATH详解 #### 一、引言 对于初学者而言,正确地配置Java开发环境是学习Java编程的第一步。本文将深入介绍如何配置环境变量`PATH`,并提供相应的示例源码来验证配置是否成功。无论您是...

    Java基础详解(基础)

    标题《Java基础详解(基础)》所涵盖的知识点主要针对Java入门新手,详细讲解了Java语言的基本知识和开发环境的搭建方法。该部分涉及了Java的多个版本,包括JavaSE、JavaEE和JavaME,并强调了对于不同版本的JDK新...

    Java零基础 - main方法.md

    ### Java零基础-main方法 #### 源码详解与运行过程 本文主要针对Java初学者,详细介绍`main`方法的基本结构、语法以及如何编写和运行一个最简单的Java程序。此外,还会涉及如何利用`System.out.println`方法输出...

    JAVA编程语言视频详解.rar

    这个名为"JAVA编程语言视频详解.rar"的压缩包文件包含了一套详细的Java教学视频,由知名专家讲解,旨在帮助学习者从零基础开始理解和掌握Java编程。 首先,Java的环境编译是学习过程中不可或缺的一环。Java开发需要...

    java视频教程_黑马Java零基础辅导班[第二期]08天课件源码

    本教程“java视频教程_黑马Java零基础辅导班[第二期]08天课件源码”针对初学者,通过8天的课程设计,深入浅出地讲解了Java的基础知识,并提供了丰富的实践代码示例,旨在帮助学员快速掌握Java编程。 1. **Java开发...

    【2024最新版】Java JDK安装配置全攻略:图文详解

    本资源为一份图文并茂的Java JDK安装配置教程,适用于2024年最新版的JDK。内容覆盖JDK版本选择、下载、详细安装步骤、环境变量配置等方面,旨在帮助用户快速掌握Java开发环境的搭建方法。 **适用人群**: - 零基础...

    Java使用路径通配符加载Resource与profiles配置使用详解

    Java使用路径通配符加载Resource与profiles配置使用...Java使用路径通配符加载Resource与profiles配置使用详解是Java开发中非常重要的一部分,通过路径通配符和profiles配置,可以更好地管理和配置项目中的资源和环境。

    2020老杜最新Java零基础进阶视频教程-注解课件

    【Java注解详解】 Java注解(Annotation)是Java编程语言的一个重要特性,它提供了一种安全的方式来元数据(metadata)与程序元素关联,如类、接口、字段和方法等。注解不会改变程序的基本结构,但它们可以被编译器...

Global site tag (gtag.js) - Google Analytics