`

【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框架——封装业务逻辑跳转路径(四),首先解决我们的第一个问题。

 

源码下载

 

 

分享到:
评论

相关推荐

    SSH 框架 struts-2.3.34 spring4.3.12 hibernate5.0.12

    SSH框架,全称为Struts2、Spring和Hibernate的组合,是Java Web开发中常见的三大开源框架集成。这个框架集合提供了一种高效且强大的方式来构建企业级应用,它整合了模型-视图-控制器(MVC)设计模式、依赖注入(DI)...

    ssh实现的校园招聘网站,是学习ssh的入门资料,概括了大部分的ssh框架

    这个“ssh实现的校园招聘网站”项目,是一个理想的学习资源,旨在帮助初学者理解SSH框架的集成与实际应用。 Spring框架作为核心的IoC(Inversion of Control)和AOP(Aspect-Oriented Programming)容器,负责管理...

    struts2+hibernate+spring三大框架技术

    MVC(Model-View-Controller)是一种软件架构设计模式,它将应用程序分为三个基本部分:模型(Model)、视图(View)与控制器(Controller)。这种分离有助于管理复杂的应用程序,使各个部分能够独立开发、测试和...

    精讲SSH框架工作原理

    SSH框架主要包括三个核心部分:Struts(S)、Spring(S)和Hibernate(H)。每个部分都承担着不同的职责: - **Struts**:作为MVC框架中的控制器部分,负责处理用户的请求,并且转发给适当的模型处理。 - **Spring*...

    SSH框架工作原理.doc

    SSH框架,全称为Spring、Struts和Hibernate,是Java企业级开发中常用的一种开源框架组合。这个框架集合提供了模型-视图-控制器(MVC)的架构模式,用于构建高效、可扩展且易于维护的Web应用程序。以下是SSH框架各...

    ssh例子带数据库

    SSH框架是Java开发中常用的三大框架整合,包括Struts2、Hibernate和Spring。这个压缩包文件包含了一个已经配置好的SSH框架实例,以及一个数据库脚本和测试文件,非常适合初学者学习和快速上手。 首先,Struts2是MVC...

    稍微用SSH重构当当网

    【标题】"稍微用SSH重构当当网"指的是利用SSH(Spring、Struts、Hibernate)这一经典的Java Web开发框架组合来重新设计和实现当当网的某些功能或系统架构。SSH是一个流行的企业级Web应用程序开发框架,它由Spring...

    ssh2+mysql论坛完整代码和数据库文件

    SSH2+MySQL论坛完整代码和数据库文件是一套基于SSH2(Spring、Struts2、Hibernate)框架和MySQL数据库实现的论坛系统。这个资源对于学习Java Web开发,特别是SSH2框架的实战应用非常有价值。SSH2是Java开发中常见的...

    ssh框架开发博客eclipse版

    SSH框架是Java Web开发中常用的三大框架整合,包括Spring、Struts和Hibernate。Spring作为核心容器,负责管理对象和依赖注入;Struts处理MVC模式中的Controller层,负责请求分发;Hibernate则作为持久化层,用于...

    Struts-Spring-Hibernate框架整合方案

    Struts-Spring-Hibernate(SSH)框架整合是Java Web...这样,整个SSH框架就能协同工作,形成一个完整的MVC架构,实现高效的Web应用开发。在处理复杂业务逻辑和大数据操作时,SSH框架的灵活性和可扩展性得到了充分体现。

    idea14+maven+struts+spring+mybatis框架

    标题 "idea14+maven+struts+spring+mybatis框架" 描述的是一个使用IntelliJ IDEA 14集成开发环境,结合Maven构建工具,以及SSH(Struts、Spring、Hibernate)经典企业级开发框架,并融入MyBatis持久层框架的项目。...

    ssh实现实验室设备管理系统

    SSH 是一个流行的 Java Web 开发框架,它由 Spring、Struts 和 Hibernate 三个开源项目组成。这个“SSH 实现实验室设备管理系统”项目利用了 SSH 框架的强大功能,构建了一个高效、稳定且功能丰富的系统。以下是关于...

    计算机毕业设计项目源码:毕业设计javaWeb三大框架SSH网上订餐系统.rar

    毕业设计javaWeb三大框架SSH网上订餐系统.rar”表明这是一个基于JavaWeb技术的毕业设计项目,采用的是经典的SSH(Spring、Struts和Hibernate)三大框架,以及BootStrap前端框架来实现的网上订餐系统。这个系统可能...

    ssh框架解析

    SSH框架是Java开发中非常经典的一种框架组合,它由Spring、Struts和Hibernate三个框架组成,分别对应业务层、表现层和持久层,提供了一种高效的Java Web应用开发模式。下面我们详细解析SSH框架中的关键知识点。 ###...

    ssh网上书店代码

    SSH网上书店代码是一个基于Struts、Spring和Hibernate这三个框架集成开发的项目,旨在实现一个简易的在线购书系统。SSH是Java开发Web应用时常用的三大框架,分别负责表现层、业务逻辑层和数据访问层的功能。 1. **...

    java ssh crm项目

    SSH是Spring、Struts和Hibernate三个开源框架的缩写,它们共同构成了Java Web开发的强大基石。这个项目利用这三个框架的优势,构建了一个功能完善的CRM解决方案,旨在帮助企业管理客户信息、跟踪销售线索、优化业务...

    后台框架SSH

    这个框架集合了三个强大的开源组件,分别负责MVC(Model-View-Controller)架构模式的实现、依赖注入与管理以及持久层的数据操作。 1. **Struts2**:Struts2是一个基于MVC设计模式的Web应用框架,它继承了Struts1的...

    基于SSH框架的java CRM客户关系管理系统

    1. Struts2:Struts2作为MVC(Model-View-Controller)设计模式的实现,是Java Web开发中的主流框架之一。它负责处理HTTP请求,提供一套灵活的控制层,使得开发者可以方便地定义请求处理逻辑,实现业务与视图的分离...

    基于Java的商城项目后台(ssh)

    SSH(Spring、Struts、Hibernate)是一个经典的Java Web开发框架,常用于构建企业级应用,如本案例中的商城项目后台。这个项目使用了SSH三大框架的集成,提供了高效、灵活的开发环境。 1. **Spring框架**:作为核心...

Global site tag (gtag.js) - Google Analytics