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

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

原文地址:https://www.cnblogs.com/zyx110/p/11286828.html

时间: 2024-10-03 19:03:27

如何实现一个Servlet中的多个功能的相关文章

一个Servlet中可以有多个处理请求的方法

BaseServlet 一个请求写一个Servlet太过复杂和麻烦,我们希望在一个Servlet中可以有多个处理请求的方法. 客户端发送请求时,必须给出一个参数,用来说明要调用的方法 方法的结构和service()方法的结构一样 初始版 当我们访问Servlet时,发生了那些操作? 首先是通过<url-pattern>找到<servlet-name>,通过<serlvet-name>最终找到<servlet-class>,也就是类名,在通过反射得到Serlv

Servlet中的转发

Servlet中可以把当前的请求和响应转发到另一个Servlet中,并由另一个Servlet负责输出响应.转发时,源Servlet会把它的ServletRequest对象和ServletRespnse对象都传递给目标Servlet.转发需要调用javax.servlet.RequestDispatcher接口的forward方法.转发的路径在生成RequestDispatcher实例的时候传入.有两种方法可生成RequestDispatcher实例,分别: ServletContext的getR

servlet请求转发到另一个servlet

servlet请求转发到另一个servlet,并传递数据 . 1.通过request.setAttribute("key",value)给request加信息. 2.通过request.getRequestDispather(目标servlet).forward(request,response) 传递制定servlet. 3.在另一个servlet中通过request.getAttribute("key")来获取附加信息的值.

在Servlet中出现一个输出中文乱码的问题(已经解)。

在Servlet中出现一个输出中文乱码的问题,已经解. @Override public void doPost(HttpServletRequest reqeust, HttpServletResponse response) throws ServletException, IOException { //PrintWriter out = response.getWriter();在还没有给response指定编码格式时就获取了他的输出流,所以一直乱码 reqeust.setCharact

编写一个简单登录验证需要记录日志,Servlet中的Cookie

登录验证并记录日志 之前介绍了如何使用Server.mysql.tomcat等知识点编写了一个简单的登录验证.但是现在有了一个新的需求,我想要在登录成功的时候往数据库记录一条日志,登录失败的时候也要记录一下.这个日志要记录用户名.用户的IP地址.登录的时间.还有成功或失败的状态标识. 所以现在需要增加一个表格,用于存储日志信息,如图: 因为大部分思路和之前的写登录验证差不多,只是多了个记录日志,所以我这里就不赘述实现的思路了,直接上代码. 1. 首先需要使用html编写出页面,代码示例: CSS

JavaWeb中如何自己创建一个servlet

其实,一个Servlet就是一个java文件,所以创建servlet的过程其实就是创建一个类的过程,接下来我们创建一个Servlet. 比如我们创建一个类名叫作DateServlet的类,使得这个类继承(extends)HttpServlet 重写doGet()和doPost()方法. public class DateServlet1 extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, Http

Servlet中请给出一个Cookie的增删改查的例子。

2.Servlet与Cookie:(视频下载) (全部书籍) 马 克-to-win:Cookie有点像Session.Session是把键值对存在服务器端,一个Servlet存值 ,另外一个Servlet可以取值.Cookie也是以键值对的形式用于读取,不过是保存在客户端 浏览器的某个文本里面.取时,也要从这台机器的这个浏览器上去取.像Session一样,你 也可以设置过期时间,比如“一年”.和Session不同的是:用户可以把自己浏览器的Cookie工作系统关掉.这就是Cookie不如Sess

我的第一个Servlet

学了一个学期JEE,明天就要考试了. 在3月份自己开始准备去努力的复习考研的高数还有英语等学科. 结果到现在才发现,虽说是考的计算机(本专业的)但是考研和技不可兼得. 想想自己没准备考研的时候的每天大部分时间都是在敲代码. 现在做一个简单的动态网站都有些不知如何下手. 但是,对于现在的我来说,并没有后悔,还好上课我认真听过. 代码都是一个一个敲出来的,熟能生巧. 因此,我不会后悔选择考研这条路.虽说不能把大量的时间用于喜欢的代码上,但是虽说都忘得差不多了,但是自己还是会从头学. --------

Servlet入门总结及第一个Servlet程序 (转载)

转载请注明出处http://blog.csdn.net/evankaka 一了解Servlet的概念 二Servlet技术功能 三 Servlet技术特点 四 Servlet生命周期 五servlet工作过程 六 Servlet与JSP区别 七Servlet代码结构 八 Servlet第一个程序 一.了解servlet 概念 Servlet定义:Servlet是基于Java技术的Web组件,由容器管理并产生动态的内容.Servlet引擎作为WEB服务器的扩展提供支持Servlet的功能.Serv