【Jsp精品源码栏目提醒】:网学会员,鉴于大家对Jsp精品源码十分关注,论文会员在此为大家搜集整理了“JSP教程_JSP+Struts开发实例 - 其它资料”一文,供大家参考学习!
第 24 章
JSP+Struts开发实例 本章将使用 Struts 实现一个用户登录系统实例。
通过该实例的讲解,可以让读者更加轻松地掌握Struts 知识。
本章要点包括以下内容: 创建一个 Struts 项目 Struts 项目的具体开发过程 Struts-config.xml 详细配置方法 资源文件的使用 24.1 创建Struts项目 本章节实现的用户登录系统比较简单,但是从该实例可以体会和领悟到 Struts 的原理和使用过程。
选择用户登录应用作为实例有如下几个理由: 用户登录基本上是所有系统所必需的。
登录系统的好处直接决定着整个系统的安全性能。
通过 登录系统可以区分用户权利等级,所以登录系统对整个系统来说是非常重要的。
用户登录应用对大部分读者来说更加常见和熟悉,容易被读者理解。
用户登录应用很有代表性。
对
JSP 和数据库的操作和应用都比较全面,所以可以通过这个例子 很好的对
JSP 学习。
24.1.1 构建一个J2EE项目 首先使用 Eclipse+Lomboz 构架一个名为 MyLogin 的 J2EE 项目,Web 模块名为 Login。
然后按照第二十三章中所介绍的步骤来安装和配置 Struts。
该实例需要创建的
JSP 文件如下所示: index.
jsp:该系统的主页面,提供“登录”以及“注销”链接,并提示用户是否处于登录状态 的信息。
logon.
jsp:用户登录页面,填写用户名、密码和验证码后进行身份验证。
另外,需要创建的 Form 和 Action 类文件如下: 一个名为 LoginForm 的 ActionForm 类:接收客户输入的数据,并进行初步的数据合理性校验。
一个名为 LoginAction 的 Action 类:进行用户身份的校验,根据结果返回 ActionForward 类。
一个名为 LogoutAction 的 Action 类:进行用户注销操作。
还 需 要 创 建 一 个 名 为 Constants.java 类 的 静 态 类 , 用 来 保 存 系 统 中 一 些 常 量 。
资 源 文 件MessageResources.properties 用来保存一些提示信息。
最后一步是进行 Struts-config.xml 文件的配置,该配置文件放置在 Web 模块的 WEB-INF 目录下。
接下来一步步实现该用户登录系统。
第 18 章 常用插件扩展点 39124.1.2 引用JavaBean类 本章直接将第 14 章创建的 User.java 接口类、AbstractUser.java 抽象类以及 SqlUser.java 类复制到本 将章创建的 MyLogin 项目的 cn.login.model 包中; Factory.java 接口类、SqlFactory.java 类复制到 MyLogin项目的 cn.login.model 包中;将 DBConnect.java 数据库操作类复制到 MyLogin 项目的 cn.login.db 包中;另外,将 MD5.java 类也复制到 cn.login.model 包中。
注意:复制完这些类之后,由于这些类所在包名都变了,所以一定要修改各个类的包名。
24.1.3 Struts项目开发步骤 由于 Struts 是建立在 MVC 设计模式上的框架,所以可以遵从标准的开发步骤来开发这里的用户注册系统实例,具体的步骤如下: (1)定义并生成所有代表应用程序的用户接口 Views,同时生成这些 Views 所用到的所有ActionForms,并将它们添加到 struts-config.xml 文件中。
(2)在 ApplicationResource.properties 文件中添加必要的 MessageResource 项目。
(3)生成应用程序的控制器。
(4)在 struts-config.xml 文件中定义 View 与 Controller 的关系。
(5)生成应用程序所需要的 model 组件。
(6)编译、运行应用程序。
24.2 Struts开发 接下来创建该实例中用于显示的
JSP 文件和进行逻辑处理的 ActionForm 和 Action 类文件。
24.2.1 创建登录首页index.
jsp页面 在 Login 模块的根目录下创建一个 index.
jsp 文件,该页面主要提供“登录”和“注销”链接,并提示用户登录状态。
读者从该页面中主要学习如何使用 Struts 提供的标签。
在下面源代码中,Struts 标签的部分已经使用黑体形式显示出来: lt page contentTypequottext/html charsetGBKquot gt lt taglib uriquot/tags/struts-beanquot prefixquotbeanquot gt lt taglib uriquot/tags/struts-htmlquot prefixquothtmlquot gt lt taglib uriquot/tags/struts-logicquot prefixquotlogicquot gt lthtmlgt ltheadgt lthtml:base/gt ltlink relquotstylesheetquot hrefquotinclude/CSS.CSSquot typequottext/cssquotgt lttitlegt首页lt/titlegt lt/headgt ltbody backgroundquotimages/bg.gifquotgt ltlogic:present namequotuserquotgt lth4gt欢迎 ltbean:write namequotuserquot/gtlt/h4gt lt/logic:presentgt392 Eclipse 从入门到精通 ltlogic:notPresent scopequotsessionquot namequotuserquotgt lth4gt您还未登录lt/h4gt lt/logic:notPresentgt lthtml:errors/gt lttable widthquot70quot borderquot0quot cellspacingquot0quot cellpaddingquot0quot alignquotcenterquotgt lttrgt lttd colspanquot2quot alignquotcenterquotgtampnbsplth3gtWelcome to E-Shoppinglt/h3gtlt/tdgt lt/trgt lttrgt lttd widthquot40quotgtampnbsplt/tdgt lttdgtampnbsplthtml:link forwardquotloginquotgt登录lt/html:linkgtlt/tdgt lt/trgt lttrgt lttdgtampnbsplt/tdgt lttdgtampnbsp ltlogic:present namequotuserquotgt lthtml:link forwardquotlogoutquotgt注销lt/html:linkgt lt/logic:presentgt lt/tdgt lt/trgt lttrgt lttdgtampnbsplt/tdgt lttdgtampnbsplt/tdgt lt/trgt lt/tablegt lt/bodygt lt/htmlgt 程序说明: (1)首先来看lt taglib uri”/tags/struts-html” prefix”html” gt,它是对使用到的 Struts 标签进行声明。
Struts 共有五类标签(上一章中已经介绍,在 MyLogin 项目中安装 Struts 时,需要将这五个 tld文件复制到 Login/WEB-INF/tlds 目录中,每一个 tld 文件对应一个标签库),本页总共使用到了三种标签。
看这个声明中的各个属性意思: uir 属性值对应于在 web.xml 文件中标签配置的lttaglib-urigt子项。
prefix 属性值定义了此类标签的一个标记名,例如lthtml:text property”username” /gt中的 html 就 是使用的这个标记名,而且必须相同于 prefix 指定的标记名,不然容器无法识别此类标签。
(2)lthtml:base/gt产生一个标准的 HTML base 标记,以便对外在文件引用要相对于这个
JSP 页面存放的目录位置。
该标签是一个没有属性和体的单独标签。
例如引用外在文件ltlink relquotstylesheetquot hrefquotinclude/CSS.CSSquot typequottext/cssquotgt语句,如果存在一个名为 admin.
jsp 文件是创建在 admin 目录下,而 CSS.CSS 文件是在上一目录下的 include 文件夹中。
根据以往
JSP 开发经验,这里引用地址应该是“../include/CSS.CSS”,其实不然,这是由于 struts 在对所有文件引用时都是从根目录开始, 除非在头部加上了lthtml:base/gt标签, 它表示所有文件引用从本页面文件的目录开始,这时引用地址才是“../include/CSS.CSS”。
这一点读者要非常主要,不然系统会找不到文件。
(3)ltlogic:presentgt…lt/logic:presentgt标签的使用,使得开发人员感觉到会话好像是内建在 HTTP里面一样,Struts 标签和 Servlet 容器一起自动维护了会话。
在本页面中,如果用户 user 登录,将使用一个专门的欢迎信息,并且提供“注销”链接。
第 18 章 常用插件扩展点 393ltlogic:notPresentgt…lt/logic:notPresentgt标签使用方法类似,它表示用户 user 未登录时,所要做的任务。
所有的 Struts 逻辑(logic)标签都使用了“this”和“notThis”的格式。
(4)lthtml:errors/gt标签用来显示出所有可能发生的错误信息,如果没有错误信息,标签则什么都不输出,就像从页面消失一样。
例如,用户名不存在或者密码输入错误的时候,Action 类会把相应的所有错误通过 ActionServlet 返回给这个页面,并在lthtml:errors/gt处显示出来。
在这个标签中还可以指定一个属性,例如,lthtml:errors property”username”/gt和前面lthtml:errors/gt一样,都是用来显示错误信息的,但是它只是显示一个关键字为 username 的这条错误信息。
这是因为Struts 的错误信息是一条条地被保存起来的,每一条错误信息都对应一个关键字,请看 LoginAction 类代码。
(5)lthtml:link forward”login”gt登录lt/html:linkgt给“登录”提供一个链接,login 作为关键字来查询 struts-config.xml 配置文件,并递交给下一步处理。
这里不一定直接转到下一个页面,也有可能通过struts-config.xml 配置文件而转移到一个 Action 类进行处理,ActionServlet 控制器再通过 Action 返回的ActionForward 转移到某个页面。
如果想改变这个链接,只需要在配置文件里面进行修改就行了。
这样使得页面转换可以集中在struts-config.xml 配置文件进行集中管理。
当和ltlogic:presentgt结合使用时,表示仅当该用户已经登录时才显示这个链接。
24.2.2 创建用户登录login.
jsp页面 创建的 logon.
jsp 页面负责向用户提供登录窗口,用户输入用户名、密码以及验证码后进行表单提交,然后由 ActionMapping 转交给后台 Form 和 Action 进行相应处理。
该创建的
JSP 文件也放置在 Login 模块的根目录下,具体代码如下: lt page contentTypequottext/html charsetGBKquot gt lt taglib uriquot/tags/struts-htmlquot prefixquothtmlquot gt lthtmlgt ltheadgt ltMETA HTTP-EQUIVquotPragmaquot CONTENTquotno-cachequotgt ltMETA HTTP-EQUIVquotCache-Controlquot CONTENTquotno-cachequotgt ltMETA HTTP-EQUIVquotExpiresquot CONTENTquot0quotgt ltlink relquotstylesheetquot hrefquotinclude/CSS.CSSquot typequottext/cssquotgt lttitlegt用户登录lt/titlegt lt/headgt ltfont colorquotFF0000quotgt lthtml:errors propertyquotusernamequot/gtltbrgt lthtml:errors propertyquotpasswordquot/gtltbrgt lthtml:errors propertyquotchkmaquot/gtltbrgt lt/fontgt ltcentergt ltbody backgroundquotimages/bg.gifquotgt lthtml:form actionquot/loginActionquot focusquotusernamequotgt lttable widthquot170quot borderquot0quot cellspacingquot0quot cellpaddingquot0quotgt lttrgt lttdgtltimg srcquotimages/userlogin.gifquot borderquot0quotgtlt/tdgt lt/trgt lt/tablegt394 Eclipse 从入门到精通 lttable widthquot170quot bgcolorquotD2E8FFquot stylequotborder-bottom:1px solid 0079CE border-left:1px solid 0079CE border-right:1px solid 0079CE quotgt lttrgtlttd heightquot5quotgtlt/tdgtlt/trgt lttrgtlttdgtltimg srcquotimages/username2.gifquotgtlt/tdgtlttdgt lthtml:text propertyquotusernamequot sizequot15quot/gt lt/tdgtlt/trgt lttrgtlttd widthquot56quotgtltimg srcquotimages/userps2.gifquotgtlt/tdgtlttd widthquot113quotgt lthtml:password propertyquotpasswordquot sizequot15quot/gt lt/tdgtlt/trgt lttrgtlttd widthquot56quotgtltimg srcquotimages/userym2.gifquotgtlt/tdgtlttd widthquot113quotgt lthtml:text propertyquotchkmaquot sizequot5quot/gtampnbsp ltimg border1 srcquotcreateMa.jspquotgt lt/tdgtlt/trgt lttrgt lttd alignquotcenterquot colspanquot2quot heightquot30quotgt lthtml:submit valuequot登录quotgtlt/html:submitgtampnbsp lthtml:reset valuequot重置quotgtlt/html:resetgt lt/tdgtlt/trgt lttrgtlttd colspanquot2quot alignquotrightquotgtlt/tdgtlt/trgt lt/tablegt lt/html:formgt lt/centergt lt/bodygt lt/htmlgt 程序说明: (1)此处的lthtml:errors/gt标签中添加了 property 属性,表示不是所有的错误都显示,只是显示关键字指定的错误,请查看 LoginForm 或者 LoginAction 类中对错误信息的存储方式。
如图 24.1 所示显示的错误提示。
图 24.1 错误提示 (2)lthtml:form action”/loginAction” focuse”username”gt标签生成一个 HTML 表单供数据输入,并提交。
它也产生了一个简单的 JavaScript 来将光标停止在“username”输入域上。
Action 属性是对配置文件中的 ActionMapping 的引用。
它告诉表单哪个 JavaBean helper 类将用 来组装这个 HTML 控件。
JavaBean helper 是基于 Struts 框架类 ActionForm。
第 18 章 常用插件扩展点 395 Focuse 属性定义的是表单默认的焦点位置,其中 username 属性值对应用户名文本矿的 property 属性值。
(3)lthtml:textgt标签定义创建一个 HTML 输入控件来供文本域输入。
lthtml:passwordgt用于输入密码,类似于lthtml:textgt标签,只是它显示文本为而不是输入的字符。
这里也是使用相应的 ActionForm中的 username、password 和 chkma 属性来组装这个页面中的输入域的,见 LoginForm 类源代码。
如果表单被返回校验,缺省的情况下,username、password 和 chkma 输入域会重显示先前的值,而不用重新输入。
除非你把 redisplay 属性设置为 false。
(4)lthtml:submitgt和lthtml:resetgt标签创建了 HTML 标准的 submit 和 reset 按钮。
并可以通过 value属性设置,指定按钮上显示的名称,例如,lthtml:submit value”登录”/gt。
当表单提交时, 将涉及到两个框架对象: ActionForm(描述 HTML form 所需的属性, 例如,username、password 和 chkma)和 Action(处理提交的表单),见下面的 LoginForm 和 LoginAction 的源代码。
这两个对象必须由开发人员创建并包含应用细节。
然后 ActionServlet 并使用 struts-config.xml 配置文件来决定使用哪个 ActionForm 和 Action 类,见配置的 struts-config.xml 文件。
24.2.3 创建LoginForm.java类 当在 login.
jsp 页面提交登录信息之后,ActionServlet 控制器会自动根据 struts-config.xml 文件中的配置信息,将 login.
jsp 表单中的属性值提交给一个 ActionForm 类进行数据的封装。
下面即创建这个名为LoginForm 的 ActionForm 类,代码如下: package cn.login 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 class LoginForm extends ActionForm //由于继承了序列化接口,所以存在一个静态的常量 private static final long serialVersionUID 1L private String username null //用户名 private String password null //用户密码 private String chkma null //验证码 public void setUsernameString username //对应属性的 set 方法 this.username username public String getUsername //对应属性的 get 方法 return username public void setPasswordString password this.password password public String getPassword return password public void setChkmaString chkma396 Eclipse 从入门到精通 this.chkma chkma public String getChkma return chkma //对即将封装的数据进行初步的检验 public ActionErrors validateActionMapping mappingHttpServletRequest request ActionErrors errors new ActionErrors ifusernamenullusername.lengthlt1 //用户名不能为空或者 NULL ActionError error new ActionErrorquoterror.username.requiredquot errors.addConstants.USERNAMEerror ifpasswordnullpassword.lengthlt6 //密码不能为 NULL 或者小余六位 ActionError error new ActionErrorquoterror.password.requiredquot errors.addConstants.PASSWORDerror ifchkmanullchkma.length4 //验证不能为空,而且必须是 4 位 ActionError error new ActionErrorquoterror.chkma.requiredquot errors.addConstants.CHKMAerror return errors 程序说明: (1)这个 LoginForm 类必须继承 Struts 框架中的 ActionForm 类。
(2)这里的 serialVersionUID 变量定义了一个 long 型常量。
当不加这一行代码,Eclipse 编译器会出现一个警告信息,这是因为父类 ActionForm 实现了 Java 的序列化接口,序列化类要求应该有这么一个常量。
(3)在这个类中并定义了三个属性变量:username、password 和 chkma,这对应着 login.
jsp 页面的中的 HTML form 表单中的属性。
对应着这三个属性,并定义了各自的 setXxxx和 geXxxx方,这里的Xxxx 代表类中定义的属性变量,但是首字母必须大写。
(4) loginForm 重实现了 ActionForm 类中的 validate方法,ActinForm 类还包含另外一个标准方法:reset方法。
当使用 ActionForm 作为向导工作流的一部分时,reset 方法非常有用。
如果 mapping 设置为请求范围,这个方法就没有必要实现。
validate 方法经常只是用于主要的外观校验, 即它仅仅检查数据 “看起来” 正确,返回一个 ActionErrors对象。
(5)ActionError 对象保存单个错误信息,ActionErrors 对象保存一系列 ActionErrror 对象,并且给每个 ActionError 对象指定一个关键字。
Struts 框架会自动把返回的 ActionErrors 对象中的错误信息显示在页面中lthtml:errors/gt标注的地方。
(6)本类中的 validate方法定义了用户名不能为空、密码不能少于六位以及验证码必须是四位。
(7)这里的“error.username.required”语句是资源文件 MessageResources.properties 中相对应的字 第 18 章 常用插件扩展点 397符串“用户名不能为空”的一个键值,“error.password.required”和“error.chkma.required”相类似。
把页面上的所有提示语句都写入到资源文件中,这样有利于编码的国际化,当需要汉化一个英文版应用系统时,只需要把对应的资源文件翻译成中文即可。
后面对资源文件 MessageResources.properties的使用和编写作了详细介绍(在前面的第十五章和第十七章标准标签库对国际化问题有重点讲解)。
有读者可能会疑惑,资源文件是放置在 LoginWEB-INFclassescnlogin 目录下,而这个类仅仅通过“ error.username.required ” 键 值 怎 么 能 找 到 相 对 应 的 “ 用 户 名 不 能 为 空 ” 字 符 串 。
这 是 因 为 在struts-config.xml 文件(详细请看后面小节对配置文件的介绍)中已经配置了代码:ltmessage-resourcesparameterquotcn.login.MessageResourcesquot /gt。
(8)Constants.USERNAME 其实就是调用了 Constants 类中的静态属性 USERNAME,它对应属性值为“username”,其他 Constants.PASSWORD 和 Constants.CHKMA 相类似。
详细请看 Constants 类的讲解。
(7)LoginForm 类和之前章节中创建的 User 以及实现类 SqlUser 存在很多相似,但是并不应该使用 LoginForm 类取代 Us.