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.代码中出现了异常(去观察异常发生时的调用栈,找到出错代码的位置)
设置为默认库
创建表
添加依赖