IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 31、Servelt——尚硅谷JavaWeb(4) -> 正文阅读

[Java知识库]31、Servelt——尚硅谷JavaWeb(4)

作者:language-html

0、Servlet介绍

概念:

  • JavaEE的规范之一【JavaEE提供的接口】
  • 全名Servlet Applet,是JavaWeb提供的三大组件之一

【JavaWeb三大组件:Servlet程序、Filter过滤器、Lstener监听器】

  • Servlet程序是实现Servlet接口,运行在服务器端的Java程序。本质上是一个Java类
  • Servlet对象的创建、运行和销毁通过容器管理【一般是web服务器:Tomcat】
  • 每一个Servlet对象对应一个请求【两个浏览器向服务器发送相同的请求,tomcat会创建两个Servlet对象分别处理请求】

作用:

  • 通过HTTP协议接收客户端数据、处理请求、完成响应
  • 动态生成网页

1、创建Web工程

1-1、使用IDEA Ultimate版本

新建项目——选择Java Enterprise——项目名称——项目地址——项目使用的模板为Web application——项目服务器【已经配置的tomcat】

项目构建系统:默认Maven

项目语言默认Java

单元测试:默认JUnit

域名:默认

打包后名称:默认

SDK:选择使用的JDK

?选择JavaEE版本——因为使用的JDK11和最新版本的Tomcat,因此选择JavaEE9

?生成的工程目录:包含一个Servlet+JSP+web.xml+maven.xml

1-2、使用IDEA??Community版本

方式1:【借助Maven田间tomcat插件:最多的版本是Tomcat7,有Tomcat8-很难找到】

方式2:【借助IDEA插件smarttomcat】

新建项目——使用Maven——指定SDK为JDK——勾选Create from archetype——选择maven-archetype-webapp[选中后下方提示为:a simple java web application]

?在maven界面新增参数:archetypeCatalog=internal

不加参数默认值为remote、local,使用中央仓库的元数据——加载速度非常慢

生成的项目结构

修改pom.xml? ?在plugins节点增加子节点:plugin? ? 添加tomcat插件信息

        <!--增加Tomcat插件-->
        <plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <version>2.1</version>
          <configuration>
            <port>8080</port>
            <path>/</path>
            <uriEncoding>UTF-8</uriEncoding>
            <server>tomcat7</server>
          </configuration>
        </plugin>

使用add Configuration配置:+号? 选择maven

?编辑名称为tomcat——Command line参数——tomcat7:run

?点击运行

?等待加载完毕,浏览器输入地址:localhost:8080? ?即可看到项目中jsp页面内容

仿照Ultimate构建应用结构:需要将新建的java文件夹设置为source root 新建的resource设置为resource root

【设置文件夹后会导致浏览器不能访问:尚未解决】

2、运行模板给定的Web App

》》》注意使用JDK11,一定要选JavaEE9? ?===否则按照要求使用JDK8 + JavaEE8

点击超链接,即可发送请求访问Servlet

?之后测试Servlet访问状态——建议使用页面超链接的方式【而不是直接在浏览器地址中访问】

3、访问自己的Servlet

3-1、Servlet编码

3-1-1、通过实现Servlet接口【JavaEE规范】

实现接口规定的5种方法

package com.example.demo;

import jakarta.servlet.*;

import java.io.IOException;

public class ServletTest implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("容器生成Servlet对象时调用的方法");
    }

    @Override
    public ServletConfig getServletConfig() {
        System.out.println("对外提供获取Servlet配置的方法");
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Servlet接受请求并响应的核心方法");
    }

    @Override
    public String getServletInfo() {
        System.out.println("对外提供获取Servlet信息的方法");
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("容器销毁Servlet对象时,调用的方法");
    }
}

3-1-2、通过继承GenericServlet【只对外暴露Service方法】

package com.example.demo;

import jakarta.servlet.*;

import java.io.IOException;

public class ServletTest extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("通过继承实现的servlet只暴露service方法");
    }
}

3-1-3、通过继承HtpServlet【通过重写Doget、DoPost区分;两种不同的请求】

package com.example.demo;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;


public class ServletTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
        System.out.println("通过重写DoGet方法,可以单独响应页面的get请求");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
        System.out.println("通过重写DoPost方法,可以单独响应页面的Post请求");
    }
}

3-2、注册和配置Servlet访问路径

注册和配置servlet的方法有两种:

注解:与源码充分绑定,是一种分散的元数据

xml:不与源码绑定,是一种集中式的元数据

注解的缺点:分散在源码中不易维护和管理【借助工具会好些】;注解的开启和关闭需要修改源码【需要耦合的,例如数据源等建议使用xml】;注解缺乏灵活性【要么用、要么不用只有确定的两种状态】【一般的配置文件,建议使用xml配置文件,可拓展性和复杂性、可维护性更高;注解的扫描机制较差】

注解的好处:【约定大于配置的原则:注解用于复杂情况下的数据验证和绑定】【xml的配置相对冗长,注解能够简化配置,提高开发效率】【注解比xml更加类型安全,xml只有在运行时才能发现问题】

3-2-1、使用web.xml配置

文件地址:

?每一个Servlet在<web-app>根节点下新增两个子节点

<servlet>:用来注册servlet

<servlet-mapping>:用来确认Servlet的访问url

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">
    <!--在web.xml中注册servlet-->
    <servlet>
        <!--给servlet取别名,一般建议直接使用类名-->
        <servlet-name>MyServlet</servlet-name>
        <!--.java源文件的全类名,不包含后缀-->
        <servlet-class>com.example.demo.MyServlet</servlet-class>
    </servlet>
    <!--在web.xml中确定servlet访问url-->
    <servlet-mapping>
        <!--使用注册时使用的别名-->
        <servlet-name>MyServlet</servlet-name>
        <!--新手阶段使用斜杠+和servlet类名关联性高的单词。-->
        <!--项目内可以直接使用[不加斜杠],转到servlet-->
        <!--外界需要在前面加上项目的访问地址  练习阶段为http;//localhost:8080/项目打包名/MyServlet-->
        <url-pattern>/MyServlet</url-pattern>
    </servlet-mapping>
</web-app>

3-2-2、使用注解

@WebServlet 注解中的参数详解

package com.example.demo;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

@WebServlet(name="MyServlet",value="/MyServlet")
public class ServletTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
        System.out.println("通过重写DoGet方法,可以单独响应页面的get请求");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
        System.out.println("通过重写DoPost方法,可以单独响应页面的Post请求");
    }
}

3-3、在jsp中设置超链接到新建的Servlet进行访问测试

测试用Servlet:设置了字符串的字符集,避免中文发送到浏览器页面乱码

package com.example.Demo;
/**
 * @author: Chen Stormrage
 * @date: 2021/7/27 21:48
 * @description:
 */

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "MyServlet", value = "/MyServlet")
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("浏览器发送了Get请求[该字符串显示在控制台]");
        response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("UTF-8");
        PrintWriter writer = response.getWriter();
        writer.println("Servlet响应了Get请求,向浏览器发送了这条信息[显示在浏览器]");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("浏览器发送了Post请求[该字符串显示在控制台]");
        response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("UTF-8");
        PrintWriter writer = response.getWriter();
        writer.println("Servlet响应了Post请求,向浏览器发送了这条信息[显示在浏览器]");
    }
}

?JSP编码

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>JSP - Hello World</title>
</head>
<body>
<h1><%= "Hello World!" %>
</h1>
<br/>
<a href="hello-servlet">Hello Servlet</a>
<br>
<a href="MyServlet">This is MyServlet!</a><!--测试用超链节,这里不使用同斜杠-->
</body>
</html>

?3-4、Servlet中中文在控制台乱码处理

设置IDEA全局UTF-8:如果已经存在项目,运行有乱码,需要重启IDEA

IDEA file encoding设置【当前项目和新项目一共两处】

IDEA VM Option设置

tomcat设置

?访问结果:

?访问This is MyServlet超链接,浏览器页面

?

??访问This is MyServlet超链接,控制台输出

4、通过url访问servlet的原理

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-07-28 00:11:50  更:2021-07-28 00:12:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/1 18:31:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码