版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
17.17.27.37.47.57.67.7Struts工作原理用户登录界面和MVC模块划分用户登录Model层实现用户登录View层的实现用户登录Controller层的实现Struts相关的配置文件用Struts实现主页显示第7章–用Struts实现宠物商城的登录功能2学习目标通过本章的学习,你可以:了解Struts1工作原理掌握如何使用Struts1框架完成任务737.1
Struts工作原理MVC设计模式Struts简介Struts的运行流程Struts开发环境配置47.1.1 MVC设计模式Struts是当前应用最广泛的Javaweb应用开发框架,已经成为MVC框架的事实标准MVC是一种设计模式,它把系统分为3个模块:模型(Model):如业务模型、数据模型等,通常体现为JavaBean的形式视图(View):提供可交互的用户界面,向用户显示数据模型。对应的组件是JSP或HTML文件控制器(Controller):响应用户的请求,根据用户的请求来操作模型,并把响应结果经由视图展现给用户,如
Struts的Action采用MVC模式,由于各部分相对独立,便于分工开发、维护,并提高了重用性57.1.2 Struts简介处理一个请求,Struts有对应的三个部分Model:ActionForm和JavaBean,ActionForm用于封装用户请求参数(可以通过调用其方法得到请求参数值)
,而JavaBean则封装了底层的业务逻辑,包括数据库访问等View:JSP,Struts提供了标签库,象JSTL一样减少JSP页面中的Java代码(你可选择JSTL也可选择Struts标签)67.1.2 Struts简介(续)Controller:包括系统核心控制器ActionServlet和业务逻辑控制器ActionActionServlet由Struts框架提供,继承HttpServlet类,负责拦截所有HTTP请求,然后根据用户请求决定是否需要调用Action,如果需要调用业务逻辑控制器,则将请求转发给Action处理,否则直接转向请求的JSP页面。ActionServlet由Struts开发包提供,不需要程序员开发,但是需要在web.xml中进行配置Action负责处理用户请求,通常Action需要调用Model来完成处理。Action需要程序员开发Struts核心配置文件:通过核心配置文件Struts-config.xml
将MVC组成一个整体77.1.3 Struts的运行流程Web应用都是请求一响应的程序结构。程序是由客户端Client发出HTTP请求开始的,客户端请求被ActionServlet拦截。请求有两种情况:要求逻辑控制器处理的请求简单转发的请求87.1.3 Struts的运行流程(续)要求逻辑控制器处理的请求:对于此类请求,ActionServlet需要调用对应的Action。ActionServlet将请求转发到Action,如果请求还配置了对应的FormBean(在Struts-config.xml中配置),则ActionServlet还负责用请求参数填充ActionForm
。Action将从
ActionForm中获得请求参数。Action获得请求参数后,调用Model对象由JavaBean处理用户请求。Action处理完用户请求之后,将处理结果包装成ActionForward,回送给ActionServlet97.1.3 Struts的运行流程(续)最常见的情况是,经过Action的处理,JSP页面在显示之前,已经将显示需要的信息保存到一个Javabean中,通常是scope为session或request的Java
bean,可以使用EL表达式、JSTL或者Struts的标签库显示107.1.3 Struts的运行流程(续)简单转发的请求:对于此类请求,HTTP请求无须Action处理,直接转向相关页面117.1.4
Struts开发环境配置Eclipse需要自己下载安装和配置,见教材MyEclipse中已经集成Struts,只需要配置,见教材127.2
用户登录界面和MVC模块划分用户登录的界面及流程用Struts实现用户登录的要点用户登录的实现思路137.2.1
用户登录的界面及流程通过界面了解需求–
用户登录界面147.2.1
用户登录的界面及流程(续)–
登录成功界面157.2.1
用户登录的界面及流程(续)–
登录失败界面167.2.2
用Struts实现用户登录的要点用户登录采用Struts框架实现,Struts框架使用不复杂,只需要一个适应过程,重点掌握:Struts的控制层新技术:Struts的Action类。处理用户的请求,在转向视图层组件(如JSP页面)前自动执行,可分担JSP的业务处理和流程控制,使JSP只单纯地负责显示。登录这里主要是是定义一个Action,对用户进行身份验证并根据结果转向登录成功和登录失败页面;定义一个Action对退出进行处理并转向主页面。Struts的视图层新技术:主要是Struts的标签库,同JSTL类似,功能类似,所以用户可以根据自己的喜好和习惯选择Struts标签或JSTL。177.2.2
用Struts实现用户登录的要点(续)Struts的模型层新技术:Struts的ActionForm类,就是一个特殊的JavaBean。前面介绍过ActionForm可以封装表单或请求参数的数据,为后续处理提供数据。登录这里就是定义一个
ActionForm,对应登录界面的表单域定义相关同名属性和对应
getter/setter。struts-config.xml:Struts的核心配置文件,在这里配置定义的
Action和ActionForm,将独立的MVC三层连成一体。web.xml:在其中配置ActionServlet、Struts的核心配置文件和
Struts的标签库(高版本的Struts将标签库实现文件和描述文件都集中到jar包中,可以不用在web.xml中配置),使得MVC各模块能在web服务器中生效。187.2.3
用户登录的实现思路使用Struts实现web应用程序最关键的是要设计好模型层(Model)、视图层(View)组件和控制层(Controller)组件之间的关系,然后按照这样的设计实现相关组件并配置好struts-config.xml文件197.2.3
用户登录的实现思路(续)Model层:主要是对保存在数据库中的用户信息进行处理在数据库中创建表account
,保存用户信息创建对应POJO类Account创建表account与类Account的hibernate映射文件Account.hbm.xml创建访问数据库的DAO类AccountDAO创建封装用户录入数据的AccountForm207.2.3
用户登录的实现思路(续)View层:主要是显示的几个页面登录录入页面登录成功页面登录失败页面217.2.3
用户登录的实现思路(续)Controller层:创建登录处理的Action并在struts-config.xml中进行配置创建退出处理的Action并在struts-config.xml中进行配置227.2.3
用户登录的实现思路(续)配置:需要配置web.xml和Struts-config.xml在web.xml中配置:控制器ActionServletStruts标签库(高版本的struts可免)在Struts核心配置文件struts-cfg.xml中配置:封装用户录入数据的AccountForm登录处理的Action和退出处理的Action全局转向页面237.3
用户登录Model层实现在数据库中创建表account创建表account对应POJO类Account创建表account和Account类的Hibernate影射文件创建表account对应数据库访问DAO类修改业务接口PetStoreFacade和实现类PetStoreImpl创建封装登录界面表单数据的AccountForm247.3.1在数据库中创建表account参照数据模型创建表account257.3.2
创建表account对应POJO类Account创建好表account,可以在Eclipse中使用Hibernate
codegeneration来自动创建也可手动创建建议Account类的属性名与account表的对应字段名相同,可简化影射文件Account.hbm.xml的代码定义属性后,在Eclipse中可自动生成各属性对应setter/getter在Account类中定义2个构造方法,一个无参,一个包含对所有属性进行初始化的参数增加一个main方法测试267.3.3
创建表account和Account类的Hibernate影射文件创建好表account,可以在Eclipse中使用Hibernate
codegeneration来自动创建也可手动创建,–
由于表account和Account类的字段名和属性名相同,所以它们的Hibernate影射文件Account.hbm.xml的代码非常简单,见教材277.3.4
创建表account对应数据库访问DAO类主要提供以下功能:根据username属性的值获得Account对象,即定义方法getAccount(String
username)根据username和password属性的值获得Account对象列表,即定义方法getAccount(String
username,String
password)将Account对象保存到数据库中,即定义方法
insertAccount(Accountaccount)
,用户注册模块需要该方法修改Account对象对应的数据库记录值,即定义方法
updateAccount(Account
account),用户信息维护模块需要该方法增加main方法测试287.3.5
修改业务接口PetStoreFacade和实现类PetStoreImpl业务接口PetStoreFacade是各模块进行业务逻辑处理的唯一接口,在其中增加访问account表的方法,即
AccountDAO实现的方法,使得相关Action类访问
account表只是通过PetStoreFacade接口,修改后的
PetStoreFacade关键代码如下……public
interface
PetStoreFacade
{
Account
getAccount(String
username);List
getAccount(String
username,
String
password);void
insertAccount(Account
account);void
updateAccount(Account
account);//省略其他部分……}297.3.5
修改业务接口PetStoreFacade和实现类PetStoreImpl(续)相应修改PetStoreFacade实现类PetStoreImpl增加一个名为accountDao
的属性以访问account表构造方法中增加accountDao的初始化代码增加getAccount(String),getAccount(String,String)、insertAccount(Account)和updateAccount(Account)方法的实现增加main方法测试30必须继承org.apache.struts.action.ActionForm对应表单域定义属性ActionForm的属性与表单域的名字相同为属性提供getter/setter–
可以没有与表单域同名的属性,但是必须有对应的getter/setter7.3.6
创建封装用户登录界面表单数据的AccountForm317.4用户登录View层的实现用户登录页面用户登录成功页面用户登录失败页面327.4.1
用户登录页面文件名SignonForm.jsp建议在WebContent下创建文件夹account,将跟用户有关的jsp文件都保存在该文件夹下;在account文件夹下创建
SignonForm.jsp
具体代码见教材,主要是定义一个表单(form),并用表格对齐各表单域<form
action="../shop/Signon.shtml"method="POST">中的action指定表单提交后将调用的页面。<a
href="../shop/newAccountForm.shtml"">注册</a>中的href指定单击链接将打开的页面。<td><input
type=“text”
name=“username”
value=“test”
/></td>的name指定文本框域的名称,对应AccountForm的属性<td><input
type=“password”
name=“password”
value=“test”/></td>name指定密码框域的名称,对应AccountForm的属性在Eclipse中测试页面效果337.4.2
用户登录成功界面用户登录成功后还是显示主界面,只是用户登录成功前后的快捷菜单是不同的,还有成功后将显示欢迎信息快捷菜单在公共顶部页面IncludeTop.jsp中实现,欢迎信息在主界面Main.jsp中实现所以不需要创建新的文件,只需要修改IncludeTop.jsp和Main.jsp的代码即可347.4.2
用户登录成功界面(续)快捷菜单在IncludeTop.jsp中实现,可以通过JSTL的<c:if>标签或Struts的logic标签:进行判断显示不同的快捷菜单。如果选择使用JSTL的<c:if>标签,只要将原来的语句:<A
href=“”>登录</A>替换为<c:if
test="${empty
account}"
><a
href="../account/SignonForm.jsp">登录</a></c:if><c:if
test="${!empty
account}"
><a
href="../shop/Signoff.shtml"/>登出</a><img
border="0"
src="../images/separator.gif"
/><a
href="../account/EditAccountForm.jsp">我的帐户</a></c:if>357.4.2
用户登录成功界面(续)account是保存在会话(session)中的一个变量,它是
Account的一个对象;如果登录成功,相关Action(见7.5.1)会将当前用户的信息保存到会话的account中,否则会清空会话中account的值。<c:if
test=“${empty
account}”>意思是如果account为空。<c:if
test=“${!empty
account}”>意思是如果account不为空。由于Action还未建立,accoun变量现在还不存在,则无法判断,所以以上修改目前无法测试。367.4.2
用户登录成功界面(续)用户登录成功后的欢迎信息是在Main.jsp中实现的。我们通过JSTL的<c:if>标签进行判断是否输出欢迎信息。然后使用EL表达式输出用户姓名。即在<divid=“Main”>和<div
id=“Sidebar”>之间增加如下代码:<c:if
test="${!empty
account}">欢迎您,${account.firstname}
${account.lastname}!</c:if>同样,由于account变量现在还不存在,则无法判断,所以以上修改目前无法测试。377.4.3
用户登录失败界面登录失败界面由Error.jsp来实现。建议在项目的mon文件下创建文件Error.jsp,common文件夹存放共享的文件关键代码:<c:out
value="${message}"default="没有更详细的出错信息."/>如果message的值为空则输出default的值“没有更详细的出错信息.”。这里的message是一个保存在JSP内部对象request中的属性(attribute),输出的是出错提示信息。所有模块的出错提示可以共享该页面,只要将出错信息赋值给request中的属性message即可。所以将Error.jsp定义成一个全局的出错转向的页面(见7.6.2)387.5
用户登录Controller层的实现处理用户登录的SignonAction的实现处理用户退出的SignoffAction的实现397.5.1
处理用户登录的SignonAction的实现必须继承org.apache.struts.action.Action重载其方法execute
完成功能获得对应的ActionForm对象,代码AccountActionForm
accountActionForm=(AccountActionForm)form;从ActionForm对象获得用户在登录界面(SignonForm.jsp)录入的用户名username和密码password
,代码:String
username=accountActionForm.getUsername();String
password=accountActionForm.getPassword();通过PetStoreFacade接口的getAccount(String
username,Stringpassword)方法访问数据库查询是否有该用户,代码:PetStoreFacade
petstore=new
PetStoreImpl();List
list=petstore.getAccount(username,password);407.5.1
处理用户登录的SignonAction的实现(续)不存在,则将登录失败的信息保存到请求的message属性(或变量)中并转向failure对应的JSP页面,代码if
(list.size()==
0)
{request.setAttribute("message","用户名或密码有误!登录失败.");
return
mapping.findForward("failure");}存在,则获得该用户的信息保存到session的account变量中,转向success对应的JSP页面(默认target)else
{Account
account=petstore.getAccount(username);request.getSession().setAttribute("account",
account);}return
target;41注意:在SignonAction中需要注意2个变量:message和accountmessage的值通过request.setAttribute()方法(request是execute的参数,代表当前请求)保存在request中,所以可以作为request范围的变量用EL表达式来存取其值,见error.jspaccount的值通过request.getSession().setAttribute()方法
(request.getSession()可获得当前会话对象)保存在session中,所以可以作为session范围的变量用EL表达式来存取其值,见
IncludeTop.jsp427.5.2
处理用户退出的SignoffAction的实现继承org.apache.struts.action.Action重载execute方法完成功能–
将保存在会话中的accountForm
的值清空并且使会话失效,代码:request.getSession().removeAttribute("account");request.getSession().invalidate();437.6 Struts相关的配置文件在web.xml中配置创建Struts核心配置文件struts-config.xml
并配置447.6.1
在web.xml中配置Servle配置块:象配置普通Servlet一样配置
ActionServlet(主要是<servlet>与</servlet>标签和对应的<servlet-mapping>与</servlet-mapping>标签)并在
ActionServlet配置中指定Struts核心配置文件struts-cfg.xml的位置,代码:<servlet><!--ActionServlet的名--><servlet-name>action</servlet-name><!--配置Servlet的实现类--><servlet-class>org.apache.struts.action.ActionServlet</servlet-class><init-param><!--指定struts核心配置文件的位置--><param-name>config</param-name><param-value>/WEB-INF/struts-config.xml</param-value></init-param><!--配置自启动的级别--><load-on-startup>2</load-on-startup></servlet>457.6.1
在web.xml中配置(续)<!--配置ActionServlet的URL映射--><servlet-mapping><servlet-name>action</servlet-name><url-pattern>*.shtml</url-pattern></servlet-mapping>467.6.1
在web.xml中配置(续)扩展标签库配置块:配置Struts标签库,主要是<taglib>与</taglib>标签<!--配置Struts标签库--><taglib><taglib-uri>struts-bean</taglib-uri><taglib-location>/WEB-INF/struts-bean.tld</taglib-location></taglib><taglib><taglib-uri>struts-html</taglib-uri><taglib-location>/WEB-INF/struts-html.tld</taglib-location></taglib><taglib><taglib-uri>struts-logic</taglib-uri><taglib-location>/WEB-INF/struts-logic.tld</taglib-location></taglib>477.6.2
创建Struts核心配置文件struts-config.xmlStruts核心配置文件struts-config.xml主要有3部分:form-beans部分:配置ActionFormglobal-forwards部分:配置全局的页面转发action-mappings部分:配置action487.6.2
创建Struts核心配置文件struts-config.xml(续)配置AccountActionForm在form-beans部分进行配置每个ActionForm对应一个form-bean元素name属性指定定义了ActionForm的id,用于标识该
ActionFormtype属性定义了ActionForm的实现类代码:<form-beans><form-bean
name="accountForm"type="com.sziit.petstore.struts.AccountActionForm"/></form-beans>497.6.2
创建Struts核心配置文件struts-config.xml(续)配置SignonAction和SignoffAction在action-mappings部分进行配置每个action对应一个需要经过struts处理的请求path属性是Action的别名,省略后缀(这里是shtml),对应表单<form>表单中的action属性值(见7.4.1SignonForm.jsp中表单的
action属性值),该属性用于被用户请求name指定关联的ActionForm的name,这个ActionForm必须是已经在<form-beans>中定义过的。Struts就是根据这一项指定Action该用哪个ActionFormtype属性指定这个Action的类名(包含包名)子节点<forward>定义了该Action可能转发到的页面
“/catalog/Main.jsp”,name指定转向页面的逻辑名“success”,path指定转向的页面,Action代码中只能使用逻辑名,即
return
mapping.findForward(target);其中target的值只能是
“succsss”或“failure”是逻辑名,不能是具体的页面
“Main.jsp”或“Error.jsp”507.6.2
创建Struts核心配置文件struts-config.xml(续)scope属性指定这个Action对应的ActionForm的作用域,只能取
session和request,默认为sessioninput属性指定包含输入表单的页面。当表单验证(validate方法)失败时,将把请求转发到该页面。validate属性:指明是否自动调用ActionForm中的validate方法对表单进行验证,默认是false517.6.2
创建Struts核心配置文件struts-config.xml(续)<action
path="/shop/Signon"input="/account/SignonForm.jsp"name="accountForm"scope="session"type="com.sziit.petstore.struts.SignonAction"
validate="true"><forward
name="success"
path="/catalog/Main.jsp"/></action><action
path="/shop/Signoff"name="accountForm"scope="session"type="com.sziit.petstore.struts.SignoffAction"
><forward
name
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度智慧城市路灯安装与维护一体化服务合同3篇
- 2025版物联网设备远程监控英文技术服务合同3篇
- 2025年度家庭护理服务与远程医疗合作协议3篇
- 2024年甲乙双方关于医疗设备采购与运输的合同
- 2025版电梯维修保养行业标准化建设合同3篇
- 2024年生猪养殖场租赁合同案例
- 2025版城市绿化养护项目履约担保合同2篇
- 2025年度新型城镇化安置房产权互换交易合同3篇
- 2025年度环保型不锈钢门安装及节能改造合同3篇
- 2024年中国四方食品盘市场调查研究报告
- 健身健美(课堂PPT)
- 钢筋统计表(插图有尺寸)
- (完整版)财务管理学课后习题答案-人大版
- 食品安全管理体系培训系列教材(共44页).ppt
- 世界各地的新年习俗(课堂PPT)
- 锚索试验总结(共11页)
- 生物矿化与仿生材料的研究现状及展望
- 人教版“课标”教材《统计与概率》教学内容、具体目标和要求
- JJF 1827-2020水泥细度负压筛析仪校准规范
- 物业项目月度绩效考核表格
- 民法典关于物业管理的规定PPT课件
评论
0/150
提交评论