03-Servlet初识
Servlet
一、Servlet概述
- Servlet就是运行在服务器(tomcat)上的java程序
- Servlet用来处理客户端请求的,以及负责对客户端的响应。
- Servlet默认情况下是单例模式的,每次用户访问,都是开启一个新的线程,调用service方法处理
二、如何使用Servlet
- 先引入servlet-api.jar
- 编写一个Java类,继承HttpServlet
- 重写service(request,response)方法
- 在service方法中处理请求,以及进行响应
请求如何找到我的servlet?
-
方式一:
-
方式二
三、Servlet 配置到web.xml
1. 方式一
配置到web.xml的作用,让tomcat帮我们创建对象,并映射地址,当地址匹配,由tomcat调用这个
对象的service方法进行处理!
地址:
例如http://ip地址:端口号/项目名称/地址
http://localhost:8080/08_servlet/login
1.将servlet配置到web.xml 并起别名
<servlet>
<servlet-name>任意标识符</servlet-name>
<servlet-class>类的全称(包名+类名)</servlet-class>
</servlet>
2.根据别名,映射一个网址
<servlet-mapping>
<servlet-name>与第一步标识一致</servlet-name>
<!--
访问servlet的规则:
http://ip地址:端口号/项目名称/地址
-->
<url-pattern>/地址</url-pattern>
<!--
/ 拦截没有后缀的请求
/* 拦截所有请求
*.do 拦截所有以.do结尾的请求
-->
</servlet-mapping>
2. 方式二
import javax.servlet.annotation.WebServlet;
@WebServlet("/denglu")
public class sessionServlet extends HttpServlet{
...
}
四、常用方法
1. request 请求接收
-
request.setCharacterEncoding("UTF-8")
设置请求接收的编码集 什么时候用 接收参数乱码时要设置,get请求不好使
-
request.getParameter("key")
接收请求参数
-
request.getParameterMap()
请求接收参数,封装到map集合中 ,通过 map.get(key);
-
request.setAttribute("key", value)
将数据设置到request作用域中
-
request.getRequestDispatcher("转发的页面地址").forward(request, response)转发
-
HttpSession session = request.getSession()
获取session
-
request.getServletPath()
获取servlet请求路径 比如发送的请求是 http://localhost:8080/08_servlet/login 那么获取的就是: /login
2. response 请求响应
-
response.setCharacterEncoding("UTF-8")
请求响应的编码格式
-
response.sendRedirect(重定向的请求或页面"")
重定向
-
response.setContentType("text/html;charset=UTF-8")
设置响应内容类型
-
PrintWriter out = response.getWriter()
给客户端响应
五、servlet的生命周期
-
init
方法进行初始化
-
service
提供服务
-
destroy
销毁
-
GC回收
六、补充:get请求与post请求区别(面试题)
- get请求:请求地址在url中以键值对的形式 拼接,可传输的数据量小,且不安全
- post请求:请求的数据 存在在请求体中,可以传输大量的数据,例如视频、音频等等,且数据传输时,较为安全
get请求乱码处理:
new String(username.getBytes("ISO-8859-1"), "UTF-8");
七、Session
-
什么是session
服务器端为了保存用户的状态而创建的一个特殊的对象
-
如果取获取session对象?
HttpSession session = request.getSession(boolean flg);
-
常用方法:
session.setAttribute(String name,Object obj); 向session中设置值 session.getAttribute(String name); 获取session中的值 session.removeAttribute(String name); 移除session中的值
-
服务器为什么会将空闲时间长的session对象进行删除掉
为了节省内存空间,大部分服务器默认超时时间为30分钟
-
修改session 存储时间
-
方式一
<session-config> <!-- session 存储时长 默认30分钟 ,可以修改 --> <session-timeout>60</session-timeout> </session-config>
-
方式二
session.setMaxInactiveInterval(int seconds);
-
-
删除session
session.invalidate();
-
session 验证
登录成功之后,在session对象上绑定一些数据,例如: session.setAttribute("user",user); 当用户访问需要保护的资源时,进行sesion验证,例如: Object obj = session.getAttribute("user"); if(obj == null){//没有登录 response.sendRedirect("login.jsp"); }
八、Cookie
1. Cookie简介
访问某些网站后在本地存储的一些网站相关信息,下次访问时减少一些操作。更准确的说法时:Cookie
是服务器在本地机器上存储的一小段文本并随每一个请求发送至同一服务器,是在客户端保存状态的方案。
cookie的主要内容包括: 名字、值、过期时间、路径和域
2. cookie使用
Cookie cookie = new Cookie("存到cookie对象的变量名","值");
cookie 如果存中文必须给他设置编码,因为cookie不能存储中文,否则有中文会报错
URLEncoder.encode(值,编码);
写入cookie时进行编码
URLDecoder.decode(值,编码);
cookie中读出时解码
3. cookie生命周期
cookie生命周期瞬间
设置cookie的生命周期时间
setMaxAge(秒)
setMaxAge(Integer.MAX_VALUE);设置cookie的最大生命周期,否则浏览器关闭后cookie即失效。
4. 获取cookie的三种方式
1:在jsp页面中遍历cookie,找到指定的cookie
Cookie[] cookies = request.getCookie();
遍历cookies集合获取
2: el内置对象cookie,当cookie值为中文时,会出现乱码
${cookie.key.value} 获取cookie的值
${cookie.key.name} 获取cookie的键
3:jQuery Cookie 需要引入js文件
5. cookie 和 session 区别
-
cookie数据存放在客户的浏览器上,session数据放在服务器上。
-
cookie不是很安全,别人可以分析存放在本地cookie并允许cookie欺骗
-
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器
性能方面,应当使用cookie -
单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie
-
建议
将登录信息等重要的信息存放在session其他信息如果需要保留,可以放在cookie中
九、JavaWeb项目读取 properties 配置文件
暂不掌握
方式一:java.util.ResourceBundle 读取资源属性文件
方式二:通过类加载目录 getClassLoader() 加载属性文件 src下
InputStream in = JDBCUtil.class.getClassLoader().getResourceAsStream("db.properties");
Properties p = new Properties();
p.load(in);
十、web三大组件
1. Servlet
2. Filter 过滤器
Filter 称为 过滤器,它是Servlet技术中最实用的技术,web开发人员通过Filter技术,对web服务器管理的所有web资源:例如jsp、servlet、静态图片、文件、静态html进行拦截,从而实现一些特殊的功能,例如实用url级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能
类似于Django中的中间件功能,在请求来的时候进行第一步过滤请求
<1>、FIlter使用
-
编写一个类,实现Filter接口
public class Filters implements Filter{ @Override public void destroy() { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 设置编码请求和响应的格式 request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); // 放行,执行完后一定要放行 chain.doFilter(request, response); } @Override public void init(FilterConfig arg0) throws ServletException { } }
-
在web.xml文件中进行拦截配置
<filter> <filter-name>filter</filter-name> <filter-class>com.tl.servlet.Filters</filter-class> </filter> <filter-mapping> <filter-name>filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>login</servlet-name> <servlet-class>com.tl.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/login.do</url-pattern> </servlet-mapping> <filter>
<2>、生命周期
- init 初始化
- doFilter 过滤
- distory 销毁
程序启动调用Filter的init() 方法(永远只调用一次),程序停止调用Filter 的 destory()方法(永远只调用一次,doFilter方法每次访问请求如果符合拦截条件都会调用(程序第一次运行,会在servlet调用init方法以后调用,以后不管调用几次都会调用doGet、doPost()方法之前))
<3>、使用场景
-
用户身份的认证
-
编码设置
-
资源权限审核
-
加密解密访问等等
3. Listener 监听器
<1>、什么是监听器
web监听器是一只红Servlet中的特殊类,它能帮助开发者监听web中的特定事件,比如:ServletContext、HttpSession、ServletRequest的创建和销毁、变量的创建、销毁和修改等,可以在某些动作前后增加处理,实现监控。
<2>、常用的用途
- 统计在线人数,利用HttpSessionListener
- 加载初始化信息,利用那个ServletContextListener
- 统计网站访问量,利用ServletContext
<3>、用途实现
-
ServletContext监控:对应application内置对象的创建和销毁。
当web容器开启的时候,执行contextInitialized方法;
当容器关闭或重启的时候,执行contextDestoryed方法;
实现方式:直接实现ServletContextListener接口
-
HttpSession监控:对应监控session内置对象的创建和销毁
当打开一个新的页面的时候,开启一个session会话,执行sessionCreated方法;
当页面关闭,session过期,或者容器关闭,销毁的时候,执行sessionDestoryed方法;
实现方式:直接实现HttpSessionLinstener接口
-
ServletRequest监控:对应监控request内置对象的创建和销毁
当访问某个页面的时候,发出一个request请求,执行requestInitialized方法;
当页面关闭的时候,执行requestDestoryed方法;
实现方式:直接实现ServletRequestLinstener接口
<4>、如何使用监听
- 创建一个监听器类,实现某种接口(ServletContextListener、HttpSessionLinstener、ServletRequestLinstener)
- 在web.xml文件中配置该监听器
- 在JSP文件中展示访问人数
<5>、案例:实现在线人数统计
-
创建一个类,实现HttpSessionListener接口
package com.tl.servlet; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class LiserentServlet implements HttpSessionListener{ // 定义全局变量,统计网站访问人数 private int count = 0; // 创建会话 @Override public void sessionCreated(HttpSessionEvent event) { HttpSession session = event.getSession(); // 在线一人,count+1 session.setAttribute("userCount", count++); } // 销毁会话 @Override public void sessionDestroyed(HttpSessionEvent event) { HttpSession session = event.getSession(); // 离开一人,count-1 session.setAttribute("userCount", count--); } }
-
在web.xml文件中配置该监听器
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <!-- 项目默认配置 --> <display-name>11_Listeren</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- 监听器配置 --> <listener> <listener-class>com.tl.servlet.LiserentServlet</listener-class> </listener> </web-app>
-
在JSP文件中展示访问人数
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 网站访问人数:<%=session.getAttribute("userCount") %> </body> </html>