如何实现一个Servlet中的多个功能
如何实现一个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中的多个功能相关推荐
- 利用抽象工厂创建DAO、利用依赖注入去除客户端对工厂的直接依赖、将有关Article的各种Servlet封装到一个Servlet中(通过BaseServlet进行
利用抽象工厂创建DAO.利用依赖注入去除客户端对工厂的直接依赖.将有关Article的各种Servlet全部封装到一个Servlet中(通过BaseServlet来进行ArticleServlet方法 ...
- Jsp/Servlet中实现登录注册功能
目录 index.jsp: login.jsp: register.jsp: personCenter.jsp: User.java: DBUtil.java: LoginServlet.java: ...
- Servlet中的转发
Servlet中可以把当前的请求和响应转发到另一个Servlet中,并由另一个Servlet负责输出响应.转发时,源Servlet会把它的ServletRequest对象和ServletRespnse ...
- jsp 跳到servlet路径_想打开一个jsp的页面就跳转到servlet中去,并向servlet传值。用什么跳转...
是打开就跳转,不用form提交,也不用超链接. 如果我的xml中servlet的url是:/main 我在JSP中想要跳转到servlet,并且传值到servlet,我知道表单可以这样写: 超链接可以 ...
- java 创建servlet_javaweb02-创建第一个Servlet
学习笔记是参考的how2j 开发第一个Servlet Servlet 本身不能独立运行,需要在一个web应用中运行的,而一个web应用是部署在tomcat中的 所以开发一个servlet需要如下几个步 ...
- java中servlet filter_lua学习笔记(二)仿java servlet中Filter功能
2)代码 Filter.lua--[[ 过滤器接口 ]]-- local FilterChain = require("FilterChain") local Filter = { ...
- servlet单实例多线程 ---线程安全问题是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的。(所有建议不要在servlet中定义成员变
Servlet 单例多线程 Servlet如何处理多个请求访问? Servlet容器默认是采用单实例多线程的方式处理多个请求的: 1.当web服务器启动的时候(或客户端发送请求到服务器时),Servl ...
- servlet中response中文乱码
在servlet中,通过response向浏览器写中文,会出现乱码,那么response向浏览器写数据一共有两种方式 1.getOutputStream.write();字节流 2.PrintWrit ...
- 从一个servlet转发到另一个servlet_javaweb02-创建第一个Servlet
学习笔记是参考的how2j 开发第一个Servlet Servlet 本身不能独立运行,需要在一个web应用中运行的,而一个web应用是部署在tomcat中的 所以开发一个servlet需要如下几个步 ...
最新文章
- 存储能否导致ESXi网络性能问题?
- 信息系统项目管理案例3
- Spring mvc中自定义拦截器
- html列表用标记,html标记列表应用
- qprocess 最小化启动外部程序_程序员易踩的 9 大坑,教你识别
- Vim 命令常用功能详解
- linux 按列提取文件名,Linux展示按文件名降序文件
- U盘安装CentOS7的最终解决方案
- HoloLens 2开发:Pcx 渲染点云单眼显示问题
- python运维脚本部署jdk_Python+PyDev+Jdk+Eclipse开发环境部署
- Hadoop YARN(入门) —— Hadoop权威指南5
- 深入浅出WPF笔记——属性
- leetcode 合并两个有序数组
- android 设置壁纸上下显示不全,默认锁屏壁纸及锁屏壁纸被拉伸显示不全的问题...
- 云计算与大数据概论(1) 云计算,大数据是什么
- LTE中的CQI RI PMI参数
- 密钥对和AccessKey
- whm面板降mysql_WHMCS与Cpanel/WHM面板整合方法-Cpanel/WHM管理使用教程 | 麦田一棵葱...
- 【Excel】Excel中实现中文转拼音(自定义函数方式)
- python中的self理解
热门文章
- jQuery→简介引入、jQuery类数组对象$()与DOM对象、各种选择器、attr()、html() 、text()、val()
- [leetcode]190. 颠倒二进制位
- 蛮力法 —— 求解最大连续子序列和问题
- PBR理论基础3.1:基于图像的光照(下)
- LuaForUnity4:Lua的函数
- 牛客网暑期ACM多校训练营(第五场): F. take(期望+线段树)
- Mysql触发器与动态完整性
- 指针和引用的相同与不同
- HDU 5980 2016ICPC大连 J: Find Small A
- HDU 5935 2016CCPC杭州 C: Car