我们于2021/08/10 的学习目标是:Servlet,核心任务为:
1、学习技术:
1)、Servlet概述
2)、如何创建Servlet
3)、Servlet的配置
4)、Servlet内置方法的使用
5)、Servlet的生命周期
6)、单例模式
7)、乱码问题
8)、转发与重定向
2、文档总结
1)、Servlet概述
历程:Servlet 是在服务器上运行的小程序。这个词是在 Java applet的环境中创造的,Java applet 是一种当作单独文件跟网页一起发送的小程序,它通常用于在客户端运行,结果得到为用户进行运算或者根据用户互作用定位图形等服务。
服务器上需要一些程序,常常是根据用户输入访问数据库的程序。这些通常是使用公共网关接口(Common Gateway Interface,CGI)应用程序完成的。然而,在服务器上运行 Java,这种程序可使用 Java 编程语言实现。在通信量大的服务器上,JavaServlet 的优点在于它们的执行速度更快于 CGI 程序。各个用户请求被激活成单个程序中的一个线程,而无需创建单独的进程,这意味着服务器端处理请求的系统开销将明显降低。
实现过程:
- 客户端发送请求至服务器端
- 服务器将请求信息发送至Servlet
- Servlet生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求
- 服务器将响应返回给客户端
2)、如何创建Servlet
创建Servlet对象有两种办法
第一种,继承HttpServlet类,实现其中的server方法;
package com.sdf.web;
import javax.servlet.*;
import java.io.IOException;
public class practice extends HttpServlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
}
}
第二种,实现Servlet接口并实现全部方法。
package com.sdf.web;
import javax.servlet.*;
import java.io.IOException;
public class class_extend_test implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
3)、Servlet的配置
@WebServlet 属性注解
name:指定这个Servlet的名字
value:指定访问路径,以/开头
displayName:该 Servlet 的显示名
web.xml配置
<!--xml配置servlet-->
<servlet>
<servlet-name>abcServlet</servlet-name>
<servlet-class>com.yjxxt.web.FirstServlet</servlet-class>
<!--饿汉式-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>abcServlet</servlet-name>
<url-pattern>/first</url-pattern>
</servlet-mapping>
4)、Servlet内置方法的使用
分类:
HttpServletRequest --> req
HttpServletResponse --> res
HttpServletRequest的常用方法
req.getParameter(String s)
获取请求的返回值
req.setAttribute(String s,Object o)
给对象的属性赋值
HttpServletResponse的常用方法
res.getWriter().print("你好")
在页面打印
res.setContextType("text/html;charset=utf-8")
设置文档格式和编码格式
res.setLocale();
重定向
5)、Servlet的生命周期
- Servlet的实例化只有一次,且被所有线程共享
- Servlet在初始化时会调用init()方法
- Servlet在调用时使用service()方法接受处理客户端的请求
- Servlet在销毁前会调用destory()方法
- Servlet是由JVM的垃圾回收器进行垃圾回收
6)、单例模式
单例模式又分懒汉式和饿汉式,其中懒汉式是默认设置。
饿汉模式:指像饿汉一样不顾一切就开吃。在Servlet中指不管以后的代码需不需要用到实例,都要在类产生的时候把实例创建好,这是一种空间换时间的做法。
懒汉模式:指像懒汉一样,该做的时候才去做。在Servlet中指在需要实例的情况下程序才去创建实例,不需要实例的情况下程序则不会去创建,这是一种时间换空间的做法。
7)、乱码问题
乱码的概念:
由于计算机中的数据都是以二进制形式存储的,因此,当传输文本时,就会发生字符与字节之间的转换。
字符与字节之间的转换是通过查码表来完成的,将字符转为字节的过程称为编码,将字节转换为字符的过程称为解码。
如果编码和解码使用的码表不一致,就会导致乱码问题。
res.setContextType("text/html;charset=utf-8")
通过此命令设置HttpServletResponse使用UTF-8编码,同时通知浏览器使用UTF-8解码。
req.setCharacterEncoding=utf-8
通过此命令设置HttpServletRequest使用UTF-8编码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
在jsp文件中设置编解码格式
Dfile.encoding=utf-8
在IDEA的Custom VM Options中设置解码格式
8)、转发与重定向
在我们浏览网页时,网页相互跳转的操作是非常常见的。在实际的网站开发中,我们可以通过使用Servlet中的转发和重定向实现页面跳转。
转发:
getRequestDispatcher()
请求转发,将客户端的请求转发到另外一个Servlet或JSP页面。
重定向:
sendRedirect()
重定向功能是让浏览器重新发生请求,但是将请求的是另外一个Servlet。
转发与重定向的区别:
转发发生一次请求;重定向发生两次请求。
转发只能发生在项目内部,不可以跨域;重定向可以跨域
重定向由于发生的两次请求,req作用域不可以再带值。