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

目录:

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

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

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

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

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

 

       Struts的第二篇博客【SSH进阶之路】Struts基本原理 + 实现简单登录(二),我们介绍了MVC和Struts的基本理论,上篇博客【SSH进阶之路】一步步重构MVC实现Struts框架——从一个简单MVC开始(三),我们实现了一个MVC模型,这篇博客我们解决一下上篇博客留下的第一个问题:封装业务逻辑和跳转路径。

       我们先回顾一下上篇博客中的TestServlet的代码:

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 {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//取得访问的URIString 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);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request,response);}}

       

       从TestServlet中我们发现,它就是一个简单的Servlet,它是Struts的前端控制器,负责把所有的URL截取下来,通过IF语句根据URL的不同执行相关的功能,并且添加,删除,修改和查询各自有各自的业务逻辑和跳转路径,我们可以各自的业务逻辑和跳转路径封装成不同的类,并抽象出一个公共接口,如下所示:




下面,我们看一下接口和实现类的代码:


接口Action

package com.liang.servlet;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public interface Action {public String execute(HttpServletRequest req, HttpServletResponse resp)throws Exception;
}

添加用户AddUserAction

package com.liang.servlet;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class AddUserAction implements Action {@Overridepublic String execute(HttpServletRequest req, HttpServletResponse resp)throws Exception {//获取参数String username = req.getParameter("username");UserManager userManager = new UserManager();//调用业务逻辑userManager.add(username);//返回跳转页面return "/add_success.jsp";}}

删除用户DelUserAction

package com.liang.servlet;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class DelUserAction implements Action {@Overridepublic String execute(HttpServletRequest req, HttpServletResponse resp)throws Exception {
<span style="white-space:pre">		</span>//获取参数String username = req.getParameter("username");UserManager userManager = new UserManager();//调用业务逻辑userManager.del(username);//返回跳转页面return "/del_success.jsp";}}

修改用户ModifyUserAction

package com.liang.servlet;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class ModifyUserAction implements Action {@Overridepublic String execute(HttpServletRequest req, HttpServletResponse resp)throws Exception {//获取参数String username = req.getParameter("username");//调用业务逻辑UserManager userManager = new UserManager();userManager.modify(username);//返回跳转页面return "/modify_success.jsp";}}

查询用户QueryUserAction

package com.liang.servlet;import java.util.List;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class QueryUserAction implements Action {@Overridepublic String execute(HttpServletRequest req, HttpServletResponse resp)throws Exception {//获取参数String username = req.getParameter("username");//调用业务逻辑UserManager userManager = new UserManager();List userList = userManager.query(username);req.setAttribute("userList", userList);userManager.query(username);//返回跳转页面return "/query_success.jsp";}}

我们再对比看一下我们封装之后的TestServlet

package com.liang.servlet;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.liang.action.Action;
import com.liang.action.AddUserAction;
import com.liang.action.DelUserAction;
import com.liang.action.ModifyUserAction;
import com.liang.action.QueryUserAction;
/*** 使用servlet做相关的控制,转向多个(V)视图* @author liang**/
public class TestServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//取得访问的URIString reqeuestURI = request.getRequestURI();System.out.println(reqeuestURI);//截取URI,获得路径String path = reqeuestURI.substring(reqeuestURI.indexOf("/",1), reqeuestURI.indexOf("."));System.out.println(path);Action action = null;//等于添加,调用AddUserActionif ("/servlet/addUser".equals(path)) {action = new AddUserAction();//等于删除,调用DelUserAction}else if ("/servlet/delUser".equals(path)) {action = new DelUserAction();//等于修改,调用ModifyUserAction}else if ("/servlet/modifyUser".equals(path)) {action = new ModifyUserAction();//等于查询,调用QueryUserAction}else if ("/servlet/queryUser".equals(path)) {action = new QueryUserAction();}else {throw new RuntimeException("请求失败");}String forward = null;//返回不同的转向页面try {forward = action.execute(request, response);} catch (Exception e) {e.printStackTrace();}//根据路径,统一完成转向request.getRequestDispatcher(forward).forward(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request,response);}}

      通过对比,我们可以发现简单了很多,但是实现的道理基本一样,仍然是将path截取出来,做相应的判断,进入对应的分支,New一个刚写的Action,New谁调谁,但是此时仅仅是完成了功能,系统并不灵活,IF...ELSE并没有去掉,扩展性不好,不能适用需求。


      下篇博客【SSH进阶之路】一步步重构MVC实现Struts框架——彻底去掉判断逻辑(五),我们解决第二个问题:IF...ElSE的问题。


       源码下载



转载于:https://www.cnblogs.com/ainima/p/6330997.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实用工具:推荐Pycharm常用的几款插件

相信对于不少的Python程序员们都是用Pycharm作为开发时候的IDE来使用的&#xff0c;今天来分享几个好用到爆的Pycharm插件&#xff0c;在安装上之后&#xff0c;你的编程效率、工作效率都能够得到极大地提升。 Pycharm插件安装教程 打开file---settings---plugins&#xff0c…

dataframe 添加一行_R语言Data Frame数据框常用操作

来源 | R友舍Data Frame一般被翻译为数据框&#xff0c;感觉就像是R中的表&#xff0c;由行和列组成&#xff0c;与Matrix不同的是&#xff0c;每个列可以是不同的数据类型&#xff0c;而Matrix是必须相同的。Data Frame每一列有列名&#xff0c;每一行也可以指定行名。如果不指…

LeetCode 1737. 满足三条件之一需改变的最少字符数(计数)

文章目录1. 题目2. 解题1. 题目 给你两个字符串 a 和 b &#xff0c;二者均由小写字母组成。 一步操作中&#xff0c;你可以将 a 或 b 中的 任一字符 改变为 任一小写字母 。 操作的最终目标是满足下列三个条件 之一 &#xff1a; a 中的 每个字母 在字母表中 严格小于 b 中…

oracle对查询结果求和_oracle基础知识分享

原文链接&#xff1a;https://page.om.qq.com/page/OO2PXCD6VZ6CVqLqjpU6uShg0以下是本人整理的ORACLE学习的一些基本的语法知识&#xff0c;如有不对的地方&#xff0c;望大家批评指正&#xff0c;如有转载请注明出处&#xff1a;一、ORACLE完整性约束&#xff1a;1.NOT NULL …

Docker官方案例学习

下面以官方的一个demo学习学习。。。 1、进入windows版docker界面&#xff0c;新建文件夹pp 2、进入pp&#xff0c;在目录下新建三个文件 dockerfile.txt&#xff0c;app.py&#xff0c;requirements.txt 2.1 dockerfile文件 # Use an official Python runtime as a parent…

LeetCode 1738. 找出第 K 大的异或坐标值(DP)

文章目录1. 题目2. 解题947 / 3851&#xff0c;前 24.6%2533 / 11282&#xff0c;前 22.5% 1. 题目 给你一个二维矩阵 matrix 和一个整数 k &#xff0c;矩阵大小为 m x n 由非负整数组成。 矩阵中坐标 (a, b) 的 值 可由对所有满足 0 < i < a < m 且 0 < j <…

小案例:基于python的动态时钟,带十二时辰和经络养身

一、前言 1、仅用来研究学习使用。 2、除正常显示时钟外&#xff0c;还可以实时显示当前对应的时辰&#xff0c;和经络养身提示。 3、适合辅助上班族来养生 二、效果如下&#xff1a; 三、源码如下&#xff1a; 动态时钟附带十二时辰显示import turtle # 导入绘图海龟模块 …

【海淘域名】GoDaddy账户被锁定后的解决方法

转载自【美国海淘网】http://www.usahaitao.com/Experience/Detail_2886.html通过ICANN申诉顺利的从国内无良奸商(35互联与商务中国,小编的域名在这2个大的服务商手中。不过开始都是图便宜&#xff0c;不懂得国内域名管理的黑幕&#xff0c;所以从其下属的皮包第三方手里购入域…

回归分析常数项t值没有显著异于零怎么办_线性回归分析思路总结!简单易懂又全面!...

线性回归分析是一种研究影响关系的方法&#xff0c;在实际研究里非常常见。不管你有没有系统学习过&#xff0c;对于线性回归&#xff0c;相信多少都有那么一点了解。即使如此&#xff0c;在实际分析时&#xff0c;还是会碰到很多小细节&#xff0c;让我们苦思冥想困扰很久&…

LeetCode 1733. 需要教语言的最少人数(哈希+枚举)

文章目录1. 题目2. 解题1. 题目 在一个由 m 个用户组成的社交网络里&#xff0c;我们获取到一些用户之间的好友关系。 两个用户之间可以相互沟通的条件是他们都掌握同一门语言。 给你一个整数 n &#xff0c;数组 languages 和数组 friendships &#xff0c;它们的含义如下&a…

在c#中用mutex类实现线程的互斥_面试官经常问的synchronized实现原理和锁升级过程,你真的了解吗...

本篇文章主要从字节码和JVM底层来分析synchronized实现原理和锁升级过程&#xff0c;其中涉及到了简单认识字节码、对象内部结构以及ObjectMonitor等知识点。阅读本文之前&#xff0c;如果大家对synchronized关键字的基本使用还不是很了解的话&#xff0c;推荐阅读笔者之前的一…

TensorFlow 2.x GPU版在conda虚拟环境下安装步骤

先下载安装驱动&#xff1a;https://www.nvidia.cn/Download/index.aspx?langcn&#xff0c;版本要求 WSL cuda 驱动 https://developer.nvidia.com/cuda/wsl 下载安装 anaconda&#xff0c;管理虚拟环境&#xff1a;https://www.anaconda.com/products/individual&#xff0…

如何通过网络将文件传输到嵌入式设备_嵌入式系统 Boot Loader技术内幕,带你完全了解Boot Loader...

一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次&#xff1a;1. 引导加载程序。包括固化在固件(firmware)中的 boot 代码(可选)&#xff0c;和 Boot Loader 两大部分。2. Linux 内核。特定于嵌入式板子的定制内核以及内核的启动参数。3. 文件系统。包括根文件系统和建…

python获取当前路径的方法_Python获取脚本所在目录的正确方法【转】

原博文 2015-09-24 10:21 − 1.以前的方法如果是要获得程序运行的当前目录所在位置&#xff0c;那么可以使用os模块的os.getcwd()函数。如果是要获得当前执行的脚本的所在目录位置&#xff0c;那么需要使用sys模块的sys.path[0]变量或者sys.argv[0]来获得。实际上sys.path是Pyt…

TensorFlow 2.0 - Checkpoint 保存变量、TensorBoard 训练可视化

文章目录1. Checkpoint 保存变量2. TensorBoard 训练过程可视化学习于&#xff1a;简单粗暴 TensorFlow 2 1. Checkpoint 保存变量 tf.train.Checkpoint 可以保存 tf.keras.optimizer 、 tf.Variable 、 tf.keras.Layer 、 tf.keras.Model path "./checkp.ckpt" …

coturn的负载均衡特性_高性能负载均衡

单服务器无论如何优化&#xff0c;无论采用多好的硬件&#xff0c;总会有一个性能天花板&#xff0c;当单服务器的性能无法满足业务需求时&#xff0c;就需要设计高性能集群来提升系统整体的处理性能。高性能集群的本质很简单&#xff0c;通过增加更多的服务器来提升系统整体的…

LintCode MySQL 1928. 网课上课情况分析 I

文章目录1. 题目2. 解题1. 题目 online_class_situation 表展示了一些同学上网课的行为活动。 每行数据记录了一名同学在退出网课之前&#xff0c;当天使用同一台设备登录课程后听过的课程数目&#xff08;可能是0个&#xff09;。 写一条 SQL 语句&#xff0c;查询每位同学第…

python输入十个数输出最大值_python输入十个数如何输出最大值

python输入十个数输出最大值的方法&#xff1a;1、如果是整数的话&#xff0c;使用函数【a, b, c map(int, input().split())】&#xff1b;2、使用函数【Xinput().split()】。 相关免费学习推荐&#xff1a;python视频教程 python输入十个数输出最大值的方法&#xff1a; 第一…

LintCode MySQL 1921. 从不充值的玩家(where not in)

文章目录1. 题目2. 解题1. 题目 描述 A game database contains two tables, player table and recharge table. Write a SQL query to find all players who never recharge. 样例 https://www.lintcode.com/problem/players-who-never-recharge/description 2. 解题 -- …

古风一棵桃花树简笔画_广东有个现实版的“桃花源”,藏于秘境之中,最适合情侣来度假!...

上学时&#xff0c;初闻“芳草鲜美&#xff0c;落英缤纷”&#xff0c;并没有多大感触。直到后来长大离家&#xff0c;每每为生活奔波劳累时&#xff0c;为工作琐碎忧心费神时&#xff0c;才骤然明了当年五柳先生所描绘的“桃花源”该是多少人的脑中所想、心中所向……原以为这…