如何实现一个Servlet中的多个功能

前言:唉,打脸了,前脚刚说过要跟Servlet正式告别,后脚这不又来了,哈哈,总结出一点东西,纠结了一下还是做个分享吧,学习知识比面子重要,对吧,下回再也不约Servlet了。

需求分析

看下面代码,现在有一个UserServlet,里面有增删改查四个方法,按平常的思维,用一个Servlet实现一个功能,这没毛病,现在问题是一个Servlet中有四个功能,那这该如何去实现呢?

package com.my.servlet;import com.my.service.UserService;
import com.my.service.impl.UserServiceImpl;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet("/user")
public class UserServlet extends HttpServlet {private UserService userService = new UserServiceImpl();public String add(HttpServletRequest request,HttpServletResponse response){userService.add();request.setAttribute("mess","添加成功");return "r:add.jsp";}public String delete(HttpServletRequest request,HttpServletResponse response){userService.delete();request.setAttribute("mess","删除成功");return "f:add.jsp";}public String update(HttpServletRequest request,HttpServletResponse response){userService.update();request.setAttribute("mess","修改成功");return "add.jsp";}public String query(HttpServletRequest request,HttpServletResponse response){userService.query();request.setAttribute("mess","查询成功");return "add.jsp";}}

  

解决思维

解决这个问题其实也简单,再写一个FatherServlet继承于HttpServlet,在这个父类Servlet中的service()方法中通过请求参数判断要调用的子类UserServlet中的哪个方法并执行,可能说到这有些朋友不懂了,如何用参数去判断大家一看下面的代码就明白了,我主要解释一下大家的疑惑,子类UserServlet如何去调用父类FatherServlet中的service()方法,其实秘诀就在这个参数上,在访问UserSerlvet时带上请求参数,访问过来后UserServlet中没有解决参数的方法,所以他会在父类FatherServlet中寻找响应的方法,找到后执行,这是继承的,子类继承父类的方法没毛病吧,所以就解决了。

解决完这个问题后我还在service()方法中加了判断是重定向还是转发的思维,这个就友情赠送了,不说了,来,看代码:

FatherServlet

package com.my.servlet;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class FatherServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String m = req.getParameter("m");if (m==null||"".equals(m)){throw new RuntimeException("参数不能为空");}Class c = this.getClass();try {Method method = c.getMethod(m,HttpServletRequest.class,HttpServletResponse.class);Object o =method.invoke(this,req,resp);String rel =String.valueOf(o);//判断返回值的前缀,默认转发,r:重定向  f:转发if (rel.startsWith("r:")){rel =  rel.substring(rel.indexOf(":")+1);resp.sendRedirect(rel);}else if(rel.startsWith("f:")){rel = rel.substring(rel.indexOf(":")+1);req.getRequestDispatcher(rel).forward(req,resp);}else {req.getRequestDispatcher(rel).forward(req,resp);}} catch (NoSuchMethodException e) {throw new RuntimeException("请求的方法不存在!!");} catch (IllegalAccessException e) {throw new RuntimeException("请求方法执行异常!!");} catch (InvocationTargetException e) {throw new RuntimeException("请求方法执行异常!!");}}}

  

UserServlet

package com.my.servlet;import com.my.service.UserService;import com.my.service.impl.UserServiceImpl;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet("/user")public class UserServlet extends FatherServlet {private UserService userService = new UserServiceImpl();public String add(HttpServletRequest request,HttpServletResponse response){userService.add();request.setAttribute("mess","添加成功");return "r:add.jsp";}public String delete(HttpServletRequest request,HttpServletResponse response){userService.delete();request.setAttribute("mess","删除成功");return "f:add.jsp";}public String update(HttpServletRequest request,HttpServletResponse response){userService.update();request.setAttribute("mess","修改成功");return "add.jsp";}public String query(HttpServletRequest request,HttpServletResponse response){userService.query();request.setAttribute("mess","查询成功");return "add.jsp";}}

  

完整演示

此篇主要是解决题目所示的需求,先在需求解决了,做戏还要做全呢,我就把我测试的代码都整理出来,方便新手去学习。

UserDao

package com.my.dao;public interface UserDao {public void add();public void delete();public void update();public void query();}

  

UserDaoImpl

package com.my.dao.impl;import com.my.dao.UserDao;public class UserDaoImpl implements UserDao {@Overridepublic void add() {System.out.println("UserDao中的添加功能实现了");}@Overridepublic void delete() {System.out.println("UserDao中的删除功能实现了");}@Overridepublic void update() {System.out.println("UserDao中的修改功能实现了");}@Overridepublic void query() {System.out.println("UserDao中的查询功能实现了");}}

  

UserService

package com.my.service;public interface UserService {public void add();public void delete();public void update();public void query();}

  

UserServiceImpl

package com.my.service.impl;import com.my.dao.UserDao;import com.my.dao.impl.UserDaoImpl;import com.my.service.UserService;public class UserServiceImpl implements UserService {private UserDao userDao = new UserDaoImpl();@Overridepublic void add() {userDao.add();}@Overridepublic void delete() {userDao.delete();}@Overridepublic void update() {userDao.update();}@Overridepublic void query() {userDao.query();}}

  

UserServlet

package com.my.servlet;import com.my.service.UserService;import com.my.service.impl.UserServiceImpl;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet("/user")public class UserServlet extends FatherServlet {private UserService userService = new UserServiceImpl();public String add(HttpServletRequest request,HttpServletResponse response){userService.add();request.setAttribute("mess","添加成功");return "r:add.jsp";}public String delete(HttpServletRequest request,HttpServletResponse response){userService.delete();request.setAttribute("mess","删除成功");return "f:add.jsp";}public String update(HttpServletRequest request,HttpServletResponse response){userService.update();request.setAttribute("mess","修改成功");return "add.jsp";}public String query(HttpServletRequest request,HttpServletResponse response){userService.query();request.setAttribute("mess","查询成功");return "add.jsp";}}

  

FatherServlet

package com.my.servlet;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class FatherServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String m = req.getParameter("m");if (m==null||"".equals(m)){throw new RuntimeException("参数不能为空");}Class c = this.getClass();try {Method method = c.getMethod(m,HttpServletRequest.class,HttpServletResponse.class);Object o =method.invoke(this,req,resp);String rel =String.valueOf(o);//判断返回值的前缀,默认转发,r:重定向  f:转发if (rel.startsWith("r:")){rel =  rel.substring(rel.indexOf(":")+1);resp.sendRedirect(rel);}else if(rel.startsWith("f:")){rel = rel.substring(rel.indexOf(":")+1);req.getRequestDispatcher(rel).forward(req,resp);}else {req.getRequestDispatcher(rel).forward(req,resp);}} catch (NoSuchMethodException e) {throw new RuntimeException("请求的方法不存在!!");} catch (IllegalAccessException e) {throw new RuntimeException("请求方法执行异常!!");} catch (InvocationTargetException e) {throw new RuntimeException("请求方法执行异常!!");}}}

  

add.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ taglib prefix="z" uri="http://mycompany.com" %><html><head><title>测试页面</title></head><body><h1>测试</h1>${mess}</body></html>

  

测试展示

越努力越幸运

最后来点鸡汤吧,好久没说了,吃苦的年龄就不要选择安逸,别白了少年头,空悲切,人生赢在转折处,改变从现在开始,分享的越多,你的价值增值越大。。。。。。。。。

*****************************************************************************************************

我的博客园地址:https://www.cnblogs.com/zyx110/

转载请说明出处

我不能保证我所说的都是对的,但我能保证每一篇都是用心去写的,我始终认同“分享的越多,你的价值增值越大”,欢迎大家关注我的技术分享“Java匹马行天下”和学习心得分享“匹马行天下”,在分享中进步,越努力越幸运,人生赢在转折处,改变从现在开始!

支持我的朋友们记得点波推荐哦,您的肯定就是我前进的动力。

转载于:https://www.cnblogs.com/zyx110/p/11286828.html

如何实现一个Servlet中的多个功能相关推荐

  1. 利用抽象工厂创建DAO、利用依赖注入去除客户端对工厂的直接依赖、将有关Article的各种Servlet封装到一个Servlet中(通过BaseServlet进行

    利用抽象工厂创建DAO.利用依赖注入去除客户端对工厂的直接依赖.将有关Article的各种Servlet全部封装到一个Servlet中(通过BaseServlet来进行ArticleServlet方法 ...

  2. Jsp/Servlet中实现登录注册功能

    目录 index.jsp: login.jsp: register.jsp: personCenter.jsp: User.java: DBUtil.java: LoginServlet.java: ...

  3. Servlet中的转发

    Servlet中可以把当前的请求和响应转发到另一个Servlet中,并由另一个Servlet负责输出响应.转发时,源Servlet会把它的ServletRequest对象和ServletRespnse ...

  4. jsp 跳到servlet路径_想打开一个jsp的页面就跳转到servlet中去,并向servlet传值。用什么跳转...

    是打开就跳转,不用form提交,也不用超链接. 如果我的xml中servlet的url是:/main 我在JSP中想要跳转到servlet,并且传值到servlet,我知道表单可以这样写: 超链接可以 ...

  5. java 创建servlet_javaweb02-创建第一个Servlet

    学习笔记是参考的how2j 开发第一个Servlet Servlet 本身不能独立运行,需要在一个web应用中运行的,而一个web应用是部署在tomcat中的 所以开发一个servlet需要如下几个步 ...

  6. java中servlet filter_lua学习笔记(二)仿java servlet中Filter功能

    2)代码 Filter.lua--[[ 过滤器接口 ]]-- local FilterChain = require("FilterChain") local Filter = { ...

  7. servlet单实例多线程 ---线程安全问题是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的。(所有建议不要在servlet中定义成员变

    Servlet 单例多线程 Servlet如何处理多个请求访问? Servlet容器默认是采用单实例多线程的方式处理多个请求的: 1.当web服务器启动的时候(或客户端发送请求到服务器时),Servl ...

  8. servlet中response中文乱码

    在servlet中,通过response向浏览器写中文,会出现乱码,那么response向浏览器写数据一共有两种方式 1.getOutputStream.write();字节流 2.PrintWrit ...

  9. 从一个servlet转发到另一个servlet_javaweb02-创建第一个Servlet

    学习笔记是参考的how2j 开发第一个Servlet Servlet 本身不能独立运行,需要在一个web应用中运行的,而一个web应用是部署在tomcat中的 所以开发一个servlet需要如下几个步 ...

最新文章

  1. 存储能否导致ESXi网络性能问题?
  2. 信息系统项目管理案例3
  3. Spring mvc中自定义拦截器
  4. html列表用标记,html标记列表应用
  5. qprocess 最小化启动外部程序_程序员易踩的 9 大坑,教你识别
  6. Vim 命令常用功能详解
  7. linux 按列提取文件名,Linux展示按文件名降序文件
  8. U盘安装CentOS7的最终解决方案
  9. HoloLens 2开发:Pcx 渲染点云单眼显示问题
  10. python运维脚本部署jdk_Python+PyDev+Jdk+Eclipse开发环境部署
  11. Hadoop YARN(入门) —— Hadoop权威指南5
  12. 深入浅出WPF笔记——属性
  13. leetcode 合并两个有序数组
  14. android 设置壁纸上下显示不全,默认锁屏壁纸及锁屏壁纸被拉伸显示不全的问题...
  15. 云计算与大数据概论(1) 云计算,大数据是什么
  16. LTE中的CQI RI PMI参数
  17. 密钥对和AccessKey
  18. whm面板降mysql_WHMCS与Cpanel/WHM面板整合方法-Cpanel/WHM管理使用教程 | 麦田一棵葱...
  19. 【Excel】Excel中实现中文转拼音(自定义函数方式)
  20. python中的self理解

热门文章

  1. jQuery→简介引入、jQuery类数组对象$()与DOM对象、各种选择器、attr()、html() 、text()、val()
  2. [leetcode]190. 颠倒二进制位
  3. 蛮力法 —— 求解最大连续子序列和问题
  4. PBR理论基础3.1:基于图像的光照(下)
  5. LuaForUnity4:Lua的函数
  6. 牛客网暑期ACM多校训练营(第五场): F. take(期望+线段树)
  7. Mysql触发器与动态完整性
  8. 指针和引用的相同与不同
  9. HDU 5980 2016ICPC大连 J: Find Small A
  10. HDU 5935 2016CCPC杭州 C: Car