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

Posted zyx110

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何实现一个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匹马行天下”和学习心得分享“匹马行天下”,在分享中进步,越努力越幸运,人生赢在转折处,改变从现在开始!

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

 

以上是关于如何实现一个Servlet中的多个功能的主要内容,如果未能解决你的问题,请参考以下文章

关于web开发servlet的问题。就比如我一个登陆和注册的功能,我想用一个servlet来实现这两个功能如何实现?

spring4框架中如何实现servlet功能

JAVA EE中如何使用session实现购物车的功能?

java如何实现文件上传和下载的功能

Servlet实现单个图片,多个图片上传和图片的显示功能

(十三)使用handler实现登录验证