关于servlet理解

要点一:servlet的工作流程

首先浏览器向服务器发送一个请求,之后http会创建一个servlet的实例对象,通过这个实例对象来调用方法得到一个结果,结果以二进制返回浏览器。

要点二:servlet对象的生命周期

首先声明,servlet接口的实例对象不能由人工手动创建,而只能由服务器自动创建。
1.在默认的情况下,服务器在收到servlet实现类的第一次请求时自动创建servlet实例对象。
在手动配置的情况下,要求服务器在启动时,自动创建某个servlet接口实现类的实例对象。
2.服务器运行期间,一个servlet接口只能创建一个实例对象。
3.http服务器关闭时,自动将所有servlet对象进行销毁。

要点三:开发步骤

1.创建一个JAVA类继承httpservlet父类,使之成为servlet接口实现类。
2.重写servlet的doPost/doGet方法。(这两个方法实际上是在父类的service中被调用的)
3.将servlet接口实现类注册到服务器中,即在web.xml中注册声明。

<servlet>
    <servlet-name>声明一个变量存储servlet接口实现类的路径</servlet-name>
    <servlet-class>servlet接口实现类的路径</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>同上servlet-name</servlet-name>
    <url-pattern>别名(降低难度)</url-pattern>
</servlet-mapping>

要点四:理解两个参数

HttpServletRequest req:请求对象,可以读取请求协议包中请求行信息,可以读取请求头、请求体中请求参数信息,可以代替浏览器向服务器申请资源文件调用。

//得到请求行中url信息
request.getRequestURL().toString();
//得到请求行中Method信息
request.getMethod();
//获取URI信息
request.getRequestURI();
//获得请求头中所有请求参数名
request.getParameterNames();
//通过请求对象,得到请求参数
String userName = req.getParameter("userName");

HttpServletResponse resp:响应对象,负责将doGet/doPst方法执行的结果写入到响应体中交给浏览器

//通过响应对象将地址赋值给响应头中的location属性
resp.sendRedirect(arg0);

要点五:请求三要素

请求地址、请求方式(doPost/doGet)、请求参数。

要点六:多个Servlet之间调用

1.重定向解决方案

response.sendRedirect("资源路径");

优点
不仅可以把本网站的资源文件发送给浏览器,还可以把其他网站的资源文件发送给浏览器,通过地址。
缺点
需要在浏览器和服务器之间多次往返,大量时间消耗在往返次数上,增加用户等待服务时间。
原理:通俗点来讲就是当servlet1工作完毕之后,将servlet2的文件地址通过响应头返回给浏览器,浏览器又接到一次请求,在访问一次servlet2.
2.请求转发解决方案

//通过当前请求对象生成资源文件申请报告对象,并将报告发送给服务器
req.getRequestDispatcher("/资源文件名").forward(req, resp);

优点:
只用浏览器向服务器发送一次请求,增加了处理速度,节省了服务器与浏览器之间往返次数。
缺点:
只能把本网站的资源文件发送给浏览器
原理:
servlet1工作完毕后,通过当前请求对象代替浏览器向服务器发送请求,申请调用servlet2,服务器收到请求,调用servlet2。

要点七:servlet之间的实现数据共享

1.servletContext:全局作用域对象,其中一个servlet将一个数据添加到这个对象中,另一个通过这个对象拿到这个数据。
1)生命周期:服务器启动时创建,且运行期间一个网站只有一个,运行期间一直存活,服务器关闭时,当前对象销毁。
2)应用代码:

//得到服务器启动时创建的ServletContext
ServletContext application = req.getServletContext();
//向其中插入数据
application.setAttribute("key1", 数据);
//通过ServletContext得到数据
application.getAttribute("key1");

2.cookie:同一个网站,同一个浏览器/用户提供服务,存放当前用户的私人数据,在共享数据过程中提高服务质量。
1)工作流程:servlet1在运行期间创建一个cookie存储当前用户相关数据,工作完毕后,将cookie写入响应头中交还给浏览器,浏览器将cookie存储在浏览器的缓存中,一段时间后,通过同一浏览器向网站发出请求,浏览器需要无条件的将网站之前发送过去的cookie写入到请求头中发送过来,servlet运行时,通过读取cookie中信息得到共享数据。
2)应用代码

//创建一个cookie
Cookie card = new Cookie(userId, userId);
//将cookie加入到响应头中
resp.addCookie(card);
//找到请求头中的cookie
Cookie cookieArray[] = req.getCookies();
//读取cookie中的数据
for(Cookie card1:cookieArray) {
		card1.getValue();	//读取value
		card1.getName();	//读取key
}

3)销毁时机
默认情况下,浏览器关闭被销毁。
手动设置的话,要求cookie存放在客户端计算机的硬盘上,同时指定存活时间,存活时间到达自动从硬盘中删除。

对象.setMaxAge(60)//存活1分钟

3.HttpSession:同样是需要在同一个浏览器和用户中,与cookie基本类似
1)工作流程
其中一个servlet创建Session,并填入数据,另外一个得到这个session,并从中找到数据。
2)应用代码

//得到Session对象,如果没有就创建
HttpSession session = req.getSession();
//得到Session对象,如果没有返回null
HttpSession session = req.getSession(false);
//向Session中加入数据
session.setAttribute("key1", 数据);
//在Session中获得数据
session.getAttribute("key1");

3)销毁时机
用户与HttpSession关联时使用的cookie(cookie存储此网站对应的session的id)只能存放在浏览器缓存中。
应当是浏览器关闭,关系被切断。但服务器无法检测浏览器何时关闭,所以浏览器关闭无法解决销毁,因此需要为每一个httpsession对象设置空闲时间,默认为30分钟。
需要在web.xml中手动设置。

<session-config>
	<session-timeout>5</session-timeout>//最大时间5分钟
</session-config>

4)与cookie区别
①存储位置不同:cookie存放在客户端计算机中,HttpSession存放在服务端计算机内存。
②存储数据类型不同:cookie存储类型只能是String,HttpSession可以存储任意类型的数据
③存储数据数量不同:一个cookie中只能放一个数据,HttpSession使用map集合存储,可以存储任意数量共享数据。

4.HttpServletRequest接口实现
通过请求转发方式,实现请求对象的共享。前面提到过请求转发方式。

要点八:监控器接口

1)介绍
监控器接口是一组接口,共8个,需要具体实现,主要用于监控作用域对象生命周期变化时刻以及作用域对象共享数据变化时刻
2)作用域对象
在服务器内存中可以在某些条件下为两个servlet之间提供数据共享方案的对象
ServletContext:全局作用域对象
HttpSession:会话作用域对象
HttpServletRequest:请求作用域对象
3)开发规范
①根据监听的实际情况,选择对应监听器接口
②重写接口,声明监听事件处理方法
③在web.xml将监听器接口实现类注册到服务器。
4)应用代码

//在ServletContextListener接口中的两个需要定义的方法
ContextInitlized();//ServletContext初始化时被调用
ContextDestroy();//ServletContext销毁时被调用
//web.xml声明
<listener>
<listener-class>类路径</listener-class>
</listener>
//在ServletContextAttributeListener接口
ContextAdd();//添加共享数据时调用
ContextReplaced();//更新时调用
ContextRemove();//删除时调用

5)主要用途
可提高程序运行速度
思路:每次执行增删改查操作时都需要当时与数据库进行连接,消耗了大量时间,而我们可以在服务器启动时,使用监听器直接创建连接,节省了每次与数据库连接所用的时间,让效率大大提升。
主要使用方法:ContextInitlized();原因主要是因为ServletContext对象的声明周期问题。

要点九:过滤器接口

1)介绍
由开发人员负责提供,在http服务器调用资源文件之前,对http服务器进行拦截。
2)作用
帮助http服务器检测当前请求的合法性。
对当前请求进行增强操作。
3)开发步骤
①创建一个JAVA类实现Filter接口。
②重写Filter接口中doFilter方法。
③web.xml将实现类注册到服务器。
4)应用代码
检测合法性

//根据请求包得到参数
//如果可以放行
filterChain.doFilter(servletRequest,servletResponse)
//如果不能放行,代替服务器拒绝本次请求。

//web.xml注册
<filter>
<filter-name>声明存储类文件的变量</filter-name>
<filter-class>类文件</filter-class>
</filter>
<filter-mapping>
<filter-name>声明存储类文件的变量</filter-name>
<url-pattern>被过滤文件</url-pattern>
</filter-mapping>

增强:针对所有的Servlet请求

//编码方式设置为utf-8
req.setCharacterEncoding("utf-8");
filterChain.doFilter(req,resp);
//web.xml声明方式相同

另外能用创建Session的方式进行对恶意登录的拦截,即有session对象即有令牌,能进,没有则不能进。
对于loginServlet而言可以使用getRequestURI(),即如果包含涉及到登录有关操作,例如loginServlet等直接放行,能解决此问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值