java

位置:IT落伍者 >> java >> 浏览文章

用Struts框架开发Java应用


发布日期:2018年10月26日
 
用Struts框架开发Java应用

Struts开始于是采用Java Servlet/JavaServer Pages技术开发Web应用程序的开放源码的框架当前最新的正式版本是本文内容就是针对这个版本的采用Struts能开发出基于MVC(ModelViewController)设计模式的Java Web前端应用通常MVC设计模式把一个系统划分为相互协作的三个部分

Model(模型)模型用于封装系统的状态比如业务数据

View(视图)视图是模型的表示提供用户交互界面当模型状态发生变化时视图应该得到通知以便更新模型的变化

Controller(控制器)接受来自视图的请求修改模型的状态

但是在基于JSP/Servlet的Web应用中要使用MVC模式需要解决这样一个问题就是HTTP的底层是TCP/IP协议而TCP/IP是一种无状态连接的协议如果我们的模型发生了变化就无从通知视图而Struts采用了在JSP规范v中就提出的MVC Model 这是对MVC在Web上应用的修订版它可以解决这个问题见图

MVC Model(FromMalcolm Davis)

Sturts工作机理(From Malcolm Davis)

Struts应用有个主要部件一个是使用Servlet实现的中心控制器(Controller Servlet由Struts提供的orgapacheaction ActionServlet类实现)及负责具体业务逻辑处理的Action(orgapacheactionAction的子类)一个是用于显示的JSP页面(viewer)另一个是用于封装系统状态的业务逻辑元件(Model)Struts 的中心控制器接受所有来自客户端的请求并根据系统的配置(strutsconfigxml)路由HTTP请求到其它Action对象(开发者实现的orgapachestruts actionAction的子类)在这些Action对象中会完成所有的业务操作比如插入一条订单修改一条记录等处理完毕由Struts的Controller Servlet根据配置转向到适当的JSP页面将处理结果显示给用户从这里可以看出在Struts中Controller Servlet担任了重要的角色它控制所有的程序流转使MVC三个相对独立的部分协调工作从而使系统的功能更加完善从图可见Struts是MVC Model 的一个典型应用

安装

你可以从struts/release/下载Struts最新的二进制版本和源码首先进入v下载页面下载jakartastrutszip(MB)然后将jakartastrutszip解压其中包含lib和webapps两个子目录lib子目录中是使用Struts需要的Jar文件标签库定义文件(tld)以及对一个Struts Web应用的webxml和strutsconfigxml配置文件的DTD定义(dtd)webapps子目录中包含了几个Struts的示例应用都已打包为war格式这里主要介绍其中三个

strutsexamplewar一个采用Struts框架的简单的示例程序Controller

strutsdocumentationwarStruts文档的war包

strutsblankwar一个空白的Struts的应用可以方便地修改并且配置自己的应用

下面运行strutsexample这个示例程序因为Struts是一个Web应用所以要运行这个示例需要一个兼容Servlet JSP 以上规范的Web容器本文以Tomcat a(对Tomcat 也适用)为例进行介绍首先保证Tomcat可以正常运行而运行struts example不需要其它特殊配置的只要把strutsexamplewar拷入Tomcat下的webapps目录Tomcat在启动时就会自动解压了然后启动Tomcat在浏览器中输//localhost:/strutsexample如果能看到如图页面就说明已经运行成功

在图中你可以点击Register with the MailReader Demonstration Application注册一个MailReader用户或直接点击Log on to the MailReader Demonstration Application输入用户名和密码(示例程序已经预置了一个用户user/pass配置在strutsexample下的WEBINF\databasexml文件中)登入

分析

webxml

在图所示的页面中点击Log on to the MailReader Demonstration Application链接进入/logonjsp页面输入预定义的用户名为user密码为pass然后提交就进入了图的用户主页面

struts example主页面

用户主页面

大家可能已经注意到了这里的URL的后缀是do那么它有什么意义?服务器又是怎样处理这样的请求呢?下面我们看看{TOMCAT}\WEBINF\webxml文件就会非常清楚在webxml中你可以找到如下配置片断

action

*do

从上面配置代码中可以知道do结尾的请求URL是由一个名为action的Servlet处理实际上可以为应用取另一个后缀只要修改就行了但下面所有的讨论都以do为例我们再看一下这个Servlet的配置

action

orgapachestrutsactionActionServlet

application

orgapachestrutswebappexampleApplicationResources

config

/WEBINF/strutsconfigxml

……

由此可见action对应的类是orgapachestrutsactionActionServlet这是一个Struts提供的处于中心控制地位的Servlet即图中的Controller Servlet正是用它监听所有的来自于用户的以do为后缀的请求在上面的配置中为ActionServlet配置了一个名为config的初始化参数值为 /WEBINF/strutsconfigxmlstrutsconfigxml是一个基于Struts应用的最重要的配置文件其中包含了所有的Action请求(指以do结尾的请求)相应的Action处理类Form Bean以及页面的转向等信息的配置strutsconfigxml在应用启动时读入然后根据这些配置进行响应下面以示例程序中的LogonAction的配置为例对strutsconfigxml进行分析

strutsconfigxml

下面是strutsconfigxml中对LogonAction进行配置的部分代码

path=/logon

type=orgapachestrutswebappexampleLogonAction

name=logonForm

scope=request

input=/logonjsp>

从上面可以看出MailReader应用中对/logondo的请求是由orgapachestrutswebappexample LogonAction类进行处理的name属性指定的是这个请求对应的表单

logonForm也是在strutsconfigxml中配置的配置代码为:

beanname=logonForm type=orgapachestrutswebapp exampleLogonForm/>

LogonForm类是一个普通的JavaBean其中定义了几个属性及属性的读写方法而且这些属性的名字要和页面表单中的输入域对应比如LogonForm中定义了两个属性代码如下

private String username = null;

private String password = null;

这两个属性分别对应于logonjsp表单中的两个输入域代码如下

/logon focus=username>

username />

password redisplay=false/>

注意LogonForm中的属性名一定要和logonjsp中的表单域名完全对应起来Struts就是由此从浏览器端抓取提交的数据并填充到LogonForm对象中再传送给LogonAction类进行处理的Struts实现的表单验证和重填技术也是这样实现的注意在上面的页面代码中我们使用了Struts的HTML定制标签库也可以直接使用类似text name=username />的HTML代码但这样就失去了自动回填的支持

Action

现在我们已经对Struts前端应用框架的整体结构数据流转有了一定的认识也知道了Struts是怎样从配置文件中获取配置信息的即先启动然后等待请求再从前台抓取数据根据配置信息调用(或生成)Action类进行处理最后根据处理的结果转向到对应的页面响应用户那么现在就让我们看看LogonAction是怎样进行业务处理并将处理结果显示给用户的代码如下

package orgapachestrutswebappexample;

import orgapachestrutsactionAction;

public final class LogonAction extends Action {

public ActionForward perform(ActionMapping mapping

ActionForm form

HttpServletRequest request

HttpServletResponse response)

throws IOException ServletException {

ActionErrors errors = new ActionErrors();

String username = ((LogonForm) form)getUsername();

String password = ((LogonForm) form)getPassword();

// 进行用户验证

// 如果不存在此用户或密码错误则将错误添加到errors中

上一篇:Eclipse 4.3 输入等号和空格禁止自动上屏补丁

下一篇:Spring2.5注释驱动与基于注释的MVC