BaseServlet的封装

创建BaseServlet的必要性

如果不创建BaseServlet,现在我们只要实现一个功能,我们就需要创建一个servlet!

例如:用户模块(登录,注册,退出录,激活,发送邮件等等功能) 也就是说,我们必须要创建一些系列的Servlet:UserLoginServlet - 登录功能!  UserRegisterServlet ->注册功能!

总之,只要你实现一个功能,你就得创建-个servlet!

这种情况会有两个弊端!

1.创建大量的servlet!servet实例-> web容器(tomcat)管理!有大量的servlet实例必然会占有更大的
运行内存!会间接的拖慢web容器的速度!

2.servlet 他的service(dogel/dopost)方法是一个多线程方法!也就说理论上说!一个servlel可以处理很多次请求,也可以并发的 处理请求,一个servlel能力很强!  但是只对应一个功能!你不觉得浪费么?

Baseservlet我们想解决的问题就是!简化和优化servlet的创建和数量!

Baseservlet的实现思路

1.为什么一个servlet只对应一个功能!

一个serviet被访问以后,只会有一个方法被调用,通常我们习惯一个方法中写一个套业务逻辑!

一个servlet对应一个方法对应一个业务功能!

2.分析Baseservlet实现的思路

1.让一个servet对应多个方法就好了!  每个方法都实现一个业务逻辑!

2.具体的实现思路

步骤1:在一个servlel声明多个处理业务逻方法!

步骤2:在每次访问servlet的时候在路径上添加一个标识!  标识(method)用于判断要访问具体业务逻辑方法!

步骤3:当每次请求到 doget/dopost/service方法的时候,判断参数的标识,调用对应的业务逻辑方
法即可!

Baseservlet的实现

1.实现基本的Baseservlet

步骤1:Baseservlet继承httpservlet类,重写其service方法

步骤2:在service方法中获得具体要执行的方法如(登录,注册等),在执行

2.优化方法调用

利用标识符的字符串和方法名相同!

我们可以利用反射的技术!调用对应的执行方法!

避免了大量的if或switch判断!

当有新的方法出现的时候!也不需要额外的添加判断方法!

3.优化多Servlet实现

实现思路:

我们创建一个BascServlet类,让他去继承HttpServlet!BaseServlet中写service方法!

在service写 1.获取标识 2.反射调用业务逻辑

每个模块对应的Controller只需要集成Baseservlet即可!

HttpServlet->BaseServlet->模块的Controller

4.优化返回值问题

每个方法都要进行响应

响应的方式固定: 转发 重定向 返回字符串 返回字节流

如果在每个方法写转发和重定向和返回字符串的语法比较繁琐!

我们可以统一在Baseservlet进行处理!

操作:

步骤1:将方法的返回值改成字符串即可!

步骤2: 根据约定的内容,添加特殊的标识!

例如:转发“forward: 路径”

步骤3:BaseServlet集中处理
执行方法!获取返回值!进行非空判断!

截取标识!进行转发重定向或者写回字符串处理!

好处:简化方法的响应的操作!

注意:没有管返回字节!

返回字节!我们只需要将方法的返回值改成void!

整体实现代码样例

BaseServlet代码

package controller;

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.Method;

import static utils.Constants.*;



public class BaseServlet extends HttpServlet {
    @Override
    public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        try {
            //防止乱码
            req.setCharacterEncoding("UTF-8");
            res.setCharacterEncoding("UTF-8");
            res.setContentType("text/html;charset=utf-8");

            //得到方法的名称
            String m=req.getParameter(TAG);

            if(m==null||m.isEmpty()){
                m=INDEX;
            }

            Class<? extends BaseServlet>clazz=this.getClass();

            //获取要执行的方法
            Method method = clazz.getDeclaredMethod(m, HttpServletRequest.class, HttpServletResponse.class);
            method.setAccessible(true);

            //得到返回值再进行判断是什么操作:转发 重定向 字符串(json)
            Object result = method.invoke(this, req, res);

            if(result!=null){
                String path=(String) result;

                if(path.startsWith(FORWARD)){ //转发
                    System.out.println("执行了转发");
                    path=path.replace(FORWARD,"");
                    req.getRequestDispatcher(path).forward(req,res);
                }
                else if(path.startsWith(REDIRECT)){ //重定向
                    System.out.println("执行了重定向");
                    path=path.replace(REDIRECT,"");
                    res.sendRedirect(path);
                }
                else{ //字符串(json)
                    res.getWriter().println(path);
                }
            }
        } catch (Exception  e) {
            e.printStackTrace();
            System.out.println("BaseServlet异常处理");
        }
    }

    //方法为空
    public String index(HttpServletRequest req, HttpServletResponse res){
        return FORWARD+"路径";
    }
}

Usercontroller类代码

package controller;

import com.google.gson.Gson;
import pojo.Result;
import pojo.student;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/Login")
public class UserController extends BaseServlet {

    //登录功能
    public String login(HttpServletRequest req,HttpServletResponse res) throws IOException {
        String account = req.getParameter("account");
        String password = req.getParameter("password");
        System.out.println(account);
        System.out.println(password);

        //设置响应格式为json
        res.setContentType("application/json");

        // 创建一个示例对象
        Result dataObject = new Result(1,"json请求测试",new student("张三",14));

        // 将对象转换为 JSON 字符串
        Gson gson = new Gson();
        String json = gson.toJson(dataObject);

        System.out.println(json);

        return json;
    }
}

工具类

package utils;

public class Constants {
    public static final String TAG="method";
    public static final String FORWARD="forward:";
    public static final String REDIRECT="redirect:";
    public static final String INDEX="index";
}

测试

前端发送请求:

后端响应数据:

 前端响应数据:

json格式字符串

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/783432.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ASO优化不仅仅是苹果商店,安卓商店同样不可忽视

大家一谈起ASO优化&#xff0c;不少人反应大多数都是IOS市场的优化&#xff0c;其实安卓也是不可分割的大市场&#xff0c;在国内手机应用市场&#xff0c;安卓的用户质量在稳步提高&#xff0c;因此开发者也越来越重视安卓市场的推广。做好安卓ASO也是非常必要的。 一、安卓市…

音视频质量评判标准

一、实时通信延时指标 通过图中表格可以看到&#xff0c;如果端到端延迟在200ms以内&#xff0c;说明整个通话是优质的&#xff0c;通话效果就像大家在同一个房间里聊天一样&#xff1b;300ms以内&#xff0c;大多数人很满意&#xff0c;400ms以内&#xff0c;有小部分人可以感…

五行、八卦、天干、地支

零基础入门&#xff1a;五行、八卦、天干、地支 给她家推荐一个小程序&#xff0c;感觉挺准的&#xff01;

PTrade常见问题系列5

回测失败&#xff1a;可用资源不足。 回测运行失败&#xff0c;错误码&#xff1a;2 错误信息&#xff1a;可用资源不足&#xff0c;请稍后在创建。 1、之前客户未限制客户容器使用内存和CPU&#xff0c;周末修改配置&#xff0c;限制了内存和CPU&#xff1b; 2、此报错是用户…

51-3 内网信息收集 - 获取RDP密码信息(没有实验成功)

获取常见应用软件凭据 注意: %USERPROFILE% 是环境变量。在使用系统权限时,可以将 %USERPROFILE% 替换为绝对路径,或使用其他用户的令牌进行操作。 获取 RDP 保存的凭据(远程桌面) 为了避免每次连接服务器都进行身份验证,经常使用 RDP 远程桌面连接远程服务器的用户可能…

STM32蓝牙HID实战:打造低功耗、高性能的客制化键盘

一、项目概述 本项目旨在使用STM32单片机打造一款功能强大的蓝牙客制化键盘&#xff0c;它拥有以下特点&#xff1a; 九键布局&#xff0c;小巧便携: 满足日常使用需求&#xff0c;方便携带。全键可编程: 所有按键和旋钮均可通过电脑软件自定义快捷键&#xff0c;实现个性化功…

融资融券两融技巧,开通条件和费用详情4%

融资融券费用 融资融券有两项费用&#xff0c;分别是利息和交易佣金。一般情况下融资年息是5%&#xff0c;融券年息是9.35%&#xff0c;目前有极少数一部分券商能够做到4.5%&#xff0c;融资20万一天只需要25元。 然后咱们再看看交易佣金&#xff0c;目前市面上万分之3到千分…

【基于R语言群体遗传学】-12-超显性与次显性

欢迎先看前面的博客&#xff0c;再继续进行后面的内容&#xff1a; 群体遗传学_tRNA做科研的博客-CSDN博客 当杂合子的适应度超出纯合子的范围时&#xff0c;二倍体能够展现出更多令人着迷的选择实例。这种形式的一种是杂合子优势&#xff0c;或称为“超显性”&#xff0c;其…

(三)前端javascript中的数据结构之链表上

在js中&#xff0c;没有为我们提供原生的数据结构支持的&#xff0c;但是在java中是有提供的。所以需要我们去模拟这种结构实现。 链表中最关键的一个元素&#xff0c;就是头节点&#xff0c;头节点不存储数据&#xff0c;指向第一个节点链表中几乎所有的操作都要从头结点开始。…

数字流的秩

题目链接 数字流的秩 题目描述 注意点 x < 50000 解答思路 可以使用二叉搜索树存储出现的次数以及数字的出现次数&#xff0c;方便后续统计数字x的秩关键在于构建树的过程&#xff0c;如果树中已经有值为x的节点&#xff0c;需要将该节点对应的数字出现次数加1&#xf…

味全财税数字化实践分享,百望云助力实现数电票管理能力升级!

随着金税四期的启动&#xff0c;数电票全面落地应用&#xff0c;这不仅大幅提高了发票处理效率&#xff0c;更重塑了企业的财务管理流程&#xff0c;为企业财务数字化转型指明了新的方向。 杭州味全食品有限公司&#xff08;以下简称“味全”&#xff09;正在推进财税数字化建设…

(2024,稀疏 MoE,大量小专家,参数高效专家检索 PEER,product key 检索)混合百万专家

Mixture of A Million Experts 公和众与号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. 简介 2. 方法 3. 实验 0. 摘要 标准 Transformer 架构中的前馈&#xff08;feedforward&a…

轻松集成,高效变现:Flat Ads SDK助力开发者轻松跨越广告变现门槛

在当今的移动应用开发领域,广告变现是开发者们普遍关注的重要话题。如何在不影响用户体验的前提下,最大化地实现广告收益,成为了许多开发者面临的挑战。为此,Flat Ads SDK 应运而生,它以“轻松集成,合规守护,高效变现”为核心理念,帮助开发者轻松解决流量变现难题。 一、高效变…

tauri + vue3 如何实现在一个页面上局部加载外部网页?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

惟客数据Q2荣誉成绩单新鲜出炉

作为众多头部企业客户的数字化经营合作伙伴 WakeData惟客数据一直坚持以客户为中心&#xff0c;以数据驱动 致力于让数据智能商业落地更敏捷 凭借值得信赖的客户经营数字化和资源管理数字化实力 惟客数据在2024年第二季度斩获多项荣誉 1、 第一新声《2023年度中国高科技高…

从入门到精通:Shopee,lazada,temu自养号测评成本、步骤、技巧详解

测评对于卖家来说是一种成本低回报快的推广方式&#xff0c;可以减少高额的平台广告费用&#xff0c;因此是一种很好的辅助手段&#xff0c;对商品的曝光、流量、转化和权重等方面起到了很好的辅助作用 建议还是自己精养一批账号&#xff0c;账号在自己手里比较安全可控&#…

python中getattr/setattr/hasattr/delattr函数都是干什么的?

目录 1、getattr&#xff1a;动态获取属性 &#x1f50d; 1.1 动态获取属性 1.2 默认值处理技巧 1.3 实战案例&#xff1a;配置文件动态加载 2、setattr&#xff1a;动态设置属性 &#x1f6e0; 2.1 修改对象属性 2.2 新增属性场景 2.3 应用场景&#xff1a;类的动态配置…

Linux 命令历史、补全和正则表达式

1.命令历史就和windows的ctrlz一个概念&#xff0c;就是返回上一次的命令。 按下小键盘上下切换 ctrlc可以终止本次输入&#xff0c;进行下一次输入。 2.tab键可以自动补全&#xff08;有点鸡肋&#xff09; 3.正则表达式 类似于word的快速搜索&#xff0c;Linux也是用*和…

浅析C++引用

浅析C引用"&" ​ C中引入了一个新的语言特性——引用(&)&#xff0c;它表示某一对象的别名&#xff0c;对象与该对象的引用都是指向统一地址。那么我们就来看看关于引用的一些知识点吧&#x1f9d0; 特性 引用在定义时必须初始化一个变量可以有多个引用引…

zdppy_api+vue3+antd前后端分离开发,使用描述列表组件渲染用户详情信息

后端代码 import api import upload import time import amcomment import env import mcrud import amuserdetailsave_dir "uploads" env.load(".env") db mcrud.new_env()app api.Api(routes[*amcomment.get_routes(db),*amuserdetail.get_routes(db…