学习笔记 Eclipse Struts2 Examples-HelloWorld

文章摘要
1、struts MVC模式
2、HelloWorld Struts2 工程配置
3、HelloWorld Struts2 工作原理


英文文献请点击此处~

简介:

  • 1、当您单击超链接或在Struts 2 Web应用程序中提交HTML表单时,输入不会发送到另一个服务器页面,而是发送到您提供的Java类,这些类称为操作。
  • 2、Action触发后,Result将选择一个资源来呈现响应。
    资源通常是服务器页面,但它也可以是PDF文件,Excel电子表格或Java小程序窗口。

假设您要创建一个简单的“Hello World”示例,显示欢迎消息。
在设置了一个空的基本的Struts 2 Web应用程序(参见学习笔记 Eclipse Struts2-创建web项目)后,要创建一个“Hello World”示例,您需要做四件事:

  • 1、创建一个类来存储欢迎消息(模型)
  • 2、创建服务器页面以显示消息(视图)
  • 3、创建一个Action类来控制用户,模型和视图(控制器)之间的交互
  • 4、创建一个映射(struts.xml)来耦合Action类和视图

通过创建这些组件,我们将工作流程分为三个众所周知的模式(MVC):视图,模型和控制器。
解耦合的设计使得管理应用程序变得更加复杂时,编程更容易。

一、创建HelloWorld项目web工程

web工程

详细工程文件展示:

IFEI:helloworld ifei$ tree
.
├── pom.xml
├── src
│   └── main
│       ├── java
│       │   └── wanghailu
│       │       └── apache
│       │           └── struts
│       │               ├── action
│       │               │   └── HelloWorldAction.java
│       │               └── model
│       │                   └── MessageStore.java
│       ├── resources
│       │   └── struts.xml
│       └── webapp
│           ├── HelloWorld.jsp
│           ├── WEB-INF
│           │   └── web.xml
│           └── index.jsp
└── target
    ├── classes
    │   ├── struts.xml
    │   └── wanghailu
    │       └── apache
    │           └── struts
    │               ├── action
    │               │   └── HelloWorldAction.class
    │               └── model
    │                   └── MessageStore.class
    ├── m2e-wtp
    │   └── web-resources
    │       └── META-INF
    │           ├── MANIFEST.MF
    │           └── maven
    │               └── wanghailu.apache.struts
    │                   └── helloworld
    │                       ├── pom.properties
    │                       └── pom.xml
    ├── maven-status
    │   └── maven-compiler-plugin
    │       └── compile
    │           └── default-compile
    │               ├── createdFiles.lst
    │               └── inputFiles.lst
    ├── test-classes
    └── tmp
        └── jsp
            └── org
                └── apache
                    └── jsp
                        ├── HelloWorld_jsp.java
                        └── index_jsp.java

34 directories, 17 files

二、创建模型类MessageStore.java

MessageStore.java

package wanghailu.apache.struts.model;

public class MessageStore {
    private String message;

    public MessageStore() {
        message = "Hello Struts User";
    }

    public String getMessage() {
        return message;
    }
}

注意使用public getter方法来允许访问私有消息String属性。Struts 2框架要求您要暴露给view(HelloWorld.jsp)的对象遵循JavaBean风格的约定

三、创建Action类HelloWorldAction.java

我们需要一个Action类作为Controller。Action类响应用户操作(在本示例中,该操作将单击HTML超链接并将特定URL发送到Servlet容器)。Action类的一个或多个方法被执行,返回一个String结果。根据结果​​的值,HelloWorld.jsp渲染一个特定的视图页面(在此示例中为该视图页面)。

package wanghailu.apache.struts.action;

import wanghailu.apache.struts.model.MessageStore;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport {
    private MessageStore messageStore;

    public String execute() {
        messageStore = new MessageStore() ;
        
        return SUCCESS;
    }

    public MessageStore getMessageStore() {
        return messageStore;
    }
}

Struts 2框架将创建一个HelloWorldAction类的对象并调用execute方法以响应用户的操作(单击发送特定URL到Servlet容器的超链接)。

在这个例子中,execute方法创建一个类的对象,MessageStore然后返回String常量SUCCESS。

还要注意私有MessageStore对象的public getter方法。由于我们希望使该MessageStore对象可用于视图页面,因此HelloWorld.jsp我们需要遵循JavaBean样式,在需要时提供getter和setter方法。

四、创建查看HelloWorld.jsp

我们需要一个服务器页面来呈现存储在模型类中的消息MessageStore。在src/main/webapp文件夹中创建下面的JSP 。
HelloWorld.jsp

<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Hello World!</title>
  </head>
  <body>
    <h2><s:property value="messageStore.message" /></h2>
  </body>
</html>

taglib指令告诉Servlet容器,该页面将使用Struts 2标签,并且这些标签前面会有一个s。

该<s:property> 标签显示通过调用方法返回的值getMessageStore 的的HelloWorldAction 控制器类。该方法返回一个MessageStore 对象。通过添加.message 到值属性的messageStore部分,我们告诉Struts 2框架来调用该 对象的getMessage 方法MessageStore。getMessage 类的方法MessageStore返回一个String。它是由<s:property> 标签显示的String 。

五、在struts.xml中添加Struts配置

我们需要一个映射来将URL,HelloWorldAction 类(控制器)和HelloWorld.jsp (视图)绑定在一起。映射告诉Struts 2框架,哪个类将响应用户的操作(URL),该类的哪个方法将被执行,以及根据该方法返回的String结果渲染的视图。

编辑struts.xml文件(在该文件在src / main / resources文件夹中的Mvn项目中)以添加操作映射。将操作节点(动作名称=“hello”)放在打开和关闭包节点之间,紧跟在名称=“index”的动作映射之后。你的完整struts.xml应该是:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
    "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>

    <constant name="struts.devMode" value="true" />

    <package name="basicstruts" extends="struts-default">
        <action name="index">
            <result>/index.jsp</result>
        </action>
        <action name="hello" class="wanghailu.apache.struts.action.HelloWorldAction" method="execute">
            <result name="success">/HelloWorld.jsp</result>
        </action>
    </package>

</struts>

六、创建URL操作

让我们在里面添加一个Action URL index.jsp(见src/main/webapp文件夹),这样用户可以点击链接来告诉Struts 2框架来运行HelloWorldAction该类的execute方法并渲染HelloWorld.jsp视图。

首先在jsp的顶部添加taglib指令<%@ taglib prefix="s" uri="/struts-tags" %>。接下来<p><a href="<s:url action='hello'/>">Hello World</a></p>在h1标签之后添加这个p 标签。你的新的index.jsp应该是:

<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Basic Struts 2 Application - Welcome</title>
    </head>
    <body>
        <h1>Welcome To Struts 2!</h1>
        <p><a href="<s:url action='hello'/>">Hello World</a></p>
    </body>
</html>

Struts url标签创建一个带有hello操作的URL。hello操作被映射到HelloWorldAction类及其execute方法。当用户点击上述URL时,会导致Struts 2框架运行HelloWorldAction该类的execute方法。之后,该方法返回String success(常量SUCCESS),HelloWorld.jsp将会渲染视图页面。

七、构建WAR文件并运行应用程序

通过mvn jetty:run来执行程序,需要配置web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>


  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

可以通过http://localhost:8080/helloworld/index.action来访问网络程序,效果如下:

点击“Hello World”链接,展示如下:

八、工作原理

您的浏览器向Web服务器发送请求URL:http://localhost:8080/helloworld/hello.action.

  • 1、容器从Web服务器接收对资源的请求hello.action。
    根据从web.xml加载的设置,容器发现所有请求都被路由org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter,包括*.action请求。StrutsPrepareAndExecuteFilter是框架的入口点。
  • 2、该框架查找名为“hello”的动作映射,并发现该映射对应于类“HelloWorldAction”。框架实例化Action并调用Action的execute方法。
  • 3、该execute方法创建MessageStore对象并返回SUCCESS(= "success")。框架检查操作映射以查看要SUCCESS返回哪个页面要加载。该框架告诉容器作为对请求(资源)的响应进行呈现HelloWorld.jsp。
  • 4、当页面HelloWorld.jsp被处理时,<s:property value="messageStore.message" />标签调用Action 的getter getMessageStore,HelloWorld然后调用getMessage返回的MessageStore对象getMessageStore。标签将message属性的值合并到响应中。
  • 5、纯HTML页面响应发送回浏览器。

备注:

该框架使用Actions来处理HTML表单和其他请求。本Action类返回一个结果,名称,例如SUCCESS,ERROR或INPUT。根据从中加载的映射struts.xml,给定的结果名称可以选择一个页面(如本示例),另一个操作或其他一些Web资源(图像,PDF)。

当服务器页面呈现时,通常它将包括由Action提供的动态数据。为了方便显示动态数据,框架提供了一组可与HTML标记一起使用以创建服务器页面的标签。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容