Servlet系列:两种创建方式(xml,注解)

news2024/11/28 23:10:32

一、使用web.xml的方式配置(Servlet2.5之前使用)

在早期版本的Java EE中,可以使用XML配置文件来定义Servlet。在web.xml文件中,可以定义Servlet的名称、类名、初始化参数等。然后,在Java代码中实现Servlet接口,并覆盖其中的doGet()或doPost()方法来处理请求。

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
        http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>java-servlet-demo02</display-name>
  <!-- servlet配置 -->
  <servlet>
    <!-- 名称 -->
    <servlet-name>WebXmlServlet</servlet-name>
    <!-- servlet全称类名 -->
    <servlet-class>com.mcode.servlet.controller.WebXmlServlet</servlet-class>
    <!-- 启动的优先级,数字越小越先起作用 -->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <!-- 映射配置 -->
  <servlet-mapping>
    <!-- 对应名称 -->
    <servlet-name>WebXmlServlet</servlet-name>
    <!-- 资源匹配规则:精确匹配 -->
    <url-pattern>/webxml</url-pattern>
  </servlet-mapping>
</web-app>

WebXmlServlet

package com.mcode.servlet.controller;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * ClassName: WebXmlServlet
 * Package: com.mcode.servlet.controller
 * Description:
 *
 * @Author robin
 * @Version 1.0
 */
public class WebXmlServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置编码方式
        resp.setCharacterEncoding("UTF-8");
        //指定客户端解码方式
        resp.setHeader("content-type", "text/html;charset=UTF-8");
        //输出
        resp.getWriter().write("基于webxml方式配置的servlet");
    }
}

效果图

image

url-pattern匹配规则
匹配规则取值说明
精确匹配/具体的名称只有url路径是具体的名称的时候才会触发 Servlet
后缀匹配*.xxx只要是以xxx结尾的就匹配触发Servlet
通配符匹配/*匹配所有请求,包含服务器的所有资源
通配符匹配/匹配所有请求,包含服务器的所有资源,不包括.jsp
load-on-startup说明
  1. 元素标记容器是否应该在web应用程序启动的时候就加载这个 servlet

  2. 它的值必须是一个整数,表示 servlet被加载的先后顺序

  3. 如果该元素的值为负数或者没有设置,则容器会当serv1et被请求时再加载

  4. 如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个 servlet,值越小, servlet的优先级越高,就越先被加载。值相同时,容器就会自己选择顺序来加载

二、使用注解的方式配置(Servlet3.0后支持,推荐)

从Java EE 5开始,可以使用注解来创建Servlet。通过在Java类上添加@WebServlet注解,可以将该类作为Servlet来处理。在注解中,可以指定Servlet的名称、URL映射等。

AnnotationServlet

package com.mcode.servlet.controller;

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

/**
 * ClassName: AnnotationServlet
 * Package: com.mcode.servlet.controller
 * Description:
 *
 * @Author robin
 * @Version 1.0
 */
@WebServlet("/annotation")
public class AnnotationServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置编码方式
        response.setCharacterEncoding("UTF-8");
        //指定客户端解码方式
        response.setHeader("content-type", "text/html;charset=UTF-8");
        //输出
        response.getWriter().write("基于注解方式配置的servlet");
    }
}

注意:response中的set的一些方法必须写在response.getWriter()之前

It does not set the response’s characterencoding if it is called after getWriterhas been called or after the response has been committed.

效果图

image

@WebServlet注解

属性:下面是一些常用属性,value和url一般是必须的,但是二者不能共存,若同时指定,一般自动忽略value。

属性名类名属性描述
nameString指定servlet的name属性,等价于<servlet-name>,若没有指定,则默认是类的全限定名
valueString[]等价于urlPatterns,两者不能共存
urlPatternsString[]指定一组servlet的url的匹配模式,等价于<url-pattern>
loadOnStartupint指定servlet的加载顺序,等价于<load-on-startup>
initParamsWebinitParams[]指定一组初始化参数,等价于<init-params>
asyncSupportedboolean申明servlet是否支持异步操作模式,等价于<async-supported>
displayNameStringservlet的显示名,等价于<display-name>
descriptionStringservlet的描述信息,等价于<description>

@WebServlet 属于类级别的注解,标注在继承了 HttpServlet 的类之上。常用的写法是将 Servlet 的相对请求路径(即 value)直接写在注解内,
@WebServlet(urlPatterns = “/MyServlet”)。
@WebServlet(“/MyServlet”) 省略了 urlPatterns 属性名
如果 @WebServlet 中需要设置多个属性,则属性之间必须使用逗号隔开.
通过实现 Serlvet 接口或继承 GenericServlet 创建的 Servlet 类无法使用 @WebServlet 注解。
使用 @WebServlet 注解配置的 Servlet 类,不要在 web.xml 文件中再次配置该 Servlet 相关属性。若同时使用 web.xml 与 @WebServlet 配置同一 Servlet 类,则 web.xml 中 的值与注解中 name 取值不能相同,否则容器会忽略注解中的配置。

三、封装BaseServlet

package com.mcode;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;

/**
 * ClassName: BaseServlet
 * Package: com.mcode
 * Description:
 *
 * @Author: robin
 * @Version: v1.0
 */
public abstract class BaseServlet extends HttpServlet {
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response) {
        try {
          
            request.setCharacterEncoding("UTF-8");
          
            response.setCharacterEncoding("UTF-8");
          
            response.setContentType("text/html;charset=utf-8");
          
            String methodName = request.getParameter("method");
          
            if (methodName == null || methodName.trim().isEmpty()) {
                throw new RuntimeException("您没有传递 method 参数! 无法确定您想调用的方法");
            }
          
            Class<? extends BaseServlet> classz = this.getClass();
          
            Method method = classz.getMethod(methodName, HttpServletRequest.class,
                    HttpServletResponse.class);
          
            method.setAccessible(true);//开启暴力反射

            method.invoke(this, request, response);
          
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

四、测试

UserServlet

package com.mcode;

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

/**
 * ClassName: UserServlet
 * Package: com.mcode
 * Description:
 *
 * @Author: robin
 * @Version: v1.0
 */
@WebServlet("/user")
public class UserServlet extends BaseServlet{
    public void getList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String method = request.getParameter("method");
        HttpSession session = request.getSession();
        session.setAttribute("method",method);
        request.getRequestDispatcher("index.jsp").forward(request, response);
    }
}

index.jsp

引入jsp-api依赖

    <dependency>
      <groupId>jakarta.servlet.jsp</groupId>
      <artifactId>jakarta.servlet.jsp-api</artifactId>
      <version>3.1.1</version>
    </dependency>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
  <a href="/user?method=getList">user</a>
  <%=session.getAttribute("method") %>
<%
   out.println(session.getAttribute("method"));
%>
</body>
</html>

image

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode、2336. 无限集中的最小数字(中等,小顶堆)

文章目录 前言LeetCode、2336. 无限集中的最小数字题目链接及类型思路代码题解 前言 博主所有博客文件目录索引&#xff1a;博客目录索引(持续更新) LeetCode、2336. 无限集中的最小数字 题目链接及类型 题目链接&#xff1a;2336. 无限集中的最小数字 类型&#xff1a;数据…

解析HTTP响应的状态码和头部信息

HTTP响应是客户端与服务器之间通信的重要部分。它包含了服务器对客户端请求的回应&#xff0c;以及与该响应相关的各种信息。在HTTP响应中&#xff0c;有两个关键部分&#xff1a;状态码和头部信息。 状态码 状态码是HTTP响应的第一部分&#xff0c;它是一个三位数字的代码&a…

【AI】RTX2060 6G Ubuntu 22.04.1 LTS (Jammy Jellyfish) 部署Chinese-LLaMA-Alpaca-2

下载源码 cd ~/Downloads/ai git clone --depth1 https://gitee.com/ymcui/Chinese-LLaMA-Alpaca-2 创建venv python3 -m venv venv source venv/bin/activate安装依赖 pip install -r requirements.txt 已安装依赖列表 (venv) yeqiangyeqiang-MS-7B23:~/Downloads/ai/Chi…

CCF认证+蓝桥杯习题训练

贪心 *上取整公式* *代码展示* #include <iostream> #include <cstring> #include <algorithm>using namespace std;const int N 1e5 10;typedef long long LL;int v[N] , a[N];int main() {int n , d;cin >> n >> d;for(int i 1 ; i < n…

oracle19C之grant语句

官网地址&#xff1a;GRANT 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. 授予 目的 使用GRANT 致赠款声明: 用户和角色的系统权限。 表18-1 列出系统权限(由操作的数据库对象组织)。 注意ANY 例如,系统特权,SEL…

Spring5深入浅出篇:Spring与工厂设计模式简介

Spring5深入浅出篇:Spring与工厂设计模式简介 什么是Spring Spring是⼀个轻量级的JavaEE解决⽅案&#xff0c;整合众多优秀的设计模式轻量级 1. 对于运⾏环境是没有额外要求的开源 tomcat resion jetty收费 weblogic websphere 2. 代码移植性⾼不需要实现额外接⼝JavaEE的解…

java多线程传参数

package com.myThread;public class AdminThread extends Thread{private String name;public void AdminThread(String name){this.name name;}Overridepublic void run() {//线程开始之后执行的代码for (int i 0; i < 100; i) {System.out.print(getName()"线程…

Qt/QML编程之路:slider(34)

滑条slider&#xff0c;有时也成为进度条progressbar&#xff0c;在GUI界面中也是经常用到的。 import QtQuick 2.9 import QtQuick.Controls 2.0 import QtQuick.Layouts 1.2ApplicationWindow {id:rootvisible: truewidth: 1920height: 720//title: qsTr("Hello World&q…

matlab快速入门(读取数据并绘制散点图和拉格朗日插值

目录 1.读取excel&#xff1a;2.注释快捷键&#xff1a;3.数组/矩阵索引&#xff1a;4.绘制散点图&#xff1a;5.拉格朗日插值&#xff1a;5.1分割出非空和空的x和y两组数据&#xff1a;5.2插值&#xff1a;5.3画图&#xff1a; 小结&#xff1a; 1.读取excel&#xff1a; [nu…

《动手学深度学习》学习笔记 第9章 现代循环神经网络

本系列为《动手学深度学习》学习笔记 书籍链接&#xff1a;动手学深度学习 笔记是从第四章开始&#xff0c;前面三章为基础知识&#xff0c;有需要的可以自己去看看 关于本系列笔记&#xff1a; 书里为了让读者更好的理解&#xff0c;有大篇幅的描述性的文字&#xff0c;内容很…

Unity之触发器

目录 &#x1f4d5;一、触发器概念 &#x1f4d5;二、碰撞与触发的区别 &#x1f4d5;三、触发器小实例 一、触发器概念 第一次玩侠盗猎车手是在小学&#xff0c;从那以后就开启了我的五星好市民之路。 下面是小编在小破站截的图&#xff0c;这是罪恶都市最开始的地方&a…

数据结构奇妙旅程之二叉树初阶

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

深度好文:MySQL体系结构

MySQL采用的是客户/服务器体系结构&#xff0c;实际是有两个程序&#xff0c;一个是MySQL服务器程序&#xff0c;指的是mysqld程序&#xff0c;运行在存放数据库的机器上&#xff0c;负责在网络上监听并处理来自客户的服务请求&#xff0c;根据这些请求去访问数据库的内容&…

在IntelliJ IDEA中集成SSM项目

SSM项目&#xff1a;springMVC为控制器、spring 为事务层、 MyBatis 负责持久 首先看下集成后项目结构&#xff1a; 1、打开IntelliJ IDEA&#xff0c;点击 "File" -> "New" -> "Project"。 点击Finish&#xff0c;此时我们就已经创建了一…

Git怎么将文件夹上传至github,全过程

小白建议参考github文件上传全流程-新手入门系列&#xff08;超详细&#xff01;&#xff01;&#xff01;&#xff09; 中间可能会有报错 $ ssh -T gitgithub.com ssh: connect to host github.com port 22: Connection timed out 这时&#xff0c;参考&#xff0c;如何解决&a…

REVIT二次开发修改轴网

REVIT二次开发修改轴网 步骤1 步骤2 步骤3 功能实现在这 using System; using System.Collections.Generic; using System.Linq; using

【UE 材质】简单的纹理失真、溶解效果

目录 1. 失真效果 2. 溶解效果 3. 失真溶解 我们一开始有这样一个纹理 1. 失真效果 其中纹理节点“DistortTexture”的纹理为引擎自带的纹理“T_Noise01”&#xff0c;我们可以通过控制参数“失真度”来控制纹理的失真程度 2. 溶解效果 3. 失真溶解

学习JavaEE的日子 day13 封装 static private this 类加载机制

Day13 1. private – 私有化 理解&#xff1a;private是访问修饰符的一种&#xff0c;访问修饰符规定了访问权限. 作用&#xff1a; ​ 1.private修饰属性&#xff1a;该属性只能在类的内部使用 ​ 2.private修饰方法&#xff1a;该方法只能在类的内部使用 应用场景&#xff1…

【算法】算法(模拟、指针等)解决字符串类题目(C++)

文章目录 1. 前言2. 解决 字符串类算法题14.最长公共前缀5.最长回文子串67.二进制求和43.字符串相乘 1. 前言 字符串题目有很多种&#xff0c;这里筛选几个考察模拟、双指针等的题目&#xff0c;并用相关算法解决。 2. 解决 字符串类算法题 14.最长公共前缀 思路 题意分析&…

【Mybatis】说一下 mybatis 的一级缓存和二级缓存

​ &#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Mybatis ⛳️ 功不唐捐&#xff0c;玉汝于成 ​ 目录 前言 正文 一级缓存&#xff08;Local Cache&#xff09;&#xff1a; 范围&#xff1a; 生命周期&#xff1a; 默认开启&…