Struts 2 :模版网页应用搭建

简介:基于Struts2框架,构建基础的模版应用反映其工作模式。

  • FrontDispatcher : 请求分派,匹配Action。
  • Action : 处理请求,委派视图。
  • Result : 渲染视图,呈现用户。

一、介绍

这是一个模版网页应用,在exampleOne中呈现了询问天气和开发者姓名的功能。

http://localhost:8080/Template
  • 这里写图片描述
  • 这里写图片描述
  • 这里写图片描述
  • 这里写图片描述

二、目录

1、一级目录

  • 应用名 : Template
  • WEN-INF : 详细的应用部署
  • view : 所有要反馈给用户的视图
  • index.html : 跳转页面,指向第一个用户视图
    这里写图片描述

2、二级目录(view)

  • helloPage.jsp : 第一个用户视图,跳转页面发出的动作指向这里
  • exampleOne : 用例1所有的用户视图,这只是模版,你可以拥有很多用例
    这里写图片描述

3、三级目录(view/exampleOne)

  • HelloPage.jsp :用例1的默认用户视图
  • Today.jsp :实时日期的用户视图
  • Name.jsp :开发者姓名的用户视图
    这里写图片描述

4、二级目录(WEB-INF)

  • web.xml : 应用的全局配置,定义前端分派器、默认页面等
  • lib : 应用需要用到的库函数,由容器调用
  • classes : 所有的类文件、匹配类文件调用的描述文件等
  • src :开发时存放源文件,部署时不应存在
    这里写图片描述

5、三级目录(lib)

  • 容器需要用到的类库
    这里写图片描述

6、三级目录(src)

  • struts.xml : 包含全局中每个Action类与Result视图的匹配描述
  • com :Action处理类源文件
    这里写图片描述

5、三级目录展开(src)

  • com : 模拟域名的包命名规则
  • exampleOne : 用例1的Action类源文件及描述文件
  • action : 存放用例1要用到的所有Action类
  • model : Action类运行时所需的辅助类
  • deploy.xml : 包含用例1每个Action类与Result视图的匹配描述

这里写图片描述
6、三级目录展开(classes)

classes与src有着相同的目录结构,容器寻找Action类时会访问这里。

这里写图片描述
7、子目录(action)

  • Today.java :处理日期请求的类
    这里写图片描述

8、子目录(model)

  • HelloToday.java :日期处理类的辅助类
    这里写图片描述

三、源代码

  • web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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>S2 HelloWorld (XML Based)</display-name>

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</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.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

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

    <package name="default" namespace="/" extends="struts-default"> 
        <action name="Location">
            <result>/view/HelloPage.jsp</result>
        </action>
    </package>

    <include file="com/exampleOne/deploy.xml"/>

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

<struts>

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

        <action name="HelloPage">
            <result>/view/exampleOne/HelloPage.jsp</result>
        </action>

        <action name="Date" class="com.exampleOne.action.Today">
            <result name="SUCCESS">/view/exampleOne/Today.jsp</result>
        </action>

    </package>

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

        <action name="Name">
            <result>/view/exampleOne/Name.jsp</result>
        </action>

    </package>


</struts>
  • index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
    <head>
    <META HTTP-EQUIV="Refresh" CONTENT="0;URL=Location.action">
    </head>

    <body>
            <h3>One moment please.</h3>
    </body>

</html>
  • /view/HelloPage.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
    <head>
    <title>Template : HelloPage</title>
    </head>
    <body>

      <hr>   
      <ul>
         <li><a href="<s:url action='exampleOne/HelloPage'/>">example One</a></li>  
      </ul>
      <hr>      
    </body>

</html>
  • /view/exampleOne/HelloPage.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
    <head>
    <title>Template : HelloPage</title>
    </head>
    <body>

      <hr>   
      <ul>
         <li><a href="<s:url action='Date'/>">What the date is today ?</a></li> 
         <li><a href="<s:url action='name/Name'/>">What your name ?</a></li>    
      </ul>
      <hr>      
    </body>

</html>
  • /com/exampleOne/action/Today.java
package com.exampleOne.action;

import com.exampleOne.model.HelloToday;

public class Today{
    private String date;

    public String execute(){

        setToday(new HelloToday().getToday());

        return "SUCCESS";
    }

    public void setToday(String date)
    {
        this.date = date;
    }

    public String getToday()
    {
        return date;
    }
}
  • com/exampleOne/model/HelloToday.java
package com.exampleOne.model;

import java.util.Date;

public class HelloToday{
    Date today;

    public HelloToday()
    {
        today = new Date();
    }

    public String getToday()
    {
        return new String("Hello : " + today.toString());
    }
}
  • /view/exampleOne/Today.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>

    <head>
    <title>Date of Today</title>
    </head>

    <body>
        <h5>Today is really a BIG DAY !</h5>
        <h3>Sun <s:property value="today" /> Shining </h3> 
    </body>

</html>
  • /view/exampleOne/Name.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
    <head>
    <title>Example One : NamePage</title>
    </head>
    <body>

      <hr>   
      <ul>
         <li>My name is Ray .</li>  
      </ul>
      <hr>      
    </body>

</html>

四、分析

1.回忆基于MVC模式的原始Servlet应用:

  • 应用请求到来时,容器生成一个请求对象(Request)和一个响应对象(Response);请求对象包含着用户请求的参数,响应对象用来输出视图
  • 容器接着在应用的配置文件(web.xml)中,根据请求发出的动作(.do)寻找对应的控制器(Controller),将这两个对象交给它
  • 控制器实例化模型(Model)类,用它来处理相应的逻辑任务
  • 逻辑单元运算完毕后,控制器接着将渲染响应页面的任务委派至JSP视图(View)

2.原始应用的每个请求都要匹配一个控制器(Servlet),而这个Servlet只是用来选择请求的模型类,再将处理结果交给视图渲染。这就产生了大量重复的无实质功能的工作。

3.Struts2框架采用前端分派器来替代Servlet的工作:

  • 应用请求到来时,根据用户发出的动作(.action),框架在自己的配置文件(struts.xml)中寻找对应的处理类(Action)
  • 处理类的execute()方法返回一个字符串(String)标志,来决定返回哪一个用户视图(Result)

4.利用框架进行网页应用开发,不用再为每个用户请求编写一个Servlet。只需要定义一些动作与结果的匹配,并分别为这些匹配编写类文件和JSP文件。请求到来时匹配处理类的工作交给前端分派器来完成,匹配视图则是根据处理类返回的字符串标志。


五、流程

  1. 应用的默认页面index.html发出HelloPage动作

  2. struts.xml返回/view/HelloPage.jsp视图

  3. 用户在/view/HelloPage.jsp视图上发出exampleOne/HelloPage动作

  4. struts.xml的包含文件deploy.xml返回/view/exampleOne/HelloPage.jsp视图

  5. /view/exampleOne/HelloPage.jsp视图拥有两个动作

  6. Date动作返回view/exampleOne/Today.jsp视图

  7. name/Name动作返回view/exampleOne/Name.jsp视图

猜你喜欢

转载自blog.csdn.net/weixin_42480750/article/details/81747818