zoukankan      html  css  js  c++  java
  • 【SSH进阶之路】一步步重构MVC实现Struts框架——从一个简单MVC开始(三)

    目录:

          【SSH进阶之路】Struts基本原理 + 实现简单登录(二)

          【SSH进阶之路】一步步重构MVC实现Struts框架——从一个简单MVC开始(三)

          【SSH进阶之路】一步步重构MVC实现Struts框架——封装业务逻辑和跳转路径(四)

          【SSH进阶之路】一步步重构MVC实现Struts框架——彻底去掉逻辑判断(五)

          【SSH进阶之路】一步步重构MVC实现Struts框架——完善转向页面,大功告成(六)

     

           上篇【SSH进阶之路】Struts基本原理 + 实现简单登录(二),我们介绍MVC和Struts的基本理论,并实现了一个简单登录的实例。从中我们知道了,Struts是MVC的框架,MVC其实是Model2,M代表了模型,我们可以理解为业务逻辑,V代表了视图,主要是界面显示,使用jsp显示,C代表控制,控制最典型方式是使用servlet,可以获取参数,调用业务逻辑,另外还可以转向其他界面。

          经过对上篇博客的介绍,我们知道了Struts对MVC做了封装,Struts到底是怎么封装的MVC,一直还没有解决,从这篇博客开始,我们一步步重构MVC实现一个基本的Struts框架的雏形,帮助我们更深入的学习Struts的基本流程提供保证。下面我们开始。

          我们严格按照上篇博客Model2的时序图或如下图,使用jsp+servlet来给大家演示一个简单的MVC,一步步的重构,完善,把框架的一个实现给大家引出来。 

     

         

     

    假设是一个关于用户的增、删、改、查的功能,下面我们敲一下各部分的代码。新建java web项目,test_struts1,如下图:

           


    首先,新建一个索引页面,提供一个表单,仅仅提供一个用户姓名,比如实现添加用户功能,作为主界面。


    index.jsp

    <%@ page language="java" contentType="text/html; charset=GB18030"
        pageEncoding="GB18030"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
    <title>Insert title here</title>
    </head>
    <body>
    	<form action="servlet/addUser.do" method="post">
    		姓名:<input type="text" name="username"><br>
    		<input type="submit" value="提交"><br>
    	</form>
    </body>
    </html>

    C,控制器,使用Servlet来实现控制器的职责,取得表单数据,调用业务逻辑,转向页面。客户端一点提交,提交到Servlet,代码如下:

    TestServlet.java

    package com.liang.servlet;
    
    import java.io.IOException;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    /**
     * 使用servlet做相关的控制,转向多个(V)视图
     * @author liang
     *
     */
    public class TestServlet extends HttpServlet {
    
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		//取得访问的URI
    		String reqeuestURI = request.getRequestURI();
    		System.out.println(reqeuestURI);
    		//截取URI,获得路径
    		String path = reqeuestURI.substring(reqeuestURI.indexOf("/",1), reqeuestURI.indexOf("."));
    		System.out.println(path);
    		//获得表单数据
    		String username = request.getParameter("username");
    		
    		UserManager userManager = new UserManager();
    		
    		String forward ="";
    		//根据url执行相关的功能
    		//等于添加,调用添加方法,添加成功转到添加页面
    		if("/servlet/addUser".equals(path)){
    			//调用添加的业务逻辑
    			userManager.add(username);
    			forward ="/add_success.jsp";
    			//删除,调用删除方法,删除成功转到删除
    		}else if("/servlet/delUser".equals(path)){
    			//调用删除的业务逻辑
    			userManager.del(username);
    			forward ="/del_success.jsp";
    		//修改,调用修改方法,修改成功转到修改页面
    		}else if("/servlet/modifyUser".equals(path)){
    			//调用修改的业务逻辑
    			userManager.modify(username);
    			forward ="/modify_success.jsp";
    		//查询,调用查询方法,查询成功转到查询成功页面
    		}else if("/servlet/queryUser".equals(path)){
    			//调用查询的业务逻辑
    			List userList = userManager.query(username);
    			request.setAttribute("userList", userList);
    			forward ="/query_success.jsp";
    		}else{
    			throw new RuntimeException("请求失败");
    		}
    		//统一完成转向
    		request.getRequestDispatcher(forward).forward(request, response);
    	}
    
    	@Override
    	protected void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		doGet(request,response);
    	}
    
    }
    

         控制器需要调用业务逻辑和转到相应页面,给用户提示一下,成功或失败,代码如下:


    M,业务逻辑,我们完成增、删、改、查的功能,不再操作数据库,以控制台打印信息的形式,做简单的演示。

    UserManager.java

    package com.liang.servlet;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class UserManager {
    
    	//添加用户
    	public void add(String username){
    		
    		System.out.println("UserManager.add()-->>>username:" + username);
    	}
    	//删除用户
    	public void del(String username){
    		
    		System.out.println("UserManager.del()-->>>username:" + username);
    	}
    	//修改用户
    	public void modify(String username){
    	
    	System.out.println("UserManager.modify()-->>>username:" + username);
    	}
    	//查询用户
    	public List query(String username){
    		
    		System.out.println("UserManager.query()-->>>username:" + username);
    		List userList = new ArrayList();
    		userList.add("a");
    		userList.add("b");
    		userList.add("c");
    		userList.add("d");
    		return userList;
    		
    	}
    }
    

    转向页面,添加成功jsp:

    add_success.jsp

    <%@ page language="java" contentType="text/html; charset=GB18030"
        pageEncoding="GB18030"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
    <title>Insert title here</title>
    </head>
    <body>
    	添加成功!
    </body>
    </html>

    删除成功页面和修改成功页面同上,只有一句表示不同页面。

    查询成功页面,query_success.jsp

     

    <%@ page language="java" contentType="text/html; charset=GB18030"
        pageEncoding="GB18030"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
    <title>Insert title here</title>
    </head>
    <body>
    	查询成功!
    	<p></p>
    	<%=request.getAttribute("userList") %>
    </body>
    </html>

    配置信息web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 
    	xmlns="http://java.sun.com/xml/ns/javaee" 
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
      <!-- 配置TestServlet类 -->
      <servlet>
      	<servlet-name>TestServlet</servlet-name>
      	<servlet-class>com.liang.servlet.TestServlet</servlet-class>
      </servlet>
      <!-- 怎么访问,与jsp的action的路径一致 -->
      <servlet-mapping>
      	<servlet-name>TestServlet</servlet-name>
      	<!-- 只要是.do请求都会到达servlet -->
      	<url-pattern>*.do</url-pattern>
      </servlet-mapping>
      
    </web-app>
    


    最后,搭建tomacat,部署访问。控制台的打印信息,成功的跳转页面不再展示,效果如下:




    如果你想访问业务逻辑其他功能,只需要修改index.jsp中的action的值即可。到此为止,我们实现了一个简单的用于增删改查用户功能的MVC。


    我们现在看一下上面TestServlet的代码,有很多的问题:

    1、所有的业务逻辑和跳转路径都耦合在TestServlet这个类里面了。想添加其他需求,需要修改TestServlet,违反了开放封闭原则

    2、在Servlet里面存在很多的if-else语句,if语句很不稳定,总需要改变。

         假如要再添加一个查询功能,需要修改servlet,添加一个if..else语句,太麻烦了,违反了开放封闭原则,扩展性一点都不好。

    3、所有的转向页面都写死了,显示和控制分离,如果想换一个视图,要修改代码。



         我们一步步将上面的问题都解决,最后实现Struts框架的雏形。下篇博客【SSH进阶之路】一步步重构MVC实现Struts框架——封装业务逻辑跳转路径(四),首先解决我们的第一个问题。


         源码下载



  • 相关阅读:
    使用 pymssql 调用存储过程
    控制input框的输入格式
    Pycharm创建指定版本的Django
    div在页面中居中显示
    odoo12--centos7搭建odoo12
    odoo12--models模型
    odoo12--创建第一个模块
    odoo12模块目录
    odoo12代码目录说明
    win10安装odoo12教程
  • 原文地址:https://www.cnblogs.com/ainima/p/6330998.html
Copyright © 2011-2022 走看看