Servlet学习
1、Tomcat
tomcat是一个web服务器,用来处理web请求
-
下载 tomcat 安装包
-
解压安装包
-
进行配置 :配置文件 server.xml, 文件路径如:
D:\tomcat\conf\server.xml
- 将配置文件端口改为80,因为通过web访问,80端口可以不写,默认为80端口
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8543" />
-
启动tomcat服务
- 启动路径如:
D:\tomcat\bin\startup.bat
- 启动路径如:
-
测试tomcat
-
修改tomcat 配置文件 server.xml,增加测试 html文件路径配置,路径指向为 html文件页面文件夹
<Context path="/" docBase="D:\\work\\test\\j2ee1\\web" debug="0" reloadable="false" />
-
-
重启tomcat 服务
-
浏览器输入 : http://127.0.0.1/hello,请求能够正常显示表示配置成功
2、Servlet
2.1-Servlet介绍
Servlet本身不能独立运行,需要在 web 应用中运行,现在我们是把web应用部署在tomcat中的
2.2-创建一个Servlet的步骤
-
创建 web 应用项目
- 创建java项目
- 导入 servlet-api.jar 包
-
编写 servlet 代码
-
创建 Servlet 类,注意:在集成开发工具eclipse创建Class时,让包名置空
-
普通类继承 HttpServlet
-
创建 servlet 类和 url之间的映射关系(两种方式)
-
在 Servlet 类中使用注解
//name 表示 servlet的名字 // loadOnStartup 表示 加载的顺序 ,范围 1~99,数值越小,加载优先级越高 //urlPatterns 表示访问的 url @WebServlet(name="change",loadOnStartup=1,urlPatterns={"/change.do"}) //简化方式 @WebServlet("/change.do")
-
使用 web.xml 文件配置
<servlet> <!--servlet 文件名--> <servlet-name>LoginServlet</servlet-name> <!--servlet 字节码文件名--> <servlet-class>LoginServlet</servlet-class> <!--servlet 加载优先顺序--> <load-on-startup>10</load-on-startup> </servlet> <servlet-mapping> <!--servlet 文件名--> <servlet-name>LoginServlet</servlet-name> <!--servlet 处理的url路径--> <url-pattern>/login</url-pattern> </servlet-mapping>
-
-
重写 doGet() 和 doPost()方法
//servlet类处理 url 请求时,会调用 server 方法,通过server方法,根据html 页面的请求,再决定调用 doGet 还是 doPost 方法 //可以重写 server 方法接收 get 和 post 两种请求,但是不建议,实际多为重写 doGet 和 doPost protected void doGet(HttpServletRequest request, HttpServletResponse response) { } protected void doPost(HttpServletRequest request, HttpServletResponse response) { }
-
-
-
部署到 tomcat 中
-
在 web项目下创建文件夹, web ->WEB-INF->classes
文件夹名字不能错
-
设置项目输出 servlet字节码文件到classes 目录下
项目右键->properties->Java Build Path->Source->右下角的 Brower-> 指定位置是: 项目名/web/WEB-INF/classes
-
配置tomcat 中server.xml的
<context>
<!-- 根据实际情况配置 注意反双斜杠 配置完成需要重启tomcat --> <Context path="/" docBase="e:\\xxx\\web" debug="0" reloadable="false" />
-
2.3-Servlet获取参数
2.3.1-创建参数提交html页面
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录页面</title>
</head>
<body>
<form action="login" method = "post">
账号:<input type = "text" name = "name"><br>
密码:<input type = "password" name = "password"><br>
<input type = "submit" value = "登录">
</form>
</body>
</html>
2.3.2-创建 处理 页面 action 的 LoginServlet类
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {
//由于我们的html页面 请求方式为 post,所以只需要重写 doPost方法
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
String name = request.getParameter("name");
String password = request.getParameter("password");
System.out.println("name:" + name);
System.out.println("password:" + password);
}
}
2.3.3-映射 LoginServlet 到路径 login
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
2.3.4-通过html页面提交数据到表单中
- 重启 tomcat
- 访问页面 :http://127.0.0.1/login.html
- 提交数据,通过tomcat 控制台可以看到
2.4-Servlet返回响应
通过 response 对象,获取PrintWriter对象,再通过 PrintWriter对象调用println方法,输出 html 标签到页面
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
String password = request.getParameter("password");
String html = null;
if ("admin".equals(name) && "123".equals(password))
html = "<div style='color:green'>success</div>";
else
html = "<div style='color:red'>fail</div>";
PrintWriter pw = response.getWriter();
pw.println(html);
}
}
2.5-Servlet调用流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o5xw5j7c-1604567124818)(E:\图片\servlet 流程图.png)]
-
login.html
静态页面,可以通过 form提交数据
-
/login.html
将数据提交到 /login 路径
-
找到对应的 Servlet 来进行处理
-
实例化 Servlet对象
tomcat定位了 LoginServlet后,发现没有LoginServlet的实例化对象,就会调用LoginServlet的无参构造方法创建一个对象
-
调用 doGet() 或者 doPost() 方法
根据页面传的请求方式,调用对应的方法
-
request 获取参数
获取方法:
request.getParameter(String s)
-
response 设置响应
设置方法:
response.getWriter().println(String s)
-
tomcat把html传递给浏览器
2.6-Servlet service()
LoginServlet继承了HttpServlet,同时也继承了一个方法
service(HttpServletRequest , HttpServletResponse )
- 在执行doGet()或者doPost()之前,都会先执行service()
- 由service()方法进行判断,到底该调用doGet()还是doPost()
2.7-Servlet 处理中文
由于 tomcat 8以上,get请求没有乱码问题,所以这里只讲 post请求乱码处理
-
方法一:
-
接收数据之前,必须对request进行转码操作
request.setCharacterEncoding("UTF-8");
缺点:当存在大量 servlet 时,每个servlet都需要进行转发和转码,会很麻烦
-
-
方法二:
-
使用过滤器,如何让一个类称为过滤器组件
-
实现过滤器接口
javax.servlet.Filter
-
配置过滤器地址
//配置为需要过滤的地址 @WebFilter("/login")
-
实现 doFilter 方法
doFilter 方法必须进行转发,最后该找谁还是去找谁
对象名.doFilter(ServletRequest servletRequest,ServletResponse servletResponse)
-
-
2.8-Servlet生命周期
-
加载类
-
实例化
调用Servlet 无参构造方法,在内存中创建对象,开辟空间,多次调用Servlet,都只执行一次构造方法,Servlet 是单例设计模式
-
初始化
调用初始化方法 init() ,在创建对象的时候执行,整个声明周期,都只会执行一次
-
提供服务
service 方法,根据 service 方法 调用 doGet 或者 doPost
-
销毁
1、重新启动 web应用,就会调用 destroy()
2、关闭tomcat 时,destroy() 会被调用
-
被回收
Servlet 被销毁之后,就满足垃圾回收的条件,下一次进行垃圾回收就会把该对象回收
2.9-Servlet跳转
-
在Servlet服务端进行跳转
request.getRequestDispatcher("html文件").forward(request, response);
服务端进行跳转,前端的页面路径显示仍然不变,不会变成跳转到的html文件路径
-
客户端进行跳转
response.sendRedirect("html文件")
客户端进行跳转,浏览器的地址会变化
-
服务端跳转实际是服务端把跳转的页面处理,然后把html内容发送到浏览器,客户端跳转是服务端把跳转的页面路径返回给了客户端,客户端重新发起了请求
2.10-Servlet 自启动
tomcat 启动,有些初始化代码需要执行,但是 Servlet 的执行是被浏览器调用之后才开始的,这时候,就需要Servlet实现 自启动,即随着 tomcat的启动,进行初始化
-
使用web.xml,在web.xml中,加一行
<load-on-startup>10</load-on-startup>
-
使用注解映射
@WebServlet(name="change",loadOnStartup=1,urlPatterns={"/change.do"})
2.11-Servlet request常见方法
2.11.1-常见方法
方法名 | 作用 |
---|---|
request.getRequestURL() | 获取浏览器发出请求时的完整URL,包括协议 主机名 端口(如果有) |
request.getRequestURI() | 浏览器发出请求的资源名部分,去掉了协议和主机名 |
request.getQueryString() | 请求行中的参数部分,只能显示以get方式发出的参数,post方式的看不到 |
request.getRemoteAddr() | 浏览器所处于的客户机的IP地址 |
request.getRemoteHost() | 浏览器所处于的客户机的主机名 |
request.getRemotePort() | 浏览器所处于的客户机使用的网络端口 |
request.getLocalAddr() | 服务器的IP地址 |
request.getLocalName() | 服务器的主机名 |
request.getMethod() | 得到客户机请求方式一般是GET或者POST |
2.11.2-获取参数
方法名 | 作用 |
---|---|
request.getParameter() | 是常见的方法,用于获取单值的参数 |
request.getParameterValues() | 用于获取具有多值的参数,比如注册时候提交的 “hobits”,可以是多选的。 |
request.getParameterMap() | 用于遍历所有的参数,并返回Map类型。 |
2.11.3-获取头信息
方法名 | 作用 |
---|---|
request.getHeader() | 获取浏览器传递过来的头信息。 |
request.getHeaderNames() | 获取浏览器所有的头信息名称,根据头信息名称就能遍历出所有的头信息 |
2.12-Servlet response 用法
-
设置响应内容
通过
response.getWriter()
获取对象,可以使用println() ,append(),write(),format()
等方法设置返回给浏览器的html内容 -
设置响应格式
response.setContentType("text/html")
"text/html"就是格式,在 request 获取头信息对应的
request.getHeader("accept")
"text/html"存在,表示浏览器可以识别。如果换一个格式浏览器不能识别,就会打开一个下载文件的弹窗
通常使用该方式实现下载功能
-
设置响应编码
都需要在 response 使用前设置才能生效
方法一:
response.setContentType("text/html;charset = UTF-8")
方法二:
response.setCharacterEncoding("UTF-8")
-
-
301和302客户端跳转
302跳转
response.sendRedirect("html文件")
301跳转
//setHeader方法参数,第一个参数地址,第二个参数 html文件 response.setStatus(301); responde.setHeader("Location","fail.html");
-
设置不使用缓存
使用缓存可以让页面加载更快,减轻服务器的负担,但是也有可能看到过时信息,可以通过下面方法设置不使用缓存
response.serDateHeader(“Expires”,0);
response.setHeader(“Cache-Control”,“no-cache”);
response.setHeader(“pragma”,“no-cache”);