简介
Servlet(Server Applet) 。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,理解Servlet为后者。
所以说servlet就是实现了Servlet接口的类!用来响应HTTP请求并处理返回
生命周期
同样的在一个servlet的创建到销毁同样存在钩子函数
- Servlet 通过调用 init () 方法进行初始化。
- Servlet 调用 service() 方法来处理客户端的请求。
- Servlet 通过调用 destroy() 方法终止(结束)。
init()
整个生命周期只执行一次,,init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。可以做一些例如建立数据连接的操作
service()
在service方法会调用doGet、doPost、doPut、doDelete等方法,所以我基本只要根据客户端的请求方式重写doGet、doPost方法,因为这get,post两种请求方式最多。
destroy()
整个生命周期只执行一次,可以做一些例如关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘以及其他类似的清理活动。
注解配置方式
在servlet3开始往后无需想之前版本使用web.xml中的配置去映射到某个servlet才能使用,可以直接使用注解WebServlet实现,写在方法前
//@WebServlet("/login")
@WebServlet(name = "login", value = "/login" loadOnStartup="1")
public class login extends HttpServlet {
/*get请求时返回登录页面*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8"); //执行相应数据格式为html
......
}
value是指访问地址,loadOnStartup是指servlet在加载时的顺序,理解成优先级
HelloServlet
package com.hhtc.javaweb;
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet { //最重要的是继承HTTPServlet抽象类,该类最终继承自Servlet接口
private String message;
public void init() {
message = "Hello World!";
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>init()初始化的数据message为:" + message + "</h1>");
out.println("</body></html>");
}
@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
public void destroy() {
PrintWriter out = response.getWriter();
out.println("destroy()执行");
}
}
ServletContext对象
该对象是全局存储信息的对象,所有的客户端都可以访问这个共有的对象,
WEB容器在启动时,它会为每个Web应用程序都创建一个对应的ServletContext,它代表当前Web应用,并且它被所有客户端共享。
由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。公共聊天室就会用到它。
当web应用关闭、Tomcat关闭或者Web应用reload的时候,ServletContext对象会被销毁。
共享数据
//某个servlet设置共享数据
ServletContext context = this.getServletContext();//获取上下文
String username = "lsp";
context.setAttribute("username",username);
//另一个servlet获取共享数据
final ServletContext context = this.getServletContext();
String username = (String)context.getAttribute("username");
请求转发
一般请求转发都是使用HTTPServletRequest实现,虽然该ServletContent上下文对象也可实现
this.getServletContext().getRequestDispatcher("/login").forward(request, response);
因为存在ServletContext中的数据在服务器中会长时间,这样就会占用很多内存,因此在使用ServletContext时,建议不要往里面添加过大的数据!
HttpServletResponse
HttpServletResponse和下面的HttpServletRequest都是在调用doGet,doPost方法时传入的两个对象参数
HttpServletResponse是第二个参数,用于设置HTTP响应
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
请求重定向:resp.sendRedirect("/login/index2");
在服务器收到请求后,一般逻辑都是处理好数据之后对其响应返回数据,但不,可以直接请这个请求处理交由另一个servlet去处理,再去响应。
还有很多方法,例如void setCharacterEncoding(String charset)
,用于设置响应的编码类型,等等很多方法都是对HTTP响应的设置
HttpServletRequest
HttpServletRequest是doPost或doGet方法的第一个参数,用于设置HTTP请求
在servlet程序中可以通过Cookie[] getCookies()
返回一个数组,包含客户端发送该请求的所有的 Cookie 对象。
读取请求参数
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>用户登录</h1>
<form action="${pageContext.request.contextPath}/login" method="post">
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="password"><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
从上边前端页面输入的数据要在servlet中拿到数据
- req.getRequestDispatcher("/index.jsp").forward(req,resp); 请求转发,也就是返回哪个jsp页面
- req.getParameter("name") 获取前端传过来的参数,可以是get方式也可以是post方式传过来的,反正通过k获取
public class Login extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");//设置请求响应编码
resp.setCharacterEncoding("utf-8");
//获取请求参数
final String username = req.getParameter("username");
final String password = req.getParameter("password");
System.out.println("用户名:" + username);
System.out.println("密码:" + password);
//请求转发
req.getRequestDispatcher("/success.jsp").forward(req,resp);
}
}
标签:请求,Servlet,菜鸟,前端,req,ServletContext,servlet,resp From: https://www.cnblogs.com/ruyan-lx/p/16894727.html参考:https://www.cnblogs.com/wyzstudy/p/15711382.html