【SSH 基础】SSH框架--struts深入具体解释(一)
学习了struts,可是对于它的由来,以及为什么使用action和struts.xml的方式而不採用曾经的servlet方式。有些疑问,究竟之前的方式有什么弊端,struts又给我们带来了什么便利?
以下一一为大家解答!
struts的由来:
随着JSP与Servlet 技术大量应用于以Web为基础的应用程序,为了提升Web 应用程序可维护性与反复使用性。Java开发者提出了一些较佳的开发模式。比較常见的两种JSP应用架构分别为Model1 与Model 2。详情參见(JAVA学习篇--JAVA的两种编程模式对照)
简单回想两种模型:
Mode1 1是一个以JSP文件为中心的模式, JSP不仅负责表现逻辑。也负责控制逻辑。逻辑耦合在页面中。这种处理方式,对一些规模非常小的项目是能够的,可是用在开发大型项目时,页面非常难把握流向,界面间关联性太强,使得程序的改动与维护变得困难;此外程序逻辑与页面显示交叉,既不便于分工合作也不利于代码的重用,这种程序其健壮性和可伸缩性都不好。
Model 2中Servlet扮演前端Controller角色。client的请求不再直接送给JSP,而是送给Servlet,再由Servlet依据详细的请求调用不同的事务逻辑。并将处理结果返回到合适的页面。最重要的是Model2将业务逻辑从JSP文件剥离。分离后,JSP文件单纯仅仅是显示,这就是常说的View;而独立出来的事务逻辑和数据处理等是常说的Model,再加上控制器Control本身,即为MVC模式。
MVC模式为大型程序的开发及维护提供了巨大的便利。
可是Model2的长处也造成了他的缺点。由于解耦,分层。使得Model2的编写变得复杂,尤其是大型项目。Servlet过多,转向频繁。流程。配置等不易集中管理。
所以基于以上这些原因。Struts将某些功能进行提取,然后做了一个封装,能让我们更好的使用。
上面说的都太过笼统。或许大家还是非常难想象。以下结合详细实例说明一下不使用struts的弊端!
详细演示样例分析(不使用struts)
add.html
<HTML>
<BODY>
<FORM ACTION="../addGrade" METHOD="POST">
学号:<INPUT TYPE="TEXT" NAME="USERID" ><BR>
姓名:<INPUT TYPE="TEXT" NAME="USERNAME" ><BR>
语文:<INPUT TYPE="TEXT" NAME="CHINESE" ><BR>
数学:<INPUT TYPE="TEXT" NAME="MATHS" ><BR>
英语:<INPUT TYPE="TEXT" NAME="ENGLISH" ><BR>
<INPUT TYPE="SUBMIT" VALUE="保存">
<INPUT TYPE="RESET" VALUE="取消">
</FORM>
</BODY>
</HTML>
配置文件
<servlet>
<servlet-name>addgradeservlet</servlet-name>
<servlet-class>servlet.addGradeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>addgradeservlet</servlet-name>
<url-pattern>/addGrade</url-pattern>
</servlet-mapping>
addGradeServlet.java:相应的servlet
public class addGradeServlet extends HttpServlet{
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String strUserId = request.getParameter("USERID");
String strUserName = request.getParameter("USERNAME");
String strChinese = request.getParameter("CHINESE");
String strMaths = request.getParameter("MATHS");
String strEnglish = request.getParameter("ENGLISH");
Grade grade=new Grade();
grade.setUSERID(strUserId);
grade.setUSERNAME(strUserName);
grade.setCHINESE(strChinese);
grade.setMATHS(strMaths);
grade.setENGLISH(strEnglish);
gradeDao gradedao=new gradeDao();
gradedao.insertGrade(grade);
ArrayList<Grade> gradeList=(ArrayList)gradedao.listGrade();
HttpSession session=request.getSession();
ServletContext scx=session.getServletContext();
scx.setAttribute("gradeList",gradeList);
response.sendRedirect("javabean_test/show.jsp");
}
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
this.doPost(request, response);
}
分析:此段代码完毕的功能是得到学号,姓名,语文,数学,英语等信息,进行对应的操作,并转向对应的页面。
问题1:对于跳转页来说,就是项目中的页面名称,比方:show.jsp等等这些东西都写死了,比方想换一个页面,由于文件名称都已经写死在了程序中。修改起来非常麻烦。也不符合OCP原则。
并且对于上面的代码我们不难发现。每一个方法的跳转代码差点儿同样,仅仅有跳转的详细页面有区别,那么我们就能够将那些不须要修改的内容抽取出来,做成框架,须要修改的部分拿出来。想要用什么配置一下就能够。比方想改jsp名,仅仅须要配置一下就能够了。
问题2:就上面的加入功能来说,我们须要从前台获取多个參数,然后再一个一个的设置到对象中。不但添加了我们的代码量,还使我们的程序难于维护。代码例如以下:
String strUserId = request.getParameter("USERID");
String strUserName = request.getParameter("USERNAME");
String strChinese = request.getParameter("CHINESE");
String strMaths = request.getParameter("MATHS");
String strEnglish = request.getParameter("ENGLISH");
Grade grade=new Grade();
grade.setUSERID(strUserId);
grade.setUSERNAME(strUserName);
grade.setCHINESE(strChinese);
grade.setMATHS(strMaths);
grade.setENGLISH(strEnglish);
问题3:上面採用的是加入使用addServlet,那么删除,改动,查询呢,对于一个功能块来说,就最少须要4个servlet来管理,那么这么多个servlet,添加了程序的负担,使我们不easy维护。
而即使我们将一个功能块的全部servlet都统一管理,那么我们就又须要加入if推断语句。类似例如以下代码:
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if(Constants.SHOW_ADD.equals(getCommand())){
showAdd(request,response);
}else if(Constants.ADD.equals(getCommand())){
add(request,response);
}else if(Constants.DEL.equals(getCommand())){
del(request,response);
}else if(Constants.AUDIT.equals(getCommand())){
audit(request,response);
}else {
//分页查询
search(request,response);
}
} /**
* 删除
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
private void del(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String[] flowCardVouNos=request.getParameterValues("selectFlag");
flowCardManager.delFlowCard(flowCardVouNos);
response.sendRedirect(request.getContextPath()+"/servlet/flowcard/FlowCardServlet");
}
可是这样写又有什么弊端呢?由于if语句的不稳定性,为什么这么说呢?上面有了加入,删除,查询,送审的功能。那么如今我要加入改动的功能。我就须要改动代码--违反了OCP原则。所以它适应需求的能力就比較差。
以上是针对struts能解决的问题。再反过来看我们不用struts时我们程序中会出现的问题进行陈述,当然struts不仅仅仅仅攻克了这些问题,上面所述仅仅是为了帮助大家理解简单的举例,理解的不正确还请大家指正!下篇博客将继续叙述struts是怎样解决上述问题的及它的实现原理!
【SSH 基础】SSH框架--struts深入具体解释(一)的更多相关文章
- 菜鸟学习SSH(一)——Struts实现简单登录(附源码)
从今天开始,一起跟各位聊聊java的三大框架——SSH.先从Struts开始说起,Struts对MVC进行了很好的封装,使用Struts的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时 ...
- 菜鸟学SSH(一)——Struts实现简单登录(附源码)
从今天开始,一起跟各位聊聊java的三大框架——SSH.先从Struts开始说起,Struts对MVC进行了很好的封装,使用Struts的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时 ...
- SSH 基础
什么是SSH? 传统的网络服务程序,如:ftp.pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据.而且,这些服务程序的安全验 ...
- linux基础-ssh服务
SSH ssh 服务是实现管路服务器的一种方式: 本地管理(安装系统,故障修复),ssh 远程连接 linux 可以是实现远程连接的方式:ssh 命令 windows 可以实现远程连接方式: xshe ...
- 第1章 ssh和SSH服务(包含隧道内容)
本文对SSH连接验证机制进行了非常详细的分析,还详细介绍了ssh客户端工具的各种功能,相信能让各位对ssh有个全方位较透彻的了解,而不是仅仅只会用它来连接远程主机. 另外,本人翻译了ssh客户端命令的 ...
- [转]ssh和SSH服务(包含隧道内容)
本文对SSH连接验证机制进行了非常详细的分析,还详细介绍了ssh客户端工具的各种功能,相信能让各位对ssh有个全方位较透彻的了解,而不是仅仅只会用它来连接远程主机. 另外,本人翻译了ssh客户端命令的 ...
- java基础之框架篇(1)
框架基础反射:反射是Java开发的一类动态相关机制.因为本身Java语言并不是一款动态语言,如果我们想要得到程序动态的效果,因此便引入了反射机制这一概念. 问题:Java中创建实例化对象有哪些方式? ...
- ssh和SSH服务(包含隧道内容)
ssh和SSH服务(包含隧道内容) 72.16.10.6:/etc/fstab-->/172.16.10.3:/tmp/a.txt. [root@xuexi ~]# scp 172.16.10. ...
- Linux系统学习 八、SSH服务—SSH远程管理服务
1.SSH简介 ssh(安全外壳协议)是Secure Shell的缩写,是建立在应用层和传输层基础上的安全协议.传输的时候是经过加密的,防止信息泄露,比telnet(明文传递)要安全很多. ftp安装 ...
随机推荐
- Socket 编程(二)
首先,看主界面 点击链接按钮,开始建立与服务端的连接 Socket socket = null; private void btnStart_Click(object sender, EventArg ...
- TCP拥塞控制及连接管理
在阅读此篇之前,博主强烈建议先看看TCP可靠传输及流量控制. 一.TCP拥塞控制 在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏——产生拥塞(congestion ...
- Bzoj2120/洛谷P1903 数颜色(莫队)
题面 Bzoj 洛谷 题解 考虑对操作离线后分块处理询问操作(莫队算法),将询问操作按照编号分块后左端点第一关键字,右端点第二关键字排序(分块大小为\(n^{\frac 23}\)),对于每一个询问操 ...
- 使用 Eigen 3.3.3 进行矩阵运算
Eigen是一个能够进行线性代数运算的C++开源软件包,包含矩阵和矢量操作,Matlab中对矩阵的大多数操作都可以在Eigen中找到. 最近需要计算厄米特矩阵的逆,基于LLT分解和LDLT分解,自己写 ...
- ls 大全
ls命令是linux下最常用的命令.ls命令就是list的缩写缺省下ls用来打印出当前目录的清单如果ls指定其他目录那么就会显示指定目录里的文件及文件夹清单. 通过ls 命令不仅可以查看linu ...
- Socket学习笔记(一)
1.socket介绍 我们知道两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几 ...
- Vue 2.0学习(三)指令与事件
指令(Directives)是Vue.js模板中最常用的一项功能,它带有前缀v-,前面已经使用过v-html.v-pre等.指令的主要职责就是当表达式的值改变时,相应地将某些行为应用到DOM上. v- ...
- 【BZOJ 2119】 2119: 股市的预测 (后缀数组+分块+RMQ)
2119: 股市的预测 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 404 Solved: 188 Description 墨墨的妈妈热爱炒股,她 ...
- 【BZOJ 3561】 3561: DZY Loves Math VI (莫比乌斯,均摊log)
3561: DZY Loves Math VI Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 205 Solved: 141 Description ...
- NOIP2018提高组题解
D1T1:铺设道路 回忆NOIP2013D2T1 积木大赛,发现这两题唯一的区别就是一个是造山一个是填坑,而把填坑的操作反序就是造山,所以可以直接使用那道题的方法. 具体方法是,从左到右每次考虑新的一 ...