专栏首页泰斗贤若如如何实现一个Servlet中的多个功能

如何实现一个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 {

    @Override

    protected 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 {

    @Override

    public void add() {

        System.out.println("UserDao中的添加功能实现了");

    }



    @Override

    public void delete() {

        System.out.println("UserDao中的删除功能实现了");

    }



    @Override

    public void update() {

        System.out.println("UserDao中的修改功能实现了");

    }



    @Override

    public 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();

    @Override

    public void add() {

        userDao.add();

    }



    @Override

    public void delete() {

        userDao.delete();

    }



    @Override

    public void update() {

        userDao.update();

    }



    @Override

    public 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 {

    @Override

    protected 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匹马行天下”和学习心得分享“匹马行天下”,在分享中进步,越努力越幸运,人生赢在转折处,改变从现在开始!

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 完整案例分析再加知识整合——艾特抽象工厂模式,超详细的

    泰斗贤若如
  • 求素数——多线程练

    泰斗贤若如
  • 项目案例模板之登录注册的实现

    ********************************************************************************...

    泰斗贤若如
  • 如何实现一个Servlet中的多个功能

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

    用户1564362
  • 基于HTTP请求的多线程实现类--视频讲解

    上期将了定时和定量两种压测模式的虚拟类,本期分享一下基于单个HTTP请求对象HTTPrequestbase的两个压测模式的具体实现类。比较关键的就是GCThre...

    八音弦
  • 深入理解RPC之传输篇

    RPC 被称为“远程过程调用”,表明了一个方法调用会跨越网络,跨越进程,所以传输层是不可或缺的。一说到网络传输,一堆名词就蹦了出来:TCP、UDP、HTTP,同...

    kirito-moe
  • 深入理解Java继承、封装、多态的实现原理

    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看

    Java技术江湖
  • React第三方组件3(状态管理之Flux的使用③TodoList中)

    本教程总共5篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章! 1、React第三方组件3(状态管理之Flux的使用①简单...

    前端人人
  • 红包的收益(人人网2017春招真题)

    如你所知,中国素来有发红包的习俗。 新年要到了,小明想要知道朋友圈里每个人的收益。 每个人有mi数量的钱用来发红包,并且这笔钱会平均地发给ki个人(收益...

    AI那点小事
  • 试水jdk8 stream

    Java8中有两大最为重要的改变。第一个是Lambda 表达式;另外一个则是Stream API(java.util.stream.*)。

    陈灬大灬海

扫码关注云+社区

领取腾讯云代金券