该笔记来自B站SGG-JavaWeb学习纪录,文章末贴出链接
2022.04.25
如何修改tomcat在idea中乱码问题
https://blog.csdn.net/mr_liuhailong/article/details/110264765
如何解决tomcat热部署问题
https://blog.51cto.com/u_10624715/3234220
如何在idea里导包
https://blog.csdn.net/a755199443/article/details/89192230
如何创建Artifact+tomcat
https://blog.csdn.net/jakemanse/article/details/105874304
什么是servlet
1. JavaEE规范之一,规范就是接口
2. 是JavaWeb三大组件之一:servlet程序、Filter过滤器、Listener监听器
3. 运行在服务器上的一个java小程序,"它可以接收客户端发送过来的请求,并相应数据给客户端"
如何通过"实现Servlet"来创建一个servlet程序(通过一个类来实现Servlet类)
1. 编写一个类去实现servlet接口
这里需要引入servlet包,一般包可以使用Tomcat的lib中的servlet-api.jar
public TestServlet implements Servlet{}
2. 实现service方法,处理请求,并相应数据
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("进入servlet 访问的service方法");
}
3. 需要到web.xml中去配置servlet程序的访问地址
在<web-app>
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.kd.servlet.TestServlet</servlet-class>
</servelt>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/testServlet</url-pattern>
</servlet-mapping>
</web-app>
Servlet生命周期
1. 执行构造器方法
2. 执行init初始化方法
3. service方法
4. destroy方法
实现Servlet类下如何获取GET&POST方法
1. 若在service方法中
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String method = httpServletRequest.getMethod();
System.out.println(method);
if ("GET".equals(method)) {
System.out.println("get方法");
} else {
System.out.println("post方法");
}
如何通过"继承HttpServlet类"来创建一个servlet程序(通过一个类继承HttpServlet类)
1. 编写一个类去继承 HttpServlet类
2. 根据业务需求来重写doGet或者doPost方法
public class TestHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
3. 到web.xml中去配置Servlet访问地址
解决右键New未出现Servlet配置项(变相就是通过Idea来创建Servlet程序)
https://blog.csdn.net/a124654564/article/details/119105837?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0.pc_relevant_paycolumn_v3&spm=1001.2101.3001.4242.1&utm_relevant_index=3
整个Servlet继承实现体系
ServletConfig类
1. 用处
Servlet程序的配置信息类;
Servlet程序和ServletConfig对象都是由Tomcat负责创建,我们负责使用;
Servlet程序默认是第一次访问的时候创建,ServletConfig是每个Servlet程序创建时,就创建一个对应的ServletConfig对象。
2. 三大作用(均在init方法中使用)
2.1 "获取Servlet程序的别名(web.xml中的servlet-name)"
2.2 "获取初始化参数init-param(web.xml中找到当前Servlet配置标签项)"
<Servlet>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
</Servlet>
2.3 "获取ServletContext对象"
ServletContext类
1. 含义
ServletContext是一个接口,表示Servlet上下文对象;
一个web工程,只有一个ServletContext对象实例;
ServletContext对象是一个域对象。
什么是域对象?
是可以像Map一样存取数据的对象,叫域对象。
这里的域指的是存取数据的操作范围。(整个web工程)
2. 四个作用
2.1 "获取web.xml中配置的上下文参数<context-param>(与<servlet>标签同级)"
<!-- 配置servletContext配置项 -->
<context-param>
<param-name>sameLevelServlet</param-name>
<param-value>1234</param-value>
</context-param>
ServletContext servletContext = getServletContext();
System.out.println("获取配置的context域对象参数sameLevelServlet的值" + servletContext.getInitParameter("sameLevelServlet"));
2.2 "获取当前的工程路径,格式:/工程路径"
System.out.println("获取当前的工程路径,格式: /工程路径:" + servletContext.getContextPath());
2.3 "获取工程部署后在服务器硬盘上的绝对路径"
System.out.println("获取工程部署到服务器硬盘上的绝对路径" + servletContext.getRealPath("/"));
2.4 "像Map一样存取数据"
ServletContext servletContext = getServletContext();
servletContext.setAttribute(key,value)
servletContext.getAttribute(key)
servletContext.removeAttribute(key)
2.5 "ServletContext是在web工程部署启动的时候创建,在web工程停止的时候销毁"
GET请求分析
POST请求分析
HTTP-Request-Header
HTTP-Response-Header
2022.04.29
HttpServletRequest类
1. 作用
每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的信息。
2. 常用方法
3.1 setCharacterEncoding() - "设置字符集" (针对post请求 中文乱码 但是必须要在请求参数之前 调用)
req.setCharacterEncoding("UTF-8")
2.1 getRequestURI() - "获取请求的资源路径"
System.out.println("getRequestURI() - \"获取请求的资源路径\"" + req.getRequestURI());
2.2 getRequestURL() - "获取请求的统一资源定位符(绝对路径)"
System.out.println("getRequestURL() - \"获取请求的统一资源定位符(绝对路径)\"" + req.getRequestURL());
2.3 getRemoteHost() - "获取客户端的IP"
System.out.println("getRemoteHost() - \"获取客户端的IP\"" + req.getRemoteHost());
2.4 getHeader() - "获取请求头"
System.out.println("getHeader() - \"获取请求头\"" + req.getHeader("content-type"));
2.7 getMethod() - "获取请求的方式"
System.out.println("getMethod() - \"获取请求的方式\"" + req.getMethod());
2.5 getParameter() - "获取请求的参数"
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("username: " + username);
System.out.println("password: " + password);
2.6 getParameterValues() - "获取请求的参数(多个值(当存在一个字段key 跟多个value值时)时使用)"
String[] hobbies = req.getParameterValues("hobby");
System.out.println("hobby: " + Arrays.asList(hobbies));
2.8 setAttribute(key,value) - "设置数据域"
req.setAttribute("fromHttpServletRequest", "test");
2.9 getAttribute(key) - "获取数据域"
Object fromHttpServletRequest = req.getAttribute("fromHttpServletRequest");
System.out.println(fromHttpServletRequest);
3.0 getRequestDispatcher() - "获取请求转发对象"
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/TestDispatcher");
requestDispatcher.forward(req, resp);
1. 浏览器地址栏没有变化
2. 他们是一次请求
3. 他们共享Request域中的数据
4. 可以转发到WEB-INF目录下的资源
5. 不可以访问工程以外的资源
请求转发示意图
JavaWeb中的相对路径和绝对路径
相对路径:
.
..
资源名
绝对路径:
http://ip:port/工程路径/资源路径
web中 / 斜杠的不同意义
在web中 / 斜杠 是一种绝对路径
/ 斜杠:如果被"浏览器"解析,得到的地址是:"http://ip:port"
如:<a href="/">斜杠</a>
/ 斜杠:如果被"服务器"解析,得到的地址是:"http:ip:port/工程路径"
如:<url-pattern>/servlet</url-pattern>
servletContext.getRealPath("/")
request.getRequestDispatcher("/")
特殊情况:respose.sendRedirect("/") 把斜杠发送给浏览器解析,得到"http://ip:port/"
2022.04.30
HttpServletResponse类
HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个 Response 对象传递给 Servlet 程序去使用。HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息,我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置
响应的两个输出流的说明
字节流:getOutputStream() 常用于下载(传递二进制数据)
字符流:getWriter() 常用于回传字符串(常用)
两个流同时只能使用一个,否则报错。
如何解决客户端响应、服务端打印中文乱码问题
1. 首先Tomcat默认的字符集是 ISO-8859-1
2. 手动设置服务器的字符集
3. 通知浏览器客户端以什么字符集显示
4. 一步到位设置
请求重定向
resp.setStatus(302)
resp.setHeader("Location","http://localhost:8080/servlet-web/testResponse2")
resp.sendRedirect("http://localhost:8080/servlet-web/testResponse2")
e(“text/html;charset=UTF-8”) // 同时设置客户端、服务端使用UTF-8字符集且设置响应头
#### 请求重定向
```java
// 方式1
resp.setStatus(302)
resp.setHeader("Location","http://localhost:8080/servlet-web/testResponse2")
// 方式2
resp.sendRedirect("http://localhost:8080/servlet-web/testResponse2")
SGGJavaWeb
|