简介:基于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文件。请求到来时匹配处理类的工作交给前端分派器来完成,匹配视图则是根据处理类返回的字符串标志。
五、流程
应用的默认页面
index.html
发出HelloPage
动作struts.xml
返回/view/HelloPage.jsp
视图用户在
/view/HelloPage.jsp
视图上发出exampleOne/HelloPage
动作struts.xml
的包含文件deploy.xml
返回/view/exampleOne/HelloPage.jsp
视图/view/exampleOne/HelloPage.jsp
视图拥有两个动作Date
动作返回view/exampleOne/Today.jsp
视图name/Name
动作返回view/exampleOne/Name.jsp
视图