JavaWeb笔记2--Servlet

本文介绍了Servlet的基本概念、与JSP的关系以及Servlet的处理流程。详细讲解了Servlet的创建过程,包括2.5和3.1版本的区别,并展示了如何在Tomcat中部署和访问Servlet。还涉及了Servlet的生命周期、与表单交互、请求响应方法及中文乱码问题的处理。最后,通过用户登录验证的例子,演示了POST请求和乱码处理的实战应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、servlet介绍

1. 是什么?

servlet是一个java类。服务器端小程序。
在这里插入图片描述
在这里插入图片描述

2. servlet与jsp关系

在这里插入图片描述

3. servlet处理流程

在这里插入图片描述

servlet 与servlet容器

  • javaweb组件包括servlet和jsp,运行在servlet容器中。servlet实现与数据库的通信。
  • 静态页面放在文件系统中。
  • 动态请求和静态请求都会发给server,由server返回clinet的浏览器。
    在这里插入图片描述
    在这里插入图片描述

二、servlet程序

1. servlet程序的类的继承关系

自定义的类,根据协议,继承Genericservlet的子类。

  • Genericservlet是一个通用的类。
  • Httpservlet是实现http协议的类。是抽象类,继承时要实现他的方法。
    HttpServlet类提供Servlet类的一般框架。
    任何一个server类必须继承httpservlet父类。
    在这里插入图片描述
    类的继承关系:在这里插入图片描述

2.servlet的组成

1、定义一个servlet必须继承HttpServlet类。
2、任何一个servlet必须重写父类的以下任意一个方法doGet(),doPost(),doPut(),doDelete(),init(),getServletInfo()
3、处理客户请求最常用的方法是doGet() 和doPost()

开发可以处理http请求的servlet程序:

  1. 继承HttpServlet类
  2. 在自定义的servlet类中至少要复写Httpservlet类中提供的doGet()方法
    在这里插入图片描述

2.1 编写类文件:HelloWorldServlet

类文件不能直接运行,要部署在tomcat中。
在这里插入图片描述

import javax.servlet.\*;
import javax.servlet.http.\*;
这两个包属于java扩展包,在JavaEE开发包中,不在JDK中。
他们在tomcat的jar包中(servlet-api.jar中包含这两个包)

2.2 部署到tomcat环境中

在这里插入图片描述

  • web.xml配置文件:拷一个,添加映射配置
 <servlet>
        <servlet-name> hello </servlet-name>						servlet名字
        <servlet-class> com.org.HelloWorldServlet </servlet-class> 	servlet类名字:引用完整的包
    </servlet>
    <servlet-mapping>												如何访问?
        <servlet-name> hello </servlet-name>						对这个servlet进行配置
        <url-pattern> /HelloServlet </url-pattern>					访问的名字
    </servlet-mapping>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.3 启动Tomcat服务

2.4 访问 localhost:8080/myapp/HelloServlet

访问网页:get请求。调用servlet的doget()方法,执行doget()方法的代码。在这里插入图片描述

3. servlet 2.5

3.1 创建 Dynamic web项目

在这里插入图片描述
在这里插入图片描述

3.2 新建servlet

在这里插入图片描述

3.3 web.xml

在这里插入图片描述

3.4 运行

run as --> run on server

3.5 访问

在这里插入图片描述
在这里插入图片描述

4. servlet 3.1

4.1 创建Dynamic web项目

在这里插入图片描述
在这里插入图片描述

4.2 新建servlet

在这里插入图片描述

4.3 注解’@WebServlet("/Myservlet3")'代替web.xml

https://blog.youkuaiyun.com/lanseliuxingluo/article/details/80222074
在这里插入图片描述

4.4 运行

run as --> run on server

4.5 访问

在这里插入图片描述

5. servlet2.X 与servlet3.X 版本区别

在这里插入图片描述

6. 访问方法

在这里插入图片描述

7. 映射

在这里插入图片描述
在这里插入图片描述

三、servlet与表单

httpservlet 的请求与响应

1. 响应:getWriter()+println

在这里插入图片描述

2. 请求

在这里插入图片描述
get:以查询字符串的方式附在url后面
post:不可见,注册、登陆

2.1 get方法:getParameter(String name) ,直接在地址栏中请求servlet

在这里插入图片描述
例子:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 post方式:调用doget()

以4开头的状态码:与客户端有关的错误
404:请求路径出错或不存在

表单:
action:server 、处理资源路径
method:请求方法,默认get,可省略
在这里插入图片描述
post方法:
在这里插入图片描述在这里插入图片描述
看不到传递的请求参数:在这里插入图片描述

html分文件夹管理

在这里插入图片描述
在这里插入图片描述
回跳上级目录:
在这里插入图片描述
在这里插入图片描述
跳回上一级目录:
在这里插入图片描述

3 doXXX方法

在这里插入图片描述

四、 servlet生命周期

1 生命周期

生命周期:生存周期
servlet受容器管理,由容器决定servlet生命周期。
在这里插入图片描述

2 各生命周期作用

只有处理服务的方法会被反复调用,其他均调用一次。
在这里插入图片描述
在这里插入图片描述
servlet以多线程的方式处理客户请求,每一个客户请求处理方法会运行在一个线程中。

3 servlet生命周期对应的方法

在这里插入图片描述

  • 了解service()方法和doGet()、doPost()方法的区别 。
    service() 方法是 Servlet 的核心。
    每当一个客户请求一个HttpServlet 对象,该对象的service() 方法就要被调用,而且传递给这个方法一个"请求"(ServletRequest)对象和一个"响应"(ServletResponse)对象作为参数。
    在 HttpServlet 中已存在 service()方法.缺省的服务功能是调用与 HTTP 请求的方法相应的 do 功能。

  • 例如,如果 HTTP 请求方法为 GET,则缺省情况下就调用 doGet()。
    service方法是接口中的方法,Servlet容器把所有请求发送到该方法,该方法默认行为是转发http请求到doXXX方法中,如果你重载了该方法,默认操作被覆盖,不再进行转发操作!
    Servlet 应该为 Servlet 支持的 HTTP 方法覆盖 do 功能.因为HttpServlet.service() 方法会检查请求方法是否调用了适当的处理方法,不必要覆盖 service() 方法。只需覆盖相应的 do 方法就可以了。
    我们也需要把Servlet做成既能处理GET请求,也能够处理POST请求(eg:Servlet要处理GET和POST两种请求),这只需要在doPost方法中调用doGet方法。

4 验证生命周期

在这里插入图片描述
修改映射:
在这里插入图片描述
重启服务
在这里插入图片描述
在这里插入图片描述
刷新页面:刷新一次,服务调用一次
在这里插入图片描述
点击shutdown.bat:
在这里插入图片描述
随后关闭。

service()方法

  • 如果重写service方法将不再调用doget和dopost方法。service方法是生命周期方法。
    service方法根据请求决定调用doget或dopost方法。所以一般都是重写doget和dopost方法。
    在这里插入图片描述
    在这里插入图片描述

init()方法

  1. 在第一次访问时调用
  2. 通过配置web.xml文件在容器启动时自动初始化,通过配置文件完成
    直接配置启动选择:
    启动时自动加载servlet完成初始化
    在这里插入图片描述
    在这里插入图片描述

五、中文乱码

1. 常见字符集

计算机处理二进制,用二进制表示字符。
字符集:字符编码集合。
在这里插入图片描述

2.中文乱码原因

字符转化时没有对应字符就会出现乱码
在这里插入图片描述

3. 解决中文乱码

3.1 服务器返回页面中文乱码问题 : setContentType()

在这里插入图片描述

  • 例子:
    在这里插入图片描述
    在这里插入图片描述
    要放在获得输出流之前:
    在这里插入图片描述
    在这里插入图片描述

3.2 解决 post 乱码: setCharacterEncoding()

在这里插入图片描述

  • 例子:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 解决:放在获取参数之前
    在这里插入图片描述
    在这里插入图片描述

3.3 解决 get 乱码(修改配置文件)

在这里插入图片描述

  • 例子
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 解决
    关闭Tomcat
    在这里插入图片描述改为:
    在这里插入图片描述
  • 验证:在这里插入图片描述

六、servlet例子–用户登录验证(post+乱码处理)

1. 登陆流程

获取登陆页面(html页面)–> 信息提交验证(servlet) --> 返回验证结果
在这里插入图片描述

2. 实现功能

2.1 创建页面、首页

login.html

  • form表单 :两个输入框+一个按钮
  • bootstrap前端框架使页面更美观。
    在这里插入图片描述

login.html代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <link href="bootstrap/css/bootstrap.min.css" rel="stylesheet">
  <link href="css/signin.css" rel="stylesheet">
  <script src="jquery/jquery-1.9.1.min.js"></script>
  <script src="bootstrap/js/bootstrap.min.js"></script>
<title>登录</title>
</head>
<body>
   <div class="container">
     <form class="form-signin" action="LoginServlet" method="post">
       <h2 class="form-signin-heading">请登录</h2>
       <label for="inputUsername" class="sr-only">用户名</label>
       <input type="text" id="username" name="username" class="form-control" placeholder="用户名" required autofocus>
       <label for="inputPassword" class="sr-only">密码</label>
       <input type="password" id="password" name="password" class="form-control" placeholder="密码" required>
       <div class="checkbox">
         <label>
           <input type="checkbox" value="remember-me"> Remember me
         </label>
       </div>
       <button class="btn btn-lg btn-primary btn-block" type="submit">登录</button>
     </form>
   </div> <!-- /container -->
 </body>
</html>

2.2 servlet 验证

在这里插入图片描述

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
  public LoginServlet() {
      super();
  }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");  //设置服务器返回页面编码方式
        request.setCharacterEncoding("UTF-8");               //解决Post方式请求中文参数乱码
        //接收提交过来的用户名和密码 
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        if(username.equals("javaweb") && password.equals("abc123")) {
            response.getWriter().write("welcome,"+username);
        }else {
            response.getWriter().write("sorry,your username or password is wrong.");
        }
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

3 测试

在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值