版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
我们所学习的技术框架有很多,例如struts1,struts2、JSF、Spring、SpringMVC、Hibernate、
ibatis•…在上篇博客我说了我们可能在开发的路途上会要学习这些框架,我也给出了我对框
架学习的几点:
属于哪一层
提供什么服务
利用框架可以做什么
怎么学习框架衿
1.设“思路和执行流杆
熟练掌握使用
-'-____________
类比法,编织知识网
我们首先要看一下这个框架属于开发结构中的那•层。因为我们的开发都是要用分层
的思想来做的,所以我们第一个就要看看我们开发分层中,各个层次之间有哪些框架。
我们从图上看到了那些框架属于哪一层的(这里还有很多框架没有涉及到)。之后我
们来看一些常用的框架(这个常用相对于个人而言,我这里所说的常用针对我自己来说,如
果这里我没有介绍全的话,大家可以到相关的框架官网去查阅一下资料自主学习)。
下面我就简单的介绍•些我经常使用的框架的结构和一些分析:
Struts框架(分为struts1和struts2):
一、Struts框架结构图:
优点:
LStruts框架是一个基于mvc的框架,所以它继承了所有mvc的优点,例如:复用
性好,团队开发分工明确,结构层次分明等
2.给程序开发者在servlet层上节约了大量的开发时间,应用程序开发者不再去触及
大量的servlet的编写,仅仅变换为配置文件。
二、Struts1框架
1.框架的结构图:
2.StnHsl框架有五个常用对象:actionservlet>actionmappingactionform>action>
actionforward
a)Actionservlet是核心控制,URL地址映射、ActionFonn的匹配、Action的
执行都需要这个类来进行导航
b)Actionmapping:它们可将请求URI映射到Action类,并且将Action类与
ActionFormbean相关联
c)Actionfonn:收集表单数据
d)Action:完成所需的业务逻辑,确定要跳转的页面
e)Actionforward:用来封装转发路径的
3.Struts1框架的执行流程:
1)检索和用户匹配的ActionMapping实例,如果不存在,就返回请求路径无效的错
误信息
2)如果ActionForm实例不存在,就创建一个ActionForm的对象,把客户提交的表单
数据封装到ActionForm对象中。
3)根据配置信息决定是否要进行表单验证,如果需要,就调用ActionForm的validate()
方法
4)如果validate。方法放回null,或者并不包含ActionMessage的ActionError对象,就
表示验证成功
5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给那个action,
如果相应的action实例不存在,就先创建这个action对象,然后再调用这个action的excute()
方法
6)action的execute。方法返回一个ActionForword对象,ActionServlet会把客户请求
转发给ActionForword对象所指向的JSP组件
7)ActionForword对象指向JSP组件生成动态网页返回给客户
actstruts^/
春户■«应
4.优点:和struts框架的优点相同
5.缺点:
1)表现层技术单一:仅能用jsp
2)与servletAPI耦合性高,难于测试(httpservletrequest,httpservletresponse)
3)严重依赖于ServletAPI(继承action,继承actionform).与struts1框架耦合
性太高
这篇博客就写到这里,如果再写篇幅可能会过长,对读者的阅读造成负面影响,所以
我会在下面的博客中陆续介绍我经常使用的框架,当然我也会在这些同层之间的框架的分析
中加入各个框架的区别,当然在适当的地方会画一些图片来表示他们之间的知识关联性,希
望读者能够我一些建议和意见。
在上篇博客中,我简单的介绍了我们分层开发中每一层中拥有的框架,而且介
绍了我常用的框架strutsl的结构和原理分析,那么今天我继续介绍我熟悉的框
架struts2的框架的结构和原理分析。
在说struts2框架之前,我要先介绍另外一个框架webwork框架,这个框架
也是一个mvc的框架,这个框架的设计思路是采用拦截链将用户的请求的数据
转发到Action中,并负责将Action的处理结果转换成对用户的响应。它的这种
设计思路能够和ServletAPI分离,鉴于我们的上篇博客介绍的strutsl的缺点,所
以webwork框架解决了strutsl的这个缺点。
我们来看一下webwork框架的结构图:
HTTP遣求
WebWorkActionContextCleanUp
其他过流IB(如SitcMeth等)
WubWork的核心控瓶器:ScrvIctDitpatcher
Action
WabWcsk
,如HTMUfonn®
等*".一•
‘.”理肘"率
xwork.xml
视图模板》I
-JSP
颠色含义,_FreeMarker
Servletilitil一等等
I开发者定义文存
有了这个流程图,我就不给大家讲解具体的原理流程了,它采用的是拦截链
的机制,通过这些拦截链完成用户的相应请求,从而与servletAPI分离,当与
servlet分离开的时候,也就是表明和容器解耦了;另外,我们从结构图中看到它
的视图模版有jsp、FreeMarker等等,它的表示层技术比struts1框架的饱满许多。
所以,webwork框架解决了strutsl框架存在的问题,而且它的设计思路是
非常好的,鉴于此,struts2框架就在strutsl框架的基础上引入了webwork框架
的设计思路应运而生了。所以我们就能够发现struts2兼具strutsl的特性而且通
过引入webwork框架的设计思路解决了strutsl的一些缺点。
struts2框架的大致的体系图:
◎Struts2的大致体系图
客户端
从图中我们能够看出它是引入的webwork框架的设计思路,而且它也是基
于mvc的一个开源的框架。之后我们来说一下struts2框架的一个执行流程(流
程图和webwork框架非常类似):
Struts2Architecture(HttpSeMetRequest
ActionContextCleanUp
OtherFilters(SiteMesh,etc)
FilterDispatcher
X/
ActionMapper
义Interceptor1)
Action。喇eptor,
invocation(Interceptor3)间Subsystem
HTML,Dojo,Forms,etc
Action
Result
Template
Interceptor3JSP,FreeMarker,
Interceptor2
Interceptor1
XHttpSen/letRespon^)-
(2)ServletFilters(2)CoreInterceptors(2)UserCreated
1.浏览器发送请求,通过几层过滤器完成一些功能,之后到actionmapper
中,之后将请求传到核心控制器中
2.核心控制器filterDispatcher根据请求决定调用合适的Action
3.调用webwork的拦截器链自动请求通用功能,如校验之类的操作
4.回调action的execute方法,获取用户请求执行相应的业务逻辑
5.之后返回字符串,匹配result,之后跳转到相应的视图或其他的文档
6.之后在执行相应的拦截器链自动请求功能,随后转到web客户端。
这样我们就对struts2框架的结构上的东西做了一个简单的介绍。在上篇博
客讲解了strutsl框架,所以有必要在这里对他俩进行一下对比(我仅仅总结了
五条我认为比较重要的,以后如果发现其他的在随时补充):
1.在Action实现类方面的对比(strutsl的Action继承action,struts2
实现接口,也可以不实现,可以定制服务)
2.线程模式方面的对比(strutsl存在线程安全问题,struts2不存在)
3.ServletAPI依赖方面的对比(strutsl依赖servletAPI,struts2不是)
4.可测性方面的对比(strutsl难测试,依赖容器,struts2不是)
5.封装请求参数的对比(strutsl使用actionform;struts2直接写到
action,并且支持pojo对象)
在上篇博客中介绍了struts2框架的原理和流程分析,可以说struts框架一路走
来,改变非常大,而且让我们开发人员变得更加轻松,里面的设计理念的改变也
是让我们编程人员的思路得到更大的扩展。
►
\Strutsl框架〕IWebWork框架•1
strutsl框架
到struts2福架在进步-——->)
struts2框架在基础上引进\/
webwork福架好的设■思路•__.
基质实现1设计电路
••♦•
••••
[Struts2框架|
'J
\/
可以说,一个先进的技术或者框架就是要不断的进步才能永远让编程人
员喜欢和使用,一个优秀的编程人员也是要不断的进步才能永远让这个世界变得
更加绚丽多彩。
其实编程就是这样有意思的!
前面说了一些宏观上学习框架相关的思想方面的东西,下面继续来介绍我经
常使用的框架和框架的分析,这篇博客主要介绍的是hibernate框架。
首先说hibernate框架是数据持久层的框架,这个框架是非常强大的,它让
编程人员纯粹的用面向对象的方式来做开发,让编程人员所面对的都是对象。仅
仅从这一点它的设计思路就是非常让编程人员喜爱的。
回想我们普通的开发流程,和客户沟通定需求,抽象出来原型,从原型中建
立数据模型到库表结构的建立,之后在映射成对象模型,之后在用00的设计思
想完成后续的程序开发。但是当我们使用了hibernate框架以后,原先的设计思
路就显得不再那么具有优势了。我们直接建立对象模型,之后利用hibernate框
架映射成数据模型,我们不再去考虑数据库关系模型的东西,仅仅考虑的东西仅
仅就是类和对象,这样的开发才是面向对象的开发,也才是最接近人类思考问题
的方式。所以hibernate框架的设计思路是非常好的。
hibernate框架设计思路的优越性其实体现在了它本身的框架的原理上。
hibernate封装了JDBC,减轻了开发人员在持久层的大量重复性工作,它利用了
java反射机制来实现程序的透明性;它就是通过这两点才达到从对象出发而非
关系数据库出发的效果。
介绍这么多理论性的东西之后我们能够感觉到hibernate框架的强大,来看看
它的结构图:
Busingsluiycr
Interceptor
UserType
PersistenceLayer|Session卜actory
SessionTransactionQueryFt'onfiguration
JNDIJDBCJTA
在hibernate框架中有几个比较重要的接口和类:
1.Query接口:Query负责执行各种数据库查询。它可以使用HQL语句或
SQL语句两种表达方式。
2.Configuration类:Configuration类负责配置并启动Hibernate,创建
SessionFactory对象
3.SessionFactory接口:SessionFactory接口负责初始化Hibernate。它
充当数据存储源的代理,并负责创建Session对象
4.Session接口:Session接口负责执行被持久化对象的CRUD操作
5.Transaction接口:Transaction接口负责事务相关的操作
hibernate框架就是在利用这几个接口来封装了JDBC,而且我们用这些接口
来操作数据库变得非常简单,减少了我们在持久层的代码量。
从这个结构图和我的一些分析就能发现hibernate框架是非常强大,而且它
给我们开发人员的开发带来了非常大的便利,尤其是他的设计思路还有它的“全
自动”的映射对象模型和关系模型。
但是hibernate框架也有它的一些缺点:
1.既然是封装了JDBC,所以很明显它没有JDBC的效率高,尤其是在大量的
处理表更新操作的时候。
2,它有局限性,一个持久化类不能映射多个表
3.它应对大数量的时候显得非常笨拙,这一点没有JDBC和接下来要介绍的
IBatis框架
其实一项技术或者一个框架都有它的优缺点,选择最合适的才是王道。
这篇博客主要是介绍了hibernate框架的结构和分析,阐述了hibernate框架
的优缺点,【具体详细使用要等到我的框架学习的后续文章】。总的来说hibernate
框架在持久层的作用非常明显,我们懂得了它的优缺点之后,才能做到我们是否
是要选择这个框架作为我们持久层开发的必须的技术支撑,所以这些我常用的框
架结构和分析不单单是在介绍一些框架学习的宏观知识把控,更多的是在为将来
做项目开发中选择合适的技术支撑做铺垫。
后续的博客在不断更新,希望这些博客能够对读者的开发过程带来帮助,当然如
果读者对我的博客有什么好的建议或者意见,请与我联系。联系方式见博客侧边
栏!
先看MVC模式流程图(其实MVC设计模式就是java中的model2o):
WEB客户端Servlet业务逻辑JSP
RequestQ,
霰再合敢0M层(Model)V层
C层(Control
)
ResponseQ
I
就像图上所标识的C层主要是Servlet层控制页面跳转,M层就
是具体的业务处理逻辑,而JSP就是所谓的V层。MVC是有别于我们
所说的三层,我们平常所说的三层是UI层、BLL层、DAL层,具体的
区别如图:
WEB客户端JSPBLL层
request。UI层
再弓BLLWO
u
□
।
从图上能看出来,JSP和Servlet构成了UI层,而Model层分成了
BLL层和DAL层(也就是业务逻辑利数据持久层)。
从理论上认清了MVC设计模式之后,下面开始动手敲一个MVC
设计模式示例代码:
JSP索引页面index.jsp:
viewplaincopy
print?
1.<%@pagelanguage=*'java"contentType=*'text/html;charset=GB18030,1
2.pageEncoding=*'GB18030n%>
3.<•DOCTYPEhtmlPUBLIC”-//W3C//DTDHTML4.01Transitional//ENnHhttp:/
/www.w3.org/TR/html4/loose.dtdn>
4.<html>
5.<head>
6.<metahttp-equiv=nContent-Typecontent="text/html;charset=GB18030M>
7.<title>Inserttitlehere</title>
8.</head>
9.<body>
10.<formaction=Hservlet/addUser.actionnmethod=npostn>
11.姓名:<inputtype=ntextnname=1'2**567*91011username">
12.<inputtype=nsubmit"value="提交”〉
13.</form>
14.
15.</body>
16.</html>
业务逻辑代码UserManager:
:ava]viewplaincopy
print?
1.packagecom.cjq.servlet;
2.
3.importjava.util.ArrayList;
4.importjava.util.List;
5.
6.publicclassUserManager{
7.
8.publicvoidaddUser(Stringusername){
9.System.out.printin("UserManager.addUsre()>username:n+userna
me);
10.)
11.
12.publicvoiddelUser(Stringusername){
13.System.out.printIn("UserManager.delUser()>username:*'+userna
me);
14.}
15.
16.publicvoidmodifyUser(Stringusername){
17.System.out.printin("UserManager.modifyUser()-->usernamen+user
name);
18.)
19.
20.publicListqueryUser(Stringusername){
21.System,out.printin(**UserManager.queryUser()-->usernameH+usern
ame);
22.ListuserList=newArrayList();
23.userList.add(uan);
24.userList.add(Mbn);
25.userList.add(nc");
26.returnuserList;
27.)
28.}
Servlet控制代码:
:ava]viewplaincopy
print?
1.packagecom.cjq.servlet;
2.
3.importjava.io.lOException;
4.importjava.util.List;
5.
6.importjavax.servlet.ServletException;
7.importjavax.servlet.http.HttpServlet;
8.importjavax.servlet.http.HttpServletRequest;
9.importjavax.servlet.http.HttpServletResponse;
10.
11.publicclassTestServletextendsHttpServlet
12.
13.
14.protectedvoiddoGet(HttpServletRequestrequest,HttpServletRespon
seresponse)
15.throwsServletException,lOException{
16.
17.StringrequestURI=request.getRequestURI();
18.System.out.printin("request=H+requestURI);
19.Stringpath=requestURI.substring(requestURI.indexOf(*'/",1)zreq
uestURI.indexOf('*."));
20.System.out.printIn("path-"+path);
21.
22.Stringusername=request.getParameter("usernamen);
23.UserManageruserManager=newUserManager();
24.//userManager.addUser(username);
25.Stringforward=n;
26.if(n/servlet/delUser'*.equals(path)){
27.userManager.delUser(username);
28.forward=,*/del_success.jspn;
29.}elseif("/servlet/addUser*'.equals(path)){
30.userManager.addUser(username);
31.forward=n/add_success.jspn;
32.}elseif("/servlet/modifyUsern.equals(path)){
33.userManager.modifyUser(username);
34.forward=n/modify__success.jspn;
35.}elseif("/servlet/queryUser',.equals(path)){
36.ListuserList=userManager.queryUser(username);
37.request.setAttribute("userListn,userList);
38.forward=**/query_success.jsp";
39.}else{
40.thrownewRuntimeException("请求失败”);
41.}
42.request.getRequestDispatcher(forward).forward(request,respons
e
43.
44.}
这个servlet代码主要实现的功能判断是那个页面请求服务器做
那些操作,之后调用业务逻辑实现相应业务操作。
配置Servlet:
viewplaincopy
print?
1.<?xmlversion="l.0*'encoding="UTF-8”?>
2.<web-appxmlns:xsi=n/2001/XMLSchema-instance"xmlns=n
http://java.sun.com/xml/ns/javaee*,xmlns:web="http://java.sun.com/xml/
ns/javaee/web-app_2_5.xsdnxsi:schemaLocation=n/xml
/ns/javaee/xml/ns/javaee/web-app_3_0.xsdnid=*'WebA
pp_IDnversion=n3.0n>
3.<display-name>test_Servlet</display-name>
4.<welcome-file-list>
5.<welcome-file>index.html</welcome-file>
6.<welcome-file>index.htm</welcome-file>
7.<welcome-file>index.jsp</welcome-file>
8.<welcome-file>default.html</welcome-file>
9.<welcome-file>default,htm</welcome-file>
10.<welcome-file>default.jsp</welcome-file>
11.</welcome-file-list>
12.
13.<servlet>
14.<servlet-name>TestServlet</servlet-name>
15,<servlet-class>com.cjq.servlet.TestServlet</servlet-class>
16.</servlet>
17.<servlet-mapping>
18.<servlet-name>TestServlet</servlet-name>
19.<url-pattern>*.action</url-pattern>
20.</servlet-mapping>
21.
22.
23.</web-app>
输出结果:
日Console汉',1Servers■X&l皆国
Tomcatv7.0Serveratlocalhost[ApacheTomcat)C:\ProgramFiles\JavaVeAbin^avaw.exe(2012-2-20下午7:39:25)
path»/servlet/addUser
UserManager.addl)sre()--->usernarae:ddd
通过上面的示例已经对MVC设计模式有了初步的认识,其实这
个示例是对Struts框架学习的基础,只有弄清楚了这个实例才能弄清楚
Struts框架的实现原理和Struts框架使用。
那么我们怎么才能通过这个示例引入Sti-uts框架呢?这个问题从
IF-Eles开始。
首先我们看到了TestServlet中出现了许多if-else语句,这样是非
常不稳定的,这样的程序是非常不灵活的,以后如果有变化,那么维护
是非常差的;而且我们在if-else中出现了大量的字符串,这样在coding
的时候会出现写错,这样无形中给调试带来了麻烦。所以去掉if-else成
了我们重构的第一步,也是我们进行Struts框架学习的第一步。
如何才能去掉If-ELSE呢?请看下一篇文章《深入浅出学习
Strutsl框架(二):重构MVC模式代码中跳转路径和业务逻辑》。
在上篇博文《深入浅出学习Strutsl框架(一):一个简单mvc模式代
码示例开始》中简单说了一下MVC模式代码的实现和MVC模式和三
层架构的区别,并且留下一个问题一如何去掉TestServlet中的IF-Else
语句块。
因为在TestServlet中出现了If-Else语句块,所以让程序变得不再
灵活,让应付需求变化时变得笨拙。所以就承接上篇文章来重构一下
TestServlet代码,主要是用继承多肽来进一•步对TestServlet进行重构。
虽然这一篇文章最后没有将if-else彻底去掉,但是比起上篇文章的代码
显得更加灵活,也为下一篇彻底去掉If-else埋下伏笔。
下面进入重构阶段:
先看一下上篇文章的TestServlet代码:
「av日|viewplaincopy
print?
1.packagecom.cjq.servlet;
2.
3.importjava.io.lOException;
4.importjava.util.List;
5.
6.importjavax.servlet.ServletException;
7.importjavax.servlet.http.HttpServlet;
8.importjavax.servlet.http.HttpServletRequest;
9.importjavax.servlet.http.HttpServletResponse;
10.
11.publicclassTestServletextendsHttpServlet{
12.
13.
14.protectedvoiddoGet(HttpServletRequestrequest,HttpServletRespon
seresponse)
15.throwsServletException,lOException{
16.
17.StringrequestURI=request.getRequestURI();
18.System.out.printin(nrequest='*+requestURI);
19.StringpathrequestUR工.substring(requestURI.indexOf("/”,!.),req
uestURI.indexOf(;
20.System.out.printIn(,,path-u+path);
21.
22.Stringusername=request.getParameter("usernamen);
23.UserManageruserManager=newUserManager();
24.//userManager.addUser(username);
25.Stringforward=Hn;
26.if(',/servlet/delUser'*.equals(path)){
27.userManager.delUser(username);
28.forward=n/del_success.jspw;
29.}elseif("/servlet/addUser".equals(path)){
30.userManager.addUser(username);
31.forward=n/add_success.jspn;
32.}elseif(*'/servlet/modifyUsern.equals(path)){
33.userManager.modifyUser(username);
34.forward=/modify_success.jspn;
35.}elseif(•'/servlet/queryUser',.equals(path)){
36.ListuserList=userManager.queryUser(username);
37.request.setAttribute("userListn,userList);
38.forward=M/query_success.jsp";
39.}else{
40.thrownewRuntimeException("请求失败”);
41.}
42.request.getRequestDispatcher(forward).forward(requestzrespons
e
43.
44.)
首先我们看到了在每个语句块中都出现了给forward赋值,其实也
就是给页面跳转的路径赋值,针对每个请求路径判断来赋值跳转路径。
另外每个IF-Else语句块中都有业务处理,我们要把这些业务处理分别
放到类里面,让职责更加单一,这样更加符合面向对象的思路。
就从这里我们开始重构,我们可以将这个跳转路径和业务逻辑封
装起来。
既然封装,那么我们就抽象出来一个借口,主要完成一个方法,
这个方法主要的功能就是要完成业务逻辑封装和路径跳转的返回。随后
建立四个类,主要实现相应的增删改查的业务处理和处理之后的跳转路
径返回。
代码如下:
接口Action:
:java]viewplaincopy
print?
1.packagecom.cjq.servlet;
2.
3.importjavax.servlet.http.HttpServletRequest;
4.importjavax.servlet.http.HttpServletResponse;
5.
6.publicinterfaceAction{
7.
8.publicStringexecute(HttpServletRequestrequest,HttpServletRespon
seresponse)
9・throwsException;
10.}
增删改查实现类:
添加用户实现类:
viewplaincopy
print?
1.<prename=Hcodenclass=Hjava',>packagecom.cjq.servlet;
2.
3.importjavax.servlet.http.HttpServletRequest;
4.importjavax.servlet.http.HttpServletResponse;
5.
6.publicclassAddUserActionimplementsAction{
7.
8.
9.publicStringexecute(HttpServletRequestrequest,
10.HttpServletResponseresponse)throwsException{
11.Stringusername=request.getParameter("username");
12.UserManageruserManager=newUserManager();
13.UserManager.addUser(username);
14.returnn/add_success.jspn;
15.}
16.
17.}</prexbrxbr>
删除用户实现类:
Java]viewplaincopy
print?
1.packagecom.cjq.servlet;
2.
3.importjavax.servlet.http.HttpServletRequest;
4.importjavax.servlet.http.HttpServletResponse;
5.
6.publicclassDelUserActionimplementsAction{
7.
8.
9.publicStringexecute(HttpServletRequestrequest,
10.HttpServletResponseresponse)throwsException{
11.Stringusername=request.getParameter("username*');
12.UserManageruserManager=newUserManager();
13.UserManager.delUser(username);
14.returnH/del_success.jsp";
15.}
16.
17.}
更新用户实现类:
Iava]viewplaincopy
print?
1.packagecom.cjq.servlet;
2.
13.importjavax.servlet.http.HttpServletRequest;
4.importjavax.servlet.http.HttpServletResponse;
5.
6.publicclassModifyUserActionimplementsAction{
7.
8.^Override
9.publicStringexecute(HttpServletRequestrequest,
10.HttpServletResponseresponse)throwsException{
11.Stringusername=request.getParameter(MusernameH);
12.UserManageruserManager=newUserManager();
13.UserManager.modifyUser(username);
14.returnn/mociify_success.jspn;
15.)
16.
17.)
查询用户实现类:
viewplaincopy
print?
1.packagecom.cjq.servlet;
2.
3.importjava.util.List;
4.
5.importjavax.servlet.http.HttpServletRequest;
6.importjavax.servlet.http.HttpServletResponse;
7.
8.publicclassQueryUserActionimplementsAction{
9.
10.0Override
11.publicStringexecute(HttpServletRequestrequest,
12.HttpServletResponseresponse)throwsException{
13.Stringusername=request.getParameter(nusername,');
14.UserManageruserManager=newUserManager();
15.ListuserList=userManager.queryUser(username);
16.request.setAttribute(MuserList*',userList);
17.return'*/query_success.jsp*';
18.}
19.
20.}
TestServlet类重构如下:
Iavalviewplaincopy
print?
1.packagecom.cjq.servlet;
2.
3.importjava.io.lOException;
4.importjava.util.List;
5.
6.importjavax.servlet.ServletException;
7.importjavax.servlet.http.HttpServlet;
8.importjavax.servlet.http.HttpServletRequest;
9.importjavax.servlet.http.HttpServletResponse;
10.
11.publicclassTestServletextendsHttpServlet{
12.
13.
14.protectedvoiddoGet(HttpServletRequestrequest,HttpServletRespon
seresponse)
15.throwsServletException,lOException{
16.
17.StringrequestURI=request.getRequestURI();
18.System.out.printin("request=n+requestURI);
19.Stringpath=requestURI.substring(requestURI.indexOf(“/“,1),req
uestURI.indexOf(".”));
20.System.out.printin("path="+path);
21.
22.Actionaction=null;
23.if("/servlet/delUser',.equals(path)){
24.action=newDelUserAction();
25.}elseif(n/servlet/addUsern.equals(path)){
26.action=newAddUserAction();
27.}elseif("/servlet/modifyUser".equals(path)){
28.action=newModifyUserAction();
29.}elseif("/servlet/queryUser'*.equals(path)){
30.action=newQueryUserAction();
31.}else(
32.thrownewRuntimeException("请求失败”);
33.}
34.Stringforward=null;
35.try(
36.forward=action.execute(request,response);
37.}catch(Exceptione){
38.e.printStackTrace();
39.)
40.request.getRequestDispatcher(forward).forward(request,respons
e);
41.}
42.)
运行结果:
uw
।**(ww**ujJIjze・、■(iwt(vj、<z,\・・、z,・、>■,・•■・・ji*ryj・jy,j・、=z・・(V*・・・jkJ=4J
信息:StartingProtocolHandler[Majp-bio-8009n]
二月21,20127:34:00下午org.apache.catalina.startup.Catalinastart
信息:Serverstartupin7803ms
request=/test_Servletl/servlet/addllser.action
path=/servlet/addllser
UserManager.addllsre()——>username:ddd|
这样TestServlet类虽然没有彻底去掉If-Else,但是这样的代码变
得更加简练,利用多肽实现业务逻辑处理和路径跳转返回。职责更加清
晰,让维护变得更加轻松。
问题遗留:
If-else语句块没有彻底剔除,而且程序中依旧出现了过多的字符
串,所以程序依旧是不灵活,而且字符串过多增加调试的复杂性。所以
下一篇文章就把if-else语句块剔除,并且把字符串放到配置文件来用
dom4j来动态读取。
我们离Struts框架越来越近,当我们把if-else和字符串剔除之后
就会出现Struts框架的雏形。期待下一篇文章。
在《深入浅出学习Struts1框架(-):一个简
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《DBT 108.4-2025活动断层探查 地震勘探 第4部分:短周期密集台阵探测法》(2026年)合规红线与避坑实操手册
- 广西壮族自治区柳州市2025年中考一模英语试题(含答案)
- 某省市规划建筑设计工作汇报总结
- 产假后重返职场规划
- 大学生就业指导意义
- 脑梗死专业知识考试试题及答案解析
- 高邮城南新区职业规划
- 多边形及其内角和课件2025-2026学年人教版数学八年级下册
- 2026七年级道德与法治下册 青春电影观看途径
- 医院消防设施工作制度
- 马来西亚中学数学试卷
- 新生儿呛奶窒息预防与处理
- 盛大传奇协议书
- 阑尾炎手术前后护理常规
- 兵团连队资产管理办法
- 2025年北京市海淀区高一(下)期末考试数学试卷(含答案)
- T/CCT 003-2020煤用浮选捕收剂技术条件
- 企业环保安全评估报告模板
- 放射化学试题及答案
- 深圳一职笔试题及答案
- 《神经系统损伤定位》课件
评论
0/150
提交评论