Servlet学习笔记
创始人
2024-03-30 16:26:34
0

文章目录

  • Servlet生命周期
    • Servlet在整个生命周期中被调用的方法
    • Servlet运行原理
  • Servlet三种实现方式
    • 1.实现 javax.servlet.Servlet接口
    • 2.继承GenericServlet类
    • 3.继承HttpServlet类
  • 访问Servlet的几种方式
  • Session创建和销毁
  • Session怎么存值
  • Cookie案例代码
  • Cookie怎么设置有效期
  • Cookie写入和读取
  • Session和Cookie的区别
    • 不同
    • 联系
  • Servlet三个作用域
    • 1、request作用域:
    • 2、session作用域:
    • 3、application作用域:针对同一个web项目/web应用
  • 配置Servlet(使用标签)
    • 1、在 web.xml 文件中配置
    • 2、使用注解配置
  • Servlet输出HTML、字符串、json
    • 输出HTML
    • 输出字符串
    • 输出json
  • 发请求怎么传参数
  • 请求转发
  • 重定向


Servlet生命周期

Servlet的生命周期可以概括为以下几个阶段:
(1)、当支持Servlet运行的Web容器接收到客户端的请求时,会先判断用户所请求的Servlet对象是否存在。
如果不存在,则需要加载Servlet类,创建 Servlet的对象,然后调用Servlet的init( ) 方法进行初始化。

(2)、容器针对本次客户端请求创建 ServletRequest 和 ServletResponse 对象,并且创建一个线程,调用Servlet对象的service( )方法,,service()方法再根据客户端的请求方式间接调用 doGet() 方法或者 doPost() 方法。
service()方法运行结束后产生响应,容器将响应发回客户端。

(3)、当Web应用被卸载或者服务器被关闭的时候,容器会销毁为本次客户端请求创建的 ServletRequest 和 ServletResponse 对象以及相应的线程。此时会调用 destroy() 方法释放资源。

需要注意的是,加载 Servlet 类,创建 Servlet 对象、调用初始化方法 init() 和销毁方法 destroy() 在Servlet的整个生命周期中都只有一次。

Servlet在整个生命周期中被调用的方法

Servlet在整个生命周期中会有一些方法被服务器自动调用,其中的主要方法有:
init( )方法:用于初始化
Destro( )方法:用于释放资源
service( )方法:服务类方法,对用户的请求进行处理,并对用户进行响应,几乎所有处理功能都在这里完成。service( )方法通常会激活doGet( )或 doPost( ) 方法。
doGet( )方法可以响应get方式的请求,doPost( ) 方法可以响应 post方式的请求。
一般不推荐直接重写 service( )方法,而是应该重写doGet( )或者 doPost( )方法。通常,表单提交常使用post方式,超链接使用 get 方式。

Servlet运行原理

在这里插入图片描述

Servlet三种实现方式

实现Servlet的三种方式:一个实现,两个继承

1.实现 javax.servlet.Servlet接口

@WebServlet(urlPatterns = "/second",initParams = {@WebInitParam(name="user",value="Tom")})
public class Second implements Servlet {private ServletConfig config;@Overridepublic void destroy() {// TODO Auto-generated method stub}@Overridepublic ServletConfig getServletConfig() {// TODO Auto-generated method stubreturn null;}@Overridepublic String getServletInfo() {// TODO Auto-generated method stubreturn null;}@Overridepublic void init(ServletConfig arg0) throws ServletException {// TODO Auto-generated method stubthis.config=arg0;       }@Overridepublic void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {// TODO Auto-generated method stubPrintWriter out=arg1.getWriter();    out.print("this is Second Servlet");out.print(this.config.getInitParameter("user"));//释放printwriter对象out.flush();out.close();}
}

2.继承GenericServlet类

@WebServlet(urlPatterns = "/third")
public class Third extends GenericServlet {@Overridepublic void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {PrintWriter out=arg1.getWriter();	out.print("this is Third Servlet");//释放printwriter对象out.flush();out.close();}
}

3.继承HttpServlet类

//编写一个类去继承HttpServlet抽象类重写doget( )和dopost( )方法
public class HelloHttp extends HttpServlet{//处理get请求public void doGet(HttpServletRequest req, HttpServletResponse res){//业务逻辑try{PrintWriter pw = res.getWriter();pw.println("hello, Http");}catch (Exception e){e.printStackTrace();}}public void doPost(HttpServletRequest req, HttpServletResponse res){this.doGet(req,res);    }
}

访问Servlet的几种方式

访问Servlet的几种方式

Session创建和销毁

session什么时候被创建
HttpServletRequest.getSession(true) 这样的语句时才会被创建。 所以没有调用getSession方法则不会创建session。

要了解Session首先要知道一个概念:
Session的销毁只有两种情况:
第一:session调用了 session.invalidate()方法。
第二:前后两次请求超出了session指定的生命周期时间。

// 新建一个session时触发此操作  public void sessionCreated(HttpSessionEvent se) {   System.out.println(se.getSession().getId());  }  // 销毁一个session时触发此操作  public void sessionDestroyed(HttpSessionEvent se) {  System.out.println(se.getSession().getId()); }  

Session怎么存值

● Session中的数据是通过哈希表的方式进行存取的:
● setAttribute(String name,Object value)
● Object getAttribute(String name)

//存值
session.setAttribute(name, value);

Cookie案例代码

Cookie案例代码

Cookie怎么设置有效期

● public void setMaxAge(int maxAge):设置Cookie的有效时间,以秒为单位
● maxAge如果为正数,在有效期内,用户关闭浏览器后再重新启动,Cookie仍有效
● maxAge如果为负数,只在当前浏览器有效,当关闭浏览器时,Cookie失效
● maxAge如果为0,会删除过去有效的Cookie。
● public int getMaxAge():获取cookie在失效以前的最大时间,以秒计算

//有效期设为7天
cookie.setMaxAge(60 * 60 * 24 * 7);

Cookie写入和读取

先写一个HTML页面,在HTML表单提交后,action = “cookie_demo1/hello”
提交到servlet,servlet获取到表单内容,并且设置cookie给浏览器,同时跳转到注册页面2.html,
在2.html填写相应的内容后action=“cookie_demo1/hello1”
servlet1获取2.html中的内容并且获取到浏览器中的cookie

//写入
Cookie c=new Cookie("season","spring");c.setMaxAge(30);    //cookie的有效期为30秒response.addCookie(c); //将cookie写入客户端
//读取
Cookie[] a=request.getCookies();//根据设置时的cookie个数决定数组元素个数for( int i=0;iString name=(String)(a[i].getName());String value=(String)(a[i].getValue());out.println(name+”:”+value);}

Session和Cookie的区别

1、Cookie可以存储在浏览器或者本地,Session只能存在服务器
2、session能够存储任意的java对象,cookie 只能存储String 类型的对象
3、Session比Cookie更具有安全性 (Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击)
4、Session占用服务器性能,Session过多,增加服务器压力
5、单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie,Session是没有大小限制和服务器的内存大小有关。

不同

存放地点:cookie存放在客户端的硬盘里,属于离线存放,而session存放在服务器的内存中。

存活时间:cookie可以长期存放在客户端,具体的存活时间由setMaxAge()方法所指定的数值决定,session随用户访问服务器而产生,随客户超时或下线而消失。

安全性:cookie存放在客户端,可能会被别有用心的网站读取,安全性较差,而session存放在服务器的内存中,用户不能修改,且随客户端浏览器的关闭而消失,安全性较好。

联系

不论是cookie还是session隐含对象都需要浏览器支持cookie并且没有禁用cookie。

Servlet三个作用域

1、request作用域:

针对同一次请求,一般存放提示信息
每一次请求都是一个新的request对象,如果Web组件之间需要共享同一个请求中的数据,只能使用request作用域
对象类型 javax.servlet.http.HttpServletRequest

2、session作用域:

针对同一次会话,一般存放用户信息
每一次会话都是一个新的session对象,如果需要一个会话中的多个同一个请求之间需要共享数据,只能使用session作用域
对象类型 javax.servlet.http.HttpSession

3、application作用域:针对同一个web项目/web应用

Tomcat从启动到关闭,web项目中有且仅有一个application对象,作用于整个Web应用,可以实现多个会话之间的数据共享
对象类型 javax.servlet.ServletContext
在这里插入图片描述

配置Servlet(使用标签)

配置Servlet有两种方式

1、在 web.xml 文件中配置

helloHelloWorldhello/hello

2、使用注解配置

//在Servlet所在的 java 文件中使用注解
@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;public void doGet(HttpServletRequest request, HttpServletResponse response) throws 	ServletException, IOException {doPost(request, response);PrintWriter out = response.getWriter();out.print("注解方式配置Servlet访问");}
}

Servlet输出HTML、字符串、json

输出HTML

HTML:创建一个Servlet类,实现返回页面HTML内容:

@WebServlet(name="PageServlet",urlPatterns = "/Servlet/PageServlet")
public class PageServlet extends HttpServlet {@Overridepublic void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html");response.setCharacterEncoding("UTF-8");PrintWriter out = response.getWriter();out.println("");out.println("Servlet 实例");out.println("");out.println("hello world!");out.println("
Servlet实例:");out.println(this.getClass());out.println("");out.println("");out.flush();out.close();} }

输出字符串

字符串:创建一个Servlet类,实现返回字符串

@WebServlet(name="CharacterServlet",urlPatterns = "/Servlet/CharacterServlet")
public class CharacterServlet extends HttpServlet {@Overridepublic void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String result = "hello world!";//返回结果response.setContentType("text/html");response.setCharacterEncoding("UTF-8");// 获取PrintWriter对象PrintWriter out = response.getWriter();out.print(result);// 释放PrintWriter对象out.flush();out.close();}
}

输出json

Josn:创建JsonServlet类,实现Servlet类返回JSON内容。

@WebServlet(name="JsonServlet",urlPatterns = "/Servlet/JsonServlet")
public class JsonServlet extends HttpServlet {@Overridepublic void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String json = "{\n" +"\t\"userId\": 1,\n" +"\t\"userName\": \"hello world\",\n" +"\t\"blogUrl\": \"https://cn.bing.com\",\n" +"\t\"sex\": \"男\"\n" +"}";//返回结果response.setContentType("application/json");response.setCharacterEncoding("UTF-8");// 获取PrintWriter对象PrintWriter out = response.getWriter();out.print(json);// 释放PrintWriter对象out.flush();out.close();}
}

发请求怎么传参数

http://localhost:8080/Project/Servlet?name=Tom&age=20

请求转发

//请求转发
request.getRequestDispatcher("/index").forward(request, response);
//一个请求 一个响应

重定向

重定向到百度网站
response.sendRedirect("http://www.baidu.com");
重定向到另一个Servlet
response.sendRedirect("Login2");
//两个请求  两个响应response.sendRedirect("请求地址");

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...