文章目录
Servlet可以处理客户端传来的HTTP请求,并返回一个响应。
Servlet
(1)Servlet类需要继承类HttpServlet
(2)Servlet的父类HttpServlet中包含了几个重要方法,根据需要重写他们:
- init():初始化方法,Servlet对象创建后,接着执行该方法。
- doGet():当请求的类型是“get”时,调用该方法。
- doPost():当请求的类型是“post”时,调用该方法。
- service():Servlet处理请求时自动执行service()方法,该方法根据请求的类型(get或post),调用doGet()或doPost()方法,因此,在建立Servlet时,一般只需要重写doGet()和doPost()方法。
- destroy():Servlet对象注销时自动执行。
(3)Servlet编写好后,需要进行配置才能起作用,配置方法有xml(在web.xml中配置)和注解两种(新版本的Servlet和IDE主要使用后者),配置项有多个,其中访问地址(URL Mappings)是必不可少的。
public class Servlet 类名称 extends HttpServlet{
public void init(){}
public void doGet(HttpServletRequest request,HttpServletResponse response){}
public void doPost(HttpServletRequest request,HttpServletResponse response){}
public void service(HttpServletRequest request,HttpServletResponse response){}
public void destroy(){}
}
Servlet(Web容器)
配置方法:
- 注解
- Web.xml
Servlet生命周期
初始化阶段
加载和实例化Servlet:
- 当容器启动或首次请求某个 Servlet 时,容器会读取 web.xml 或 @WebServlet 中的配置信息,对指定的 Servlet 进行加载。加载成功后,容器会通过反射对 Servlet 进行实例化。
- 因为 Servlet 容器是通过 Java 的反射 API 来创建 Servlet 实例的,需要调用 Servlet 的默认构造方法(default constructor,即不带参数的构造方法),所以在编写 Servlet 类时,不能只提供一个带参数的构造方法。
调用init()方法进行初始化:
- 加载和实例化完成后,Servlet 容器调用 init() 方法初始化 Servlet 实例。
- 初始化的目的:让 Servlet 实例在处理请求之前完成一些初始化工作,例如建立数据库连接,获取配置信息等。
- 在 Servlet 的整个生命周期内,init() 方法只能被调用一次。
- 初始化期间,Servlet 实例可以通过 ServletConfig 对象获取在 web.xml 或者 @WebServlet 中配置的初始化参数。
运行时阶段
- Servlet 容器接收到来自客户端请求时,容器会针对该请求分别创建一个 ServletRequst 对象和 ServletResponse 对象,将它们以参数的形式传入 service() 方法内,并调用该方法对请求进行处理。
- 在 service() 方法中,Servlet 通过 ServletRequst 对象获取客户端的相关信息和请求信息。在请求处理完成后,通过 ServletResponse 对象将响应信息进行包装,返回给客户端。当 Servlet 容器将响应信息返回给客户端后,ServletRequst 对象与 ServletResponse 对象就会被销毁。
- 在 Servlet 的整个生命周期内,对于 Servlet 的每一次请求,Servlet 容器都会调用一次 service() 方法,并创建新的 ServletRequest 和 ServletResponse 对象。即 service() 方法在 Servlet 的整个生命周期中会被调用多次。
销毁阶段
- 当 Servlet 容器关闭、重启或移除 Servlet 实例时,容器就会调用 destory() 方法,释放该实例使用的资源,例如:关闭数据库连接,关闭文件的输入流和输出流等,随后该实例被 Java 的垃圾收集器所回收。
- 每个 Servlet 实例来说,destory() 方法只能被调用一次。
load-on-startup元素
- 它的取值必须是一个整数;
- 当值小于 0 或者没有指定时,则表示容器在该 Servlet 被首次请求时才会被加载;
- 当值大于 0 或等于 0 时,表示容器在启动时就加载并初始化该Servlet,取值越小,优先级越高;
- 当取值相同时,容器就会自行选择顺序进行加载。
Servlet、JavaBean、jsp的关系
- JSP是页面,Servlet和JavaBean是类,JSP在执行时会先翻译成Servlet;
- JavaBean供JSP或Servlet调用,不能独立运行。
- 从功能上说,Servlet和Jsp是等价的,都可以用来执行代码处理客户端的请求,事实上Servlet出现早于Jsp,Servlet在输出页面内容时非常繁琐(用一系列的out.write()语句),为了克服这个缺点诞生了Jsp技术,但Servlet并没有因此退出历史舞台,Servlet侧重于代码设计,Jsp侧重于界面设计,两者各有所长,在一些开发模式中,如MVC模式,就充分利用两者的特点,让它们在开发中担任不同的角色。
Session和Cookie(面试常见)
Session
服务器保存
内存,持久化
保存登录信息
基于Cookie(SESSIONID)
浏览器关闭了第三方cookie怎么处理?
Cookie
客户端浏览器保存
保存账号密码
自动登录
只能存字符串
有长度限制
不安全
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// COOKIE
Cookie co=new Cookie("user_name","zhansan");//只能存字符串。
co.setMaxAge(7*24*60*60);//设置生效时间(7天)
resp.addCookie(co);
co=new Cookie("user_pass","123456");
resp.addCookie(co);
req.getSession().setAttribute("name", "123");
}
Request和Response
Request请求对象:
req.getAttribute()
req.getParameter()
req.getParameterMap()
req.getParameterNames()
req.getParameterValues()
req.getCharacterEncoding()
req.getRequestDispatcher()
Response响应对象:
resp.getCharacterEncoding()
resp.getOutputStream()
resp.getWriter().write("");
resp.setCharacterEncoding();
resp.sendRedirect();
请求转发和重定向(面试常见)
转发:
JSP:<jsp:forward page="文件的名字" />
Servlet:request.getRequestDispatcher("").forward(request,response);
重定向:
resp.sendRedirect("路径");
Get和Post(面试常见)
- GET 和 POST 请求都是 http 的请求⽅式,⽤⼾通过不同的 http 的请求⽅式完成对资源(url)的不同操作。 GET ⼀般⽤于获取/查询资源信息,⽽ POST ⼀般⽤于更新资源信息 。
- Get 请求提交的数据会在地址栏显⽰出来,⽽ post 请求不会再地址栏显⽰出来. GET 提交,请求的数据会附在 URL 之后(就是把数据放置在 HTTP 协议头中),以?分割 URL 和传输数据,多个参数⽤&连接; POST 提交:把提交的数据放置在是 HTTP 包的包体中,因此,GET 提交的数据会在地址栏中显⽰出来,⽽ POST 地址栏不会改变 。
- 传输数据的⼤⼩ http Get 请求由于浏览器对地址⻓度的限制⽽导致传输的数据有限制。⽽ POST 请求不会因为地址⻓度限制⽽导致传输数据限制。
- 安全性,POST 的安全性要⽐ GET 的安全性⾼。由于数据是会在地址中呈现,所以可以通过历史记录找到密码等关键信息。
Jsp+Servlet完成两个数的求和
输入页面:
<%@ page pageEncoding="UTF-8" %>
<html>
<body>
<form method="post" action="add">
输入第一个整数:<input type="text" name="n1"><br>
输入第二个整数:<input type="text" name="n2"><br>
<input type="submit" value="求和"/>
</form>
</body>
</html>
Servlet关键代码:
package servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/add")
public class AddServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
int n1=Integer.parseInt(request.getParameter("n1"));
int n2=Integer.parseInt(request.getParameter("n2"));
String result=n1+"+"+n2+"="+(n1+n2);
request.setAttribute("msg",result);
request.getRequestDispatcher("/output.jsp").forward(request,response);
}
}
输出页面:
<%@ page pageEncoding="UTF-8" %>
<html>
<body>
${msg}
</body>
</html>