最简单的Struts程序

[目标] 

实现一个最简单的Struts程序。程序包括一个输入页和输出页,输入页。 

对于学习程序设计,我们已习惯于从Hello程序开始,实践证明,这是一个最有效的入门方法。下面就着手设计我们的第一个Struts程序----Hello程序。Hello程序的目标是实现从一个输入JSP页面中的输入框输入一个“Hello”单词,在另一个输出JSP页面中显示“Hello”一词。根据Struts框架的要求,这个Hello程序将包含输入JSP文件、输出JSP文件、Action文件、FormAction文件及配置文件。也就是说,这个Hello程序是一个完整的Struts程序,它可直接在Tomact、Resin等服务器上运行。 





[效果] 

输入页面: 


输出页面: 








[背景知识] 

以前使用servlet开发应用系统的人深深感受到在java代码中嵌入大量html代码是一件非常痛苦的事,于是sun推出了JSP,解决了java代码中嵌入html代码的问题。但是很快程序员们就知道,用JSP“在html代码中嵌入大量java代码”跟“在java代码中嵌入大量html代码”是一样的非常痛。JSP是这样,ASP也是这样。于是,Craig R. McClanahan借用MVC的思想,把Java web应用程序的java和html分离开放在不同的文件中,分成了三部分,也就是struts;后来,微软也学会了这种分离方法,但微软懒一些,只分成了两部分,也就是ASP.NET。 

Struts (org.apache.struts)是一个开放源代码的Web应用框架,基于MVC设计模式,使用servlet和JSP API建立,可以用来构建复杂的Web应用。它允许我们分解一个应用程序的商业逻辑、控制逻辑和表现逻辑的代码,使它的重用性和维护性更好。Struts框架是Jakarta工程的一部分,由Apache软件基金会管理。Struts可以从http://jakarta.apache.org/ struts站点下载。 

Struts框架提供以下服务。 

作为MVC结构中的controller的servlet. 

JSP里用于bean管理、HTML和JavaScript生成、模板处理和流程控制的JSP标签库。 

用于国际化消息的框架。国际化你的Web应用,意味着你的Web应用在使用时可以让用户以喜爱的语言显示。这意味着你需要创建一个应用资源文件,包含每种语言的信息。 

一个JDBC的实现来定义数据源和数据库连接池。 

一个通用的的错误和异常处理机制,包括从一个应用程序资源文件读取错误信息。 

XML语法分析。 

文件上载工具。 

注册机制。 

一个基于Struts的应用程序的表示层(view)使用Struts标签库(taglibs)构建。来自客户的请求被传递给叫ActionServlet的servlet,它作为controller.使用了Struts的应用程序,所有需要通过框架的请求都通过ActionServlet传递。这个ActionServlet把数据从请求传递到ActionForm JavaBean。 

ActionForm是代表从一个表单View组件输入数据的JavaBean。这些表单由JSP用Struts html标签库产生。这个beam由 ActionServlet生成,带request参数,它还请求ActionForm来验证用户提交数据的合法性。 

ActionServlet通过定义一组ActionMapping来配置。一个ActionMapping是一个对象,它将请求中的URL映射到由应用程序开发者提供的处理请求的组件。ActionServlet和ActionMapping的配置在XML配置文件中完成。 

专用的应用程序用于处理请求的组件叫Action类。在MVC结构中,它们代表模型。它们可能用于验证用户输入的合法性,假如在信息处理过程中出现了应用程序错误,Action类可以创建一个error对象的实例,然后保存庆HTTP request对象中。如果在Action类中的逻辑成功地被招待类给Controller传递一个ActionForward对象,代表所需的描绘响应的JSP。ActionForward有两种:专门转发给特定的Action类或全局转发(任何一个Action类可以把这些ActionForwards转给Controller)。 







[步骤] 



1、打开Visual Struts开发环境: 

(1)把文件拷贝到本地硬盘的一个目录下,例如 

   F:\JavaWebStudio\ 

(2) 运行BIN目录下的JavaWebStudio.exe文件(同时自动在桌面建立一个快捷方式,第二次启动时,只需点击桌面的快捷方式即可),出现如下启动界面: 


另外,第一次运行JavaWebStudio,会提示是否要自动配置环境变量,建议选择自动配置。 



2、建立一个“空的Struts普通模板”应用程序: 

选择菜单“文件”—“新建”—“新建项目”,弹出新建项目对话框,如图3-1所示: 




在对话框中选择“空的Struts普通用模板”,在项目名称中输入“Simple”,package (包名)和位置(项目的路径)采用默认的值就行,当然也可以根据需要改变。最后点击“确定”按钮完成新项目的建立。 




从文件管理器中可看出Simple项目的文件结构如下: 


Simple 

+------config 

+------lib 

+------src 

+------web 

-------build.xml 

-------hello.prj 

在Simple项目根目录下包含四个子目录和两个文件,这是JSPStudio项目的标准结构,最好不要改变它们默认的名称,否则会出现问题。 



3、利用Struts文件向导建立新的应用: 

在JSPStudio文件管理器内点击鼠标右键,在弹出的菜单中选择“Struts文件向导”进入Struts文件向导对话框,也可以选择菜单“文件”—“新建”—“ Struts文件向导”进入Struts文件向导对话框。如图3-3所示: 




在Struts文件向导对话框JSP文件标签下的文件名输入栏中输入“HellWord”文件名,其它文件采用默认的设置,点击“确定”按钮完成在Struts文件向导。 

刷新JSPStudio文件管理器,这时发现web目录下自动生成了两个文件,分别是HellWord.jsp和HellWord.jsp,前者是输入JSP文件,后者是输出JSP文件;src\emptyprj目录下自动生成了两个文件,分别是HellWord Action.java和HellWord Form.java,前者是Action文件,后者FormAction文件。 






4、编译、启动服务器: 


点击工具条上的编译按钮或选择菜单“生成”—“编译”开始项目的编译。编译过程和结果在输出栏中显示出来,内容如下: 

C:\Documents and Settings\Administrator\桌面>F: 

F:\>cd F:\JavaWebStudio\JavaWebStudioWorkDir\Simple 

F:\JavaWebStudio\JavaWebStudioWorkDir\Simple>ant -buildfile build.xml 

Buildfile: build.xml 

prepare: 

[mkdir] Created dir: F:\JavaWebStudio\jakarta-tomcat-5.0.24\webapps\Simple 

[copy] Copying 2 files to F:\JavaWebStudio\jakarta-tomcat-5.0.24\webapps\Simple 

[mkdir] Created dir: F:\JavaWebStudio\jakarta-tomcat-5.0.24\webapps\Simple\WEB-INF 

[copy] Copying 6 files to F:\JavaWebStudio\jakarta-tomcat-5.0.24\webapps\Simple\WEB-INF 

[mkdir] Created dir: F:\JavaWebStudio\jakarta-tomcat-5.0.24\webapps\Simple\WEB-INF\classes 

[copy] Copying 5 files to F:\JavaWebStudio\jakarta-tomcat-5.0.24\webapps\Simple\WEB-INF\classes 

[mkdir] Created dir: F:\JavaWebStudio\jakarta-tomcat-5.0.24\webapps\Simple\WEB-INF\lib 

[copy] Copying 18 files to F:\JavaWebStudio\jakarta-tomcat-5.0.24\webapps\Simple\WEB-INF\lib 

[mkdir] Created dir: F:\JavaWebStudio\JavaWebStudioWorkDir\wars 

compile: 

[javac] Compiling 3 source files to 

F:\JavaWebStudio\jakarta-tomcat-5.0.24\webapps\Simple\WEB-INF\classes 

dist: 

[jar] Building jar: F:\JavaWebStudio\JavaWebStudioWorkDir\wars\Simple.war 

BUILD SUCCESSFUL 

Total time: 5 seconds 

上述输出表明利用ant 编译build.xml所设置的项目已成功。把编译结果拷贝到tomcat服务器webapps目录下,并生成打包文件Simple.war。 



5、启动服务器: 

点击工具条上的启动服务器按钮或选择菜单“运行”—“ 启动服务器”启动服务器jakarta-tomcat服务器。内容如下: 






6、运行: 

展开文件管理器Simple项目下web目录,可见到HelloWord.jap和HelloWordOut.jsp文件,通过双击打开HelloWord.jap文件,如图所示。编辑窗口分上下两部分,上部分是源程序编辑,下部分是可视化编辑,与Dreamweaver MX编辑窗口相似。




点击工具条上的运行按钮或选择菜单“运行”—“ 运行(web浏览)”这时打开显示出HelloWord.jsp的运行结果。在运行结果页面中的输入框中输入“Hello Word”,点击“提交”按钮,这时转发到HelloWordOut.jsp文件,HelloWordOut.jsp页面中输出“Hello Word”一词。 




生成的源代码如下: 











   










生成的源代码如下: 









Hello Word 







[项目文件结构] 




config目录下包含了所有的配置文件和Struts标签的描述文件,例如web.xml、struts-config.xml、struts-bean.tld、struts-html.tld、struts-logic.tld和struts-template.tld等文件。 

lib包含了Struts库文件和带用其它库文件,例如struts.jar、struts-legacy.jar、commons-lang.jar和xerces.jar等文件。 

src目录下包含了java原文件和资源文件,例如ApplicationResources.properties和ApplicationResources_ch.properties资源文件,前者是英语资源文件,后者是中文资源文件。新建时这个目录里还有一个子目录“emptyprj”,这个名称与建立项目时输入的package名称是一至的。Emptyprj目录下有“filters”、“jdbc”两个子目录,前者是过滤器目录,是中文解决方案,详细分析请看后面的有关滤器程序设计、中文解决方案章节,后者是数据库连接池文件,详细分析请看后面的Struts数据库应用程序设计章节。 

web目录下包含了JSP、Html等web文件和Web文件用到的图片文件。新建时这个目录是空的。 

build.xml文件是编译是所需的配置文件,由于JSPStudio采用的是ANT编译器,所以这个文件是JSPStudio项目中必不可少的,它是ANT标准的配置文件,所有的项目目录结构也符合ANT编译器的要求,可见JSPStudio项目与ANT具有非常好的兼容性,这也是JSPStudio的优点之一。 

hello.prj文件是项目文件,XML结构,内容如下: 

Simple 

struts 



emptyprj 

\Jave Web 项目\空的Struts普通模板 

F:\JavaWebStudio\JavaWebStudioWorkDir\Simple 

标签内是项目名称;标签内是项目的类型,这个标签的内容最好不要改变; 























首先是把本页定义为支持中文显示,中文编码采用GB2312格式,程序语言为Java: 

<%@ page contentType="text/html;charset=GB2312" language="java" %>

接着定义支持四种Struts标签bean、html、logic和template,在该文件中没用到的标签可以去掉相应的定义,如果在文件中还需要用到自定义标签,也需要在这里加入相应的定义: 

<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

<%@ taglib uri="/WEB-INF/struts-template.tld" prefix="template" %>

就不用说了。标签对应HTML的标签,用来设定测览器中文件的绝对路径,然后在文件中只需写下文件的相对位置,在测览器中测览的时候这些位置会自动附在绝对路径后面,成为完整的路径。在文档中所有相对地址形式的URL是相对于这里定义的UTRL而言的。一篇文档中的标记不能多于一个,必须放于标签内,并且应该在任何包含URL地址的语句之前定义。这里用了黑体字,表示是要重点讲解的地方。 











标签定义了一个表单,提交时的目标URL是“/helloAction.do”,方法是“post”,Post方法是将用户在表单中填写的数据包含在表单的主体中,一起传送到服务器上的处理程序中,该万法没有字符的限制,它包含了ISO10646的字符集,是一种邮寄的万式,在测览器的地址栏不显示提交的信息,这种万式传送的数据是没有限制。当然也可以选择Get方法,Get方法是将表单内容附加在URL地址后面,所以对提交信息的长度进行了限制,最多不可以超过8192个字符,如果信息大长,将被截去,从而导致意想不到的结果,而且不能传送非ASCII码的字符。表单内包含一个文本输入框,它的值与Bean中属性为"mybeanvariable1"的变量相对应,如果结mybeanvariable1付了初值,则在启动这个页面时文本框中就显示默认的mybeanvariable1初值。另外表单内还包含了两个最常见的提交按钮和重写按钮。 



4.3.2 输出JSP页面文件 

输出JSP页面文件名是helloOut.jsp,主要实现输入文件提交的文本框的值,文件代码如下: 

<%@ page contentType="text/html;charset=GB2312" language="java" %>

<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>



































输出文件与前面输入文件唯一不同的是把标签变成了标签: 



标签实现Bean属性值的输出,其中name保存Bean名,这里是“helloForm”,从后面的配置文件可以看出,它对应的类是helloForm类;property保存属性名,这里是“mybeanvariable1”,与输入文件的文本框取的属性名一至。 



4.3.3 ActionForm Bean文件 

Hello程序的ActionForm Bean文件实现只包含一个变量的Bean,文件名是helloForm.java,文件代码如下: 

package emptyprj; 

import javax.servlet.http.HttpServletRequest; 

import org.apache.struts.action.ActionError; 

import org.apache.struts.action.ActionErrors; 

import org.apache.struts.action.ActionForm; 

import org.apache.struts.action.ActionMapping; 

public final class HelloWordForm extends ActionForm 



private String mybeanvariable1; 

public String getMybeanvariable1() 



return (this.mybeanvariable1); 



public void setMybeanvariable1(String mybeanvariable1) 



this.mybeanvariable1=mybeanvariable1; 





首先是定义package名: 

package emptyprj; 

这是选用了JSPStudio默认的package名emptyprj,需注意的是package名要与目录名对应。接着引入了ActionForm Bean设计中常用的五个类HttpServletRequest、ActionError、ActionErrors、ActionForm和ActionMapping,这是JSPStudio自动加入的,实际上helloForm类只用于ActionForm类,其它部分可以删除,但这里保留它以方便以后扩展程序时用。 

import javax.servlet.http.HttpServletRequest; 

import org.apache.struts.action.ActionError; 

import org.apache.struts.action.ActionErrors; 

import org.apache.struts.action.ActionForm; 

import org.apache.struts.action.ActionMapping; 

接下来就是定义了helloForm、一个参数mybeanvariable1和它对应的get()、set()函数,这与普通Bean定义的方法一模一样。 



4.3.4 Action文件 

Hello程序的Action文件实现对输入文件提交的表单的处理,文件名是helloAction.java,文件代码如下: 

package emptyprj; 

import java.lang.reflect.InvocationTargetException; 

import java.util.Locale; 

import javax.servlet.ServletException; 

import javax.servlet.http.HttpSession; 

import javax.servlet.http.HttpServletRequest; 

import javax.servlet.http.HttpServletResponse; 

import org.apache.commons.beanutils.PropertyUtils; 

import org.apache.commons.logging.Log; 

import org.apache.commons.logging.LogFactory; 

import org.apache.struts.action.Action; 

import org.apache.struts.action.ActionError; 

import org.apache.struts.action.ActionErrors; 

import org.apache.struts.action.ActionForm; 

import org.apache.struts.action.ActionForward; 

import org.apache.struts.action.ActionMapping; 

import org.apache.struts.action.ActionServlet; 

import org.apache.struts.util.ModuleException; 

import org.apache.struts.util.MessageResources; 



public final class HelloWordAction extends Action 



// 变量定义: 

private Log log = LogFactory.getLog("org.apache.struts.webapp.Example"); 

//函数定义: 

public ActionForward execute(ActionMapping mapping, 

ActionForm form, 

HttpServletRequest request, 

HttpServletResponse response) 

throws Exception 



// Extract attributes and parameters we will need 

Locale locale = getLocale(request); 

MessageResources messages = getResources(request); 

HttpSession session = request.getSession(); 

HelloWordForm myform = (HelloWordForm) form; 

String variable1= myform.getMybeanvariable1(); 

try 



if(variable1.trim().equals("")) 



return new ActionForward(mapping.getInput()); 



//其它代码 

return (mapping.findForward("success")); 



catch (Exception e) 



//log.error("出错", e); 

//log.trace("出错"); 

throw new RuntimeException(e.getMessage()); 







首先定义处理函数execute(),可以理解为当Hello输入文件表单提交到服务器的ActionServlet,由ActionServlet调用Action的execute()函数实现商业逻辑处理,处理完成后把结果转发到输出文件中。execute()函数定义一个helloForm实例“myform”,并从提交的输入ActionForm对象实例form中读取数据,把mybeanvariable1变量的值赋给新的字符串变量variable1: 

helloForm myform = (helloForm) form; 

String variable1= myform.getMybeanvariable1(); 

接下来是出错处理,try语句用于组合一个引起异常的代码块,它使我们告诉Java要注意有可能出现异常的代码段;catch:一旦掷出一个异常,需要捕获住这个异常,catch语句使程序员定义一个捕获;finally:在try/catch块结尾,程序可能需要确保一个代码块不管是否掷出了异常,总是被执行,例如不管发生什么,我们可能都需要确保关闭特定的文件; Exceptlon:一种用于存放在代码中发现的关于一个"exception"或"error"的信息的类;throws:当某些事需要关注时,我们"掷出"一个异常。这个异常被我们创建的一段处理异常的特殊代码"抓住"。涣句话说,通过掷出一个异常,我们告诉代码:出错啦,需要调用一些特殊的逻辑去处理问题。下面完它的完整结束: 

try 



//正常代码 



catch (Exception e) 



//出错处理代码 

throw new RuntimeException(e.getMessage()); 



finally 



//最后都必需进行的处理代码 





在try块中我们进行的变量variable1是否为空的判断,如果为空就转发到输入页,否则转发到定义为success的输出页: 

if(variable1.trim().equals("")) 



return new ActionForward(mapping.getInput()); 



//其它代码 

return (mapping.findForward("success")); 

mapping.getInput()函数用于获取输入页的URL值,这个值与配置文件struts-config.xml中项的input属性值相对应。 



4.3.5 Struts程序配置 




"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN" 

"http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd"> 





<form-bean name="HelloWordForm"

type="emptyprj.HelloWordForm" /> 





<action path="/HelloWordAction"

type="emptyprj.HelloWordAction" 
name="HelloWordForm" 

scope="session" 

input="/HelloWord.jsp"> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值