• 【SSH 基础】SSH框架--struts深入具体解释(一)


        学习了struts,可是对于它的由来,以及为什么使用actionstruts.xml的方式而不採用曾经的servlet方式。有些疑问,究竟之前的方式有什么弊端,struts又给我们带来了什么便利?

    以下一一为大家解答!

     

    struts的由来:

     

    随着JSP与Servlet 技术大量应用于以Web为基础的应用程序,为了提升Web 应用程序可维护性与反复使用性。Java开发者提出了一些较佳的开发模式。比較常见的两种JSP应用架构分别为Model1 与Model 2。详情參见(JAVA学习篇--JAVA的两种编程模式对照

     

    简单回想两种模型:

     

        Mode1 1是一个以JSP文件为中心的模式, JSP不仅负责表现逻辑。也负责控制逻辑。逻辑耦合在页面中。这种处理方式,对一些规模非常小的项目是能够的,可是用在开发大型项目时,页面非常难把握流向,界面间关联性太强,使得程序的改动与维护变得困难;此外程序逻辑与页面显示交叉,既不便于分工合作也不利于代码的重用,这种程序其健壮性和可伸缩性都不好。


        Model 2Servlet扮演前端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,那么删除,改动,查询呢,对于一个功能块来说,就最少须要4servlet来管理,那么这么多个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是怎样解决上述问题的及它的实现原理!

     



  • 相关阅读:
    hdu2089 数位dp
    AIM Tech Round 3 (Div. 2)
    Codeforces Round #372 (Div. 2)
    src 小心得
    水平文字垂直居中
    点击验证码刷新(tp3.1)--超简单
    TP3.1 中URL和APP区别
    getField方法
    PHP截取中文无乱码函数——cutstr
    substr — 详解
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6747094.html
Copyright © 2020-2023  润新知