servlet的使用

1.servlet是什么?

是一种用java来开发动态网站的技术

Tomcat是什么? 是servlet的容器

2. servlet的开发流程

(1)继承抽象类(也就是明确是动态资源)

(2)重写其中的方法,以支持HTTP请求

(3)填充响应

(4)把动态资源和路径建立绑定关系

a.通过web.xml

b.使用Java中的注解语法完成 @WebServlet(主要用的是这种)


路径资源绑定实例如下:

package com.wangqi.first_webapp.servlet;
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;
import java.io.PrintWriter;

/**
 * @author wangqi
 * @data 2022/7/071652
 */
@WebServlet("/third")   // Servlet Path
public class ThirdServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setStatus(203);
        resp.setContentType("text/html; charset=utf-8");//因为你好陕西是utf-8编码,所以必须告诉他是utf-8
        PrintWriter writer = resp.getWriter();
        writer.print("你好陕西");

    }
}

注意:在浏览器搜索时,带上context path,在下面这个地方设置

3.那么上述的这些代码在tomcat内部是怎么走的?(流程)

 4.Servlet的使用(HTTP请求)

HttpServletRequest类的方法,代码如下:请求行,请求头的读取,请求体的读取了解即可

为什么请求体要用post方法获取:

package com.wangqi.first_webapp.servlet;

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;
import java.util.Enumeration;
/**
 * @author wangqi
 * @data 2022/7/071116
 */

@WebServlet("/req-info")
public class GetRequestInfoServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/css; charset=utf-8");
        // 我们只做打印(在 IDEA 的控制台上看到显示),不做响应(浏览器看不到,白屏)
        // 1. 请求方法
        String method = req.getMethod();
        System.out.println("HTTP 方法: " + method); //获得HTTP方法
        System.out.println();//换行
        System.out.println();

        String requestURI = req.getRequestURI(); //获取URI  ,只包含路径
        System.out.println("requestURI: " + requestURI);
        StringBuffer requestURL = req.getRequestURL();  //获取URL  ,完整路径
        System.out.println("requestURL: " + requestURL.toString());  //StringBuffer 和StringBuild一样只有toString才能的到其结果
        String pathInfo = req.getPathInfo();
        System.out.println("pathInfo: " + pathInfo);
        String contextPath = req.getContextPath();
        System.out.println("contextPath: " + contextPath); //获取contextPath
        String servletPath = req.getServletPath();
        System.out.println("servletPath: " + servletPath); //获取servletPath
        String pathTranslated = req.getPathTranslated();
        System.out.println("pathTranslated: " + pathTranslated);
        String queryString = req.getQueryString();
        System.out.println("queryString: " + queryString);
        System.out.println();
        System.out.println();

        String serverName = req.getServerName(); //获取服务器的ip
        System.out.println("serverName: " + serverName);
        int serverPort = req.getServerPort(); //获得服务器的端口
        System.out.println("serverPort: " + serverPort);
        String scheme = req.getScheme();   //获得协议
        System.out.println("schema: " + scheme);
        String protocol = req.getProtocol(); //获得协议的版本
        System.out.println("protocol: " + protocol);
        System.out.println();
        System.out.println();

        // 获取请求头们(本质就是一组 Key-Value;不同之处 Key 是可以重复的)
        Enumeration<String> headerNames = req.getHeaderNames(); //这个用req.getHeaderNames().var  就可以得到
        // Enumeration 类似 Iterator迭代器(hasNext() + next())
        while (headerNames.hasMoreElements()) { //如果返回true代表还有下一个,返回false代表没有了
        //用headerNames.hasMoreElements().while  可以自动生成
            String name = headerNames.nextElement();
            String value = req.getHeader(name);//把name传进去就可以得到对应的value
            System.out.println(name + " := " + value);
        }
    }
}

5.servlet的使用(读取请求体)

需要注意的:如果直接输入URL再按回车,会得到405,因为这种方式是get,但是我们的代码只支持post方法。

正确的访问方式是通过from表单去访问


要明白的是:HTTP请求  就是   HttpServletRequest对象,方法以getxxx为主

                     HTTP响应   就是  HttpServletResponse对象,方法以setxxx为主

6.404的排查步骤

7.Servlet的使用(HTTP响应) 

(1)状态(状态码和状态描述)

(2)响应头

(3)响应体(分为俩种)

内容为字符和内容为字节流

8.Servlet的日常开发


响应体是文本内容且字符集编码是utf-8

1.设置字符集编码

2.设置Content-Type的响应头

3.写响应体

public class WriteResponse extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                resp.setCharacterEncoding("utf-8");
                resp.setContentType("text/plain");  // 可以省略 "; charset=utf-8",会自动被补上
                // 先设置响应字符集,再 getWriter(),否则还会乱码
                PrintWriter writer = resp.getWriter();

                writer.print("1");
                writer.println("12");
                writer.printf("123");
        }
}

  

8.资源重定向

重定向:请求一个资源的时候需要,

 3XX+响应头:Location

重定向分为  永久重定向(301)  和   临时重定向

临时重定向:出现了问题:重定向的时候是否必要保留原方法。

最后:实现的时候保留也可以,不保留也可以,但大部分的浏览器都实现为不保留了,退化成了GET请求了。

HTTP1.1的规定中:分为了保留方法的临时重定向和不保留方法的临时重定向

临时重定向有3个状态码(1.历史 302 2. 保留 307 3.不保留(退化为GET) 303)

302约等于307

最常见的是:不保留方法的临时重定向

9.小案例

在网页中写一些表格把成绩单体现出来

 成绩录入是静态资源,成绩保存和成绩展示是动态资源

10.错误排除

1.开发者工具必须长期打开(1.元素面板的内容是否正确 2.源码面板 3.网络面板 状态码必须符合预期 4.控制台  运行出错)

2.判断是哪个层次出问题了:

网络层(网络不通)

传输层(TCP链接无法建立:Tpmcat没有启动、防火墙)

应用层(状态码)

Tomcat启动失败的可能性:(1)端口被占用  (2)Servlet的URL问题(重复或者没有以/开头)

3.状态码 500错误   服务器内部错误

a.tomcat内部的问题

b.代码中出现了异常(去观察异常发生时的调用栈,找到出错代码的位置)

设置为默认库

 创建表

 添加依赖

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值