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角色,客户端的请求不再直接送给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,增加了程序的负担,使我们不容易维护。而即使我们将一个功能块的所有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框架--struts深入详解(一),布布扣,bubuko.com

时间: 2024-10-24 12:52:32

SSH框架--struts深入详解(一)的相关文章

SSH框架的整合详解

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> SSH框架的整合详解 - super_YC的博客 - 博客频道 - CSDN.NET super_YC的博客 记录我生活的一点一滴!我很开心拥有这样一个自己心事的笔记本 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &nbsp [5月书讯]流畅的P

ssh框架构建项目详解--基本概念和struts2

1.ssh是struts+spring+hibernate的继承框架,是目前比较流行的框架,但是已经不如ssm了. 2.集成ssh从职责上分为四层(类似于servlet+jsp+jdbc做项目的三层构架:视图,控制,业务....),分别是表示层,业务逻辑层,数据持久层,域模块层,这样分层可以让程序员短时间内构建一个结构清晰,复用性高,维护方便的web应用程序 a.使用struts作为系统的整体基础架构,负责mvc的分离(模型,视图,控制器), b.在struts框架的模型部分,控制业务反转! c

SSH框架搭建过程详解

Spring.Struts2.Hibernate框架: 具体三大框架的知识以前的文章写过,在这里整合 Spring框架知识:http://www.cnblogs.com/xuyiqing/category/1164340.html Struts2框架知识:http://www.cnblogs.com/xuyiqing/category/1164341.html Hibernate框架知识:http://www.cnblogs.com/xuyiqing/category/1163473.html

SSH框架搭建全过程详解

本项目使用Struts2+spring3+hibernate3: 第一步:引入jar包,具体需要哪些包根据实际情况加入.注意:把jar包导入后需要对所有包Add to Build Path;然后对工程名右键Build Path——>configure Build Path——>Add External JARS选择tomcat路径,添加"servlet-api.jar"  "el-api.jar"  "jsp-api.jar" 这三个

Spring MVC 框架搭建及详解

一.Spring MVC环境搭建:(Spring 2.5.6 + Hibernate 3.2.0) 1. jar包引入 Spring 2.5.6:spring.jar.spring-webmvc.jar.commons-logging.jar.cglib-nodep-2.1_3.jar Hibernate 3.6.8:hibernate3.jar.hibernate-jpa-2.0-api-1.0.1.Final.jar.antlr-2.7.6.jar.commons-collections-3

spring框架 AOP核心详解

AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Aspect(切面):通常是一个类,里面可以定义切入点和通知 (2)JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用 (3)Advice(通知):AOP在特定的切入点上执行的增强处理,有before,after,afterReturning,afterThrowing,around

java的集合框架最全详解

java的集合框架最全详解(图) 前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作的方法. 在Java语言中,Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类).所有抽象出来的数据结构和操作(算法)统称为Java集合框架(JavaCollectionFramework). Java程序员在具体应用时,不必考虑数据结构和算法实现细节,只需要用这

Java的集合框架最全详解(图)

纯个人整理,如有错误请指正. java的集合框架最全详解(图) 前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作的方法. 在Java语言中,Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类).所有抽象出来的数据结构和操作(算法)统称为Java集合框架(JavaCollectionFramework). Java程序员在具体应用时,不必考虑数据

Android网络请求框架AsyncHttpClient实例详解(配合JSON解析调用接口)

最近做项目要求使用到网络,想来想去选择了AsyncHttpClient框架开进行APP开发.在这里把我工作期间遇到的问题以及对AsyncHttpClient的使用经验做出相应总结,希望能对您的学习有所帮助. 首先按照惯例先来简单了解一些AsyncHttpClient网络框架的一些知识. 1.简介 Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用android-a