JavaEE 暑期课笔记 Ⅰ Servlet 学习笔记

前记: 暑假上课,果然又是看几百年前的视频,我晕!勉强把笔记抄下来。
本文也不能说是原创,是尚硅谷的视频,其实觉得已经很古老的视频了,没必要看,但是架不住这是要算分的,只能悲伤地看下去了。


2020 年 7 月 6 号:深深觉得我在给互联网制造垃圾。

1. 使用JavaEE 版的Eclipse开发动态的WEB工程(JavaWEB项目)

我用的是 IDEA,创建 web 项目的过程大同小异。因此以下步骤我均没有尝试过。
1). 把开发选项切换到JavaEE
2). 可以在Window -> Show View中找到Package Explorer, 并把其拖拽到开发区的左边
3). 在Servers 面板中新建Tomcat服务器,一定要关联到Tomcat安装的根目录
4). 新建一个Dynamic Web Project。其中Target Runtime 需选择Tomcat6.0
5). 开发Java WEB应用
6). 可以通过run on server 来运行WEB项目.

2. Servlet 的HelloWorld

1).创建一个Servlet 接口的实现类.
public class HelloServlet implements Servlet
2).在web .xml 文件中配置和映射这个Servlet

<!--配置和映射Servlet -->
<servlet>
	<!-- Servlet注册的名字-->
	<servlet-name >helloServlet</servlet-name>
	<!-- Servlet的全类名-->
	<servlet-class>com.atguigu.javaweb.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
	<!-- 需要和某一个servlet 节点的serlvet-name 子节点的文本节点一致-->
	<servlet-name>helloServlet</servlet-name>
	<!-- 映射具体的访问路径: /代表当前WEB应用的根目录。--> 
	<url-pattern>/hello</url-pattern>
</servlet-mapping>

3. Servlet 容器 : 运行Servlet、JSP、Filter 等的软件环境。

1). 可以来创建Servlet, 并调用Servlet的相关生命周期方法。
2). JSP, Filter, Listener, Tag …

4. Servlet生命周期的方法 : 以下方法都是由Serlvet容器负责调用.

1). 构造器:只被调用一次。只有第一次请求Servlet时,创建Servlet的实例。调用构造器.
这说明Serlvet是单实例的!
2). init 方法:只被调用一次。在创建好实例后立即被调用。用于初始化当前Servlet.
3). service: 被多次调用。每次请求都会调用service 方法。实际用于响应请求的. .
4). destroy:只被调用一次。在当前Servlet所在的WEB应用被卸载前调用。用于释放当前Servlet所占用的资源.

5. load-on-startup 参数:

1).配置在 servlet节点中

<servlet>
	<!-- Servlet注册的名字-->
	< servlet-name>secondServlet</servlet-name>
	<!-- Servlet 的全类名 -->
	<servlet-class>com.atguigu.javaweb.SecondServlet</servlet-class>
	<!-- 可以指定Servlet被创建的时机 -->
	<oad-on-startup>2</ load-on-startup>
</servlet>

2). load-on-startup: 可以指定Serlvet被创建的时机。若为负数,则在第一次请求时被创建.若为日或正数,则在当前WEB应用被
Serlvet容器加载时创建实例,且数组越小越早被创建.

6. 关于serlvet-mapping.

1). 同一个 Servlet 可以被映射到多个 URL 上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个 Servlet 的注册名。

2).在servlet映射到的URL中 也可以使用通配符,但是只能有两种固定的格式:
① 一种格式是“*.扩展名”;
② 另一种格式是以正斜杠(/)开头并以"/*"结尾。

<servlet-mapping>
	<servlet-name>secondServlet</servlet-name>
	<url-pattern>/*</url-pattern>
</servlet-mapping>
OR
<servlet-mapping>
	<servlet-name>secondServlet</servlet-name>
	<url-pattern>*.do</url-pattern>
</servlet-mapping>

注意:以下的既带/又带扩展名的不合法.
<servlet-mapping>
	<servlet-name>secondServlet</servlet-name>
	<url-pattern>/*.action</url-pattern>
</servlet-mapping>

7.ServletConfig:封装了Serlvet的配置信息,并且可以获取Serv1etContext对象

api 地址 servlet config api

1). 配置Serlvet的初始化参数

<servlet>
    <!-- Servlet 注册的名字 -->
    <servlet-name>helloServlet</servlet-name>
    <!-- Servlet 的全类名 -->
    <servlet-class>HelloServlet</servlet-class>
    <!-- 配置 Servlet 的初始化参数, 且节点必须在load-on-startup节 点的前面
 -->
    <init-param>
        <!-- 参数名 -->
        <param-name>user</param-name>
        <!-- 参数值 -->
        <param-value>root</param-value>
    </init-param>
    <init-param>
        <param-name>password</param-name>
        <param-value>123456</param-value>
    </init-param>
    <!-- 可以指定 Servlet 被创建的时间 -->
    <load-on-startup>-1</load-on-startup>
</servlet>

2). 获取初始化参数:

   getInitParameter(String name);  // 获取指定参数名的初始化参数
   String user=servletConfig.getInitParameter("user");
   System.out.println("user:"+user);

   getInitParameterNames();         // 获取参数名组成的 Enumeration 对象
   Enumeration<String>names=servletConfig.getInitParameterNames();
   while(names.hasMoreElements()){
	String name = names.nextElement();
	String value = servletConfig.getInitParameter(name);
	System.out.println("name:"+name+";value:"+value);
   }

3). 获取 Servlet 的配置名称(了解即可)
StringservletName=servletConfig.getServletName();
System.out.println(servletName);

8. ServletContext

1). 可以由 ServletConfig 获取
// 获取ServletContext对象
ServletContext servletContext=servletConfig.getServletContext();
2). 该对象代表当前 WEB 应用:可以认为 ServletContext 是当前 WEB 应用的一个大管家,可以从中获取到当前 WEB 应用的各个方面的信息。

i. 获取当前 WEB 应用的初始化参数。
(1) 设置初始化参数:可以被所有 Servlet 获取【相当于全局变量】

<!--配置当前WEB应用的初始化参数-->
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>

(2) 方法:

//获取ServletContext对象
ServletContext servletContext=servletConfig.getServletContext();

String driver=servletContext.getInitParameter("driver");
System.out.println("driver:"+driver);
numeration<String>names2=servletContext.getInitParameterNames();
while(names2.hasMoreElements()){
    Stringname2=names2.nextElement();
    System.out.println("-->"+name2);
 }      

ii. 获取当前 WEB 应用的某一个文件在服务器上的绝对路径,而不是部署前的路径。
(1) getRealPath(String path)

StringrealPath=servletContext.getRealPath("index.jsp");
//真实路径👉D:\this_is_path\project\Servlet01\web\index.jsp
//输出路径👉D:\this_is_path\project\Servlet01\out\artifacts\Servlet01_war_exploded\index.jsp
System.out.println(realPath);

iii. 获取当前 WEB 应用的名称。
(1) getContextPath()

String contextPath=servletContext.getContextPath();
//输出:/Servlet01_war_exploded
System.out.println(contextPath);

Ⅳ. 获取当前 WEB 应用的某一个文件对应的输入流

try{
    ClassLoader classLoader=getClass().getClassLoader();
    InputStream is=classLoader.getResourceAsStream("jdbc.properties");
    System.out.println("1."+is);
    InputStream is2=servletContext.getResourceAsStream("jdbc.properties");
    System.out.println("2."+is2);
    InputStream is3=servletContext.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
     System.out.println("3."+is3);
/*
1.java.io.ByteArrayInputStream@3b1fcf8f
2.null
3.java.io.ByteArrayInputStream@35d8369c
*/
    }catch(Exceptione){
        e.printStackTrace();
    }

v. 和 atributies 相关的几个方法。

9. GET请求和POST 请求:

1).使用GET方式传递参数:

①. 在浏览器地址栏中输入某个URL地址或单击网页上的一个超链接时,浏览器发出的HTTP请求消息的请求方式为GET.
②. 如果网页中的<form>表单元素的method 属性被设置为了 “GET”,浏览器提交这个 FORM 表单时生成的 HTTP 请求消息的请求方式也为 “GET”.
③. 使用 GET 请求方式给 WEB 服务器传递参数的格式: http://www.atguigu.com/ counter.jsp?name=1c&password=123
④. 使用 GET 方式传送的数据量一般限制在1KB以下。

2).使用POST方式传递参数:

①. POST请求方式主要用于向WEB服务器端程序提交FORM表单中的数据: form表单的method置为POST
②. POST方式将各个表单字段元素及其数据作为HTTP消息的实体内容发送给WEB服务器,传送的数据量要比使用GET方式传送的数据量大得多。

/* HTTP 请求 */
POST /counter.jsp HTTP/1.1
referer: http://localhost : 8080/Register. html
content-type: application/x-www-form-urlencoded
host:localhost: 8080
content-length: 43
name=zhangsan&password=123     --请求体中传递参数。

10. 如何在 Servlet 中获取请求信息

在视频 “ServletRequest” 中,我开始偷懒了…

1). Servlet 的 service() 方法用于应答请求:因为每次请求都会调用 service() 方法

public void service(ServletRequest request, Serv1etResponse response)
		throws ServletException, IOException
  • ServletRequest: 封装了请求信息。可以从中获取到任何的请求信息.
  • ServletResponse: 封装了响应信息,如果想给用户什么响应,具体可以使用该接口的方法实现.

这两个接口的实现类都是服务器给予实现的, 并在服务器调用service方法时传入。
在这里插入图片描述
来自 ServletRequest api

2). 获取请求的 URI;

  • HttpServletRequest:是 ServletRequest 的子接口,针对 HTTP 请求所定义,里面包含了大量获取 HTTP 请求相关的方法。

3). 获取请求的方式;
4). 获取请求的查询字符串,即问好后的字符串。
5). 获取请求的 Servlet 的映射路径。
6). 和 attibute 相关的几个方法。
7). 还有很多方法。https://docs.oracle.com/javaee/7/api/

11. ServletResponse :封装了响应信息,如果想给用户什么响应,具体可以使用该接口的方法实现。

在这里插入图片描述

上述图片来自 ServletResponse api

void sendRedirect(String location) : 请求的重定向【此方法为 HttpServletResponse 定义】


2020 年 7 月 7 日:祝高考的孩子顺利哦~

12. GenericServlet

学习 GenericServlet 是通过一个新的 project 练习来学习的,刚好可以复习前面所学的知识。

作业练习
• 在 web.xml 文件中设置两个 WEB 应用的初始化参数:user,password。
• 定义一个 login.html,里面定义两个请求字段: user,password。 发送请求到 loginServlet
• 在创建一个 LoginServlet,在其中获取请求的 user,password。比对其和 web.xml 文件中的请求参数是否一致。
• 若一致,响应 Hello:xxx;若不一致,响应 Sorry:xxx xxx 为 user。

第一次写 Servlet 有关的项目,只能一步一步跟着老师来。玩意错了也不知道为啥。卑微啊!这项技术真的还有人在用吗?应该有更好的框架吧?

1. IDEA 新建一个 web 项目

左边选择 Java Enterprise,右边选择 Web Application(4.0)

在这里插入图片描述
选择 next

在这里插入图片描述

新建好的项目如下:

在这里插入图片描述

2. 配置好 web.xml 文件
<!-- 配置当前 web 应用的初始化参数 -->
<context-param>
    <param-name>user</param-name>
    <param-value>atguigu</param-value>
</context-param>

<context-param>
    <param-name>password</param-name>
    <param-value>1234567</param-value>
</context-param>

如图所示:
在这里插入图片描述

3. 新建一个 login.html

目录 src/web
在这里插入图片描述

插入代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <!-- 此处的 loginServlet 尚未创建 -->
    <form action="loginServlet" method="post">
        user: <input type="text" name="username">
        password: <input type="password" name="password">

        <input type="submit" name="submit" value="提交">
    </form>
</body>
</html>

此时我启动项目,用的是 Tomcat

点击 Edit Configurations
在这里插入图片描述

在这里插入图片描述
进入的网址是 http://localhost:8080/ServletPracticeDemo_war_exploded/login.html
界面如下:
在这里插入图片描述

4. 新建 loginServlet.java

我不得不说,VSCode 用久了之后,再回来用 IDEA 就觉得这小东西怎么这么贴心呢!代码补全功能世界一流啊!
如果在这里不能导入 Servlet,可以参考我上一篇 Servlet 报错处理的文章IDEA 学习 Servlet 报错及解决办法记录

在 src 下新建 com.atguigu.javaweb 包,然后新建一个类 loginServlet.java

package com.atguigu.javaweb;

import javax.servlet.*;
import java.io.IOException;

/**
 * User: Admin
 * Date: 2020/7/7
 * Time: 12:12
 * Author: Secret
 * Note:
 */
public class loginServlet implements Servlet {
    private ServletConfig servletConfig;
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        this.servletConfig = servletConfig;
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        // 1. 获取请求参数,分别是 username 和 password
        String username = servletRequest.getParameter("username");
        String password = servletRequest.getParameter("password");

        // 2. 获取当前 WEB 应用的初始化参数: user, password
        // 需要使用ServletContext 对象. 从 init 函数里面获取。
        ServletContext servletContext = servletConfig.getServletContext();
        String initUser = servletContext.getInitParameter("user");
        String initPassword = servletContext.getInitParameter("password");

        // 3. 比对并打印响应字符串.
        if (initUser.equals(username) && initPassword.equals(password)) {
            System.out.println("Hello: " + username);
        } else {
            System.out.println("Sorry: " + username);
        }
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}
5. 在 web.xml 中配置 Servlet
<!-- 配置 Servlet -->
<servlet>
    <servlet-name>loginServlet</servlet-name>
    <servlet-class>com.atguigu.javaweb.loginServlet</servlet-class>
</servlet>

<servlet-mapping>
    <!-- 这个必须和上面 servlet-name 一致 -->
    <servlet-name>loginServlet</servlet-name>
    <!-- 和 login.html 中的 form 中一致 -->
    <url-pattern>/loginServlet</url-pattern>
</servlet-mapping>

重新启动项目,进入 http://localhost:8080/ServletPracticeDemo_war_exploded/login.html输入 atguigu1234567, 就能在控制台上出现相应的正确提示;如果输入其它用户名和密码则出现相应的错误提示。
在 java 中可以写 HTML,但是很麻烦。

至此,我们可以看到 Servlet 里面有很多空方法。因此我们需要新建一个自定义实现类。

6. MyGenericServlet

在 src/com.atguigu.javaweb 中新建一个抽象类 MyGenericServlet

package com.atguigu.javaweb;

import javax.servlet.*;
import java.io.IOException;

/**
 * User: Admin
 * Date: 2020/7/7
 * Time: 13:30
 * Note: 自定义的一个Servlet接口的实现类,让开发的任何Servlet都继承该类。以简化开发
 */
public abstract class MyGenericServlet implements Servlet {
    private ServletConfig servletConfig;

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        this.servletConfig = servletConfig;
    }

    @Override
    public ServletConfig getServletConfig() {
        return this.servletConfig;
    }

    /* 每个 Servlet 中必然要实现一个 service 方法,所以把它写成一个抽象方法 */
    @Override
    public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException;

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

修改 loginServlet.java

package com.atguigu.javaweb;

import javax.servlet.*;
import java.io.IOException;

/**
 * User: Admin
 * Date: 2020/7/7
 * Time: 12:12
 * Note: 删掉空方法。
 */
public class loginServlet extends MyGenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        // 1. 获取请求参数,分别是 username 和 password
        String username = servletRequest.getParameter("username");
        String password = servletRequest.getParameter("password");

        // 2. 获取当前 WEB 应用的初始化参数: user, password
        // 需要使用ServletContext 对象. 从 init 函数里面获取。
        String initUser = getServletContext().getInitParameter("user");
        String initPassword = getServletContext().getInitParameter("password");

        // 3. 比对并打印响应字符串.
        if (initUser.equals(username) && initPassword.equals(password)) {
            System.out.println("Hello: " + username);
        } else {
            System.out.println("Sorry: " + username);
        }
    }
}

重启项目,效果仍然不变。

7. GenericServlet 源码

第 6 点是自己实现了一个 GenericServlet,现在可以看看真正的 GenericServlet。

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package javax.servlet;

import java.io.IOException;
import java.io.Serializable;
import java.util.Enumeration;

public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
    private static final long serialVersionUID = 1L;
    private transient ServletConfig config;

    public GenericServlet() {
    }

    public void destroy() {
    }

    public String getInitParameter(String name) {
        return this.getServletConfig().getInitParameter(name);
    }

    public Enumeration<String> getInitParameterNames() {
        return this.getServletConfig().getInitParameterNames();
    }

    public ServletConfig getServletConfig() {
        return this.config;
    }

    public ServletContext getServletContext() {
        return this.getServletConfig().getServletContext();
    }

    public String getServletInfo() {
        return "";
    }

    public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }

    public void init() throws ServletException {
    }

    public void log(String message) {
        this.getServletContext().log(this.getServletName() + ": " + message);
    }

    public void log(String message, Throwable t) {
        this.getServletContext().log(this.getServletName() + ": " + message, t);
    }

    public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    public String getServletName() {
        return this.config.getServletName();
    }
}

根据上述源码可知,其实和第 6 点中我们实现的 MyGenericServlet 差不多。

GenericServlet 相关笔记:
1).是一个Servlet. 是Servlet接口和ServletConfig接口的实现类。但是是一个抽象类。其中的service 方法为抽象方法。
2). 如果新建的Servlet 程序直接继承GenericSerlvet 会使开发更简洁。
3). 具体实现:
①. 在GenericServlet 中声明了一个SerlvetConfig 类型的成员变量,在init(ServletConfig) 方法中对其进行了初始化。
②. 利用servletConfig 成员变量的方法实现了ServletConfig 接口的方法。
③. 还定义了一个init()方法,在init(SerlvetConfig) 方法中对其进行调用,子类可以直接覆盖init() 在其中实现对Servlet 的初始化。
④. 不建议直接覆盖init(ServletConfig), 因为如果忘记编写super(ServletConfig), 而还是用了ServletConfig 接口的方法,则会出现空指针异常。
⑤. 新建的init(){}并非Servlet的生命周期方法。而init (ServletConfig)才是生命周期相关的方法.

13. HttpServlet

虽然 GenericServlet 已经比较完善了,但是还不够好!我们需要 GET 和 POST 的话不方便。因此介绍 HTTPServlet
在真正的开发中,用的比较多的就是 HttpServlet。

1). 是一个Servlet, 继承自GenericServlet. 针对于HTTP协议所定制。
2).在service()方法中直接把ServletReuqest和ServletResponse转为HttpServletRequest和HttpServletResponse,并调用了重载的service (HttpServletRequest, HttpServletResponse),在service(HttpServletRequest, HttpServletResponse) 获取了请求方式: request . getMethod(). 根据请求方式有创建了 doXxx() 方法(xxx为具体的请求方式,比如doGet, doPost)
3).实际开发中,直接继承HttpServlet, 并根据请求方式复写doXxx() 方法接口. .
4).好处:直接由针对性的覆盖doXx() 方法;直接使用HttpServletRequest 和HttpServletResponse, 不再需要强转。

/* HttpServlet.java 中的部分函数 */
void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String protocol = req.getProtocol();
    String msg = lStrings.getString("http.method_get_not_supported");
    if (protocol.endsWith("1.1")) {
        resp.sendError(405, msg);
    } else {
        resp.sendError(400, msg);
    }
}

void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String protocol = req.getProtocol();
    String msg = lStrings.getString("http.method_post_not_supported");
    if (protocol.endsWith("1.1")) {
        resp.sendError(405, msg);
    } else {
        resp.sendError(400, msg);
    }
}

自定义的 loginServlet,继承自 HttpServlet

package com.atguigu.javaweb;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * User: Admin
 * Date: 2020/7/7
 * Time: 12:12
 * Author: LuoRong
 * Note:
 */
public class loginServlet2 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String method = request.getMethod();
        System.out.println(method);

        // 1. 获取请求参数,分别是 username 和 password
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        // 2. 获取当前 WEB 应用的初始化参数: user, password
        // 需要使用ServletContext 对象. 从 init 函数里面获取。
        ServletContext servletContext = getServletConfig().getServletContext();
        String initUser = getServletContext().getInitParameter("user");
        String initPassword = getServletContext().getInitParameter("password");

        PrintWriter out = response.getWriter();

        // 3. 比对并打印响应字符串.
        if (initUser.equals(username) && initPassword.equals(password)) {
            out.println("Hello: " + username);
        } else {
            out.println("Sorry: " + username);
        }

    }

    @Override
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.获取请求方式.
        String method = request.getMethod();

        //2.根据请求方式再调用对应的处理方法
        if ("GET".equalsIgnoreCase(method)) {
            doGet(request, response);
        } else if ("POST".equalsIgnoreCase(method)) {
            doPost(request, response);
        }
    }

    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        HttpServletRequest request;
        HttpServletResponse response;

        try {
            request = (HttpServletRequest) req;
            response = (HttpServletResponse) res;
            service(request, response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

14. 练习升级

此练习基于 11 中的练习。

  • 在MySQL 数据库中创建一 个test_ users数据表,添加3个字段: id, user, password. 并录入几条记录。
  • 定义一个login.html, 里边定义两个请求字段: user, password. 发送请求到loginServlet,创建一个LoginServlet (需要继承自HttpServlet,并重写其doPost方法), 在其中获取请求的user, password.
  • 利用JDBC从test_ users中查询有没有和页面输入的user, password 对应的记录
  • SELECT count(id) FROM test_ users WHERE user = ? AND password = ?
  • 若有,响应Hello:xxx, 若没有,响应Sorry: xxx xxx为user.

新建一个 LoginServlet3.java, 然后把 Web.xml 中的 com.atguigu.javaweb.LoginServlet 改成 com.atguigu.javaweb.LoginServlet3

package com.atguigu.javaweb;

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.io.PrintWriter;
import java.sql.*;

/**
* User: Admin
* Date: 2020/7/7
* Time: 15:25
* Note:
*/
public class LoginServlet3 extends HttpServlet {
   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       // 1. 获取请求参数
       String username = req.getParameter("username");
       String password = req.getParameter("password");

       PrintWriter out = resp.getWriter();

       // 2. sql
       Connection connection = null;
       PreparedStatement statement = null;
       ResultSet resultSet = null;
       String sql = "SELECT count(id) FROM users WHERE username = ? AND password = ?";
       try {
           Class.forName("com.mysql.jdbc.Driver");
           String url = "jdbc:mysql://atguigu";
           String user = "root";
           String sqlpass = "123456";
           connection = DriverManager.getConnection(url, user, sqlpass);

           statement = connection.prepareStatement(sql);
           statement.setString(1, username);
           statement.setString(2, password);

           resultSet = statement.executeQuery();

           if (resultSet.next()) {
               int count = resultSet.getInt(1);
               if (count > 0) {
                   out.print("Hello, " + username);
               } else {
                   out.print("Sorry, " + username);
               }
           }

       } catch (Exception e) {
           e.printStackTrace();
       } finally {
           try {
               if (resultSet != null) {
                   resultSet.close();
               }
           } catch (SQLException e) {
               e.printStackTrace();
           }

           try {
               if (statement != null) {
                   statement.close();
               }
           } catch (SQLException e) {
               e.printStackTrace();
           }

           try {
               if (connection != null) {
                   connection.close();
               }
           } catch (SQLException e) {
               e.printStackTrace();
           }
       }
   }
}

好像运行失败了,我晕
明天再说吧,我累了

15.Servlet容器的概念

Servlet容器为JavaWeb应用提供运行时环境. 它负责管理Servlet和JSP的生命周期, 以及管理它们的共享数据。
Servlet容器也称为JavaWeb应用容器,或者Servlet/JSP容器。
目前最流行的Servlet容器软件包括:

  • Tomcat
  • Resin
  • J2EE服务器(如Weblogic)中也提供了内置的Servlet容器
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值