JavaWeb——Servlet学习笔记

tech2026-03-17  2

花了两天时间复习了在暑假期间学习的javaweb基础,整理了一份Servlet的笔记 还算比较详细

Servlet部分

1、创建web项目

创建web项目在src目录下新建包(com.xx.dj)在包下新建类,并继pHttpServlet类(实现 Servlet规范,即继承HttpServlet 类,并到如响应的包,该类中已经完成了通信的规则,我们只需要进行业务的实现即可)重写 service 方法 满足 Servlet(规范只是让我们的类能够满足接收请求的要求,接收到请求后需要对请求进行分析,以及进行业务逻辑处理,计算出结果,则需要添加代码,在规范中有一个叫做service的方法,专门用来做请求处理的操作,业务代码则可以写在该方法中)在类前设置注解(@WebServlet("/ser01"))

第四步 也可重写do get 或者do post方法

第五步的注解设置

可以加name也可不加 例如: @WebServlet(name=“Servlet01”,value="/ser01")

可以设置多个访问路径 例如: @WebServlet(name=“Servlet01”,value={"/ser01",’/ser001’})

2、servlet工作流程

1.当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的servlet的资源路径

2.查找web.xml文件,是否有对应的标签内容

3.如果有,则找到对应的 全类名

4,tomcat会将字节码文件加载进内存,并且创建其对象

5.调用其方法

3、serblet生命周期

被创建: init方法被执行一次

提供服务: service方法可执行多次

被销毁:执行destory方法只会执行一次

4、资源路径的设置方式 1.@WebServlet("/xxx")

2.@WebServlet("/xxx/xxx")

3.@WebServlet("*.do")

4、请求数据格式

1.请求行

请求方式 请求url 请求协议/版本

POST /Java_servlet03/demo2 HTTP/1.1

请求方式有7种常用2种

​ get:

​ 1请求参数在url中

​ 2.请求长度长度有限

​ 3,不太安全

​ post:

​ 1.请求参数在请求体中

​ 2.请求长度没有限制

​ 3.相对安全

2.请求头

Host: localhost:8080 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 Edg/84.0.522.44 Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signedexchange;v=b3;q=0.9 Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6 Accept-Encoding: gzip, deflate, br Connection: keep-alive Referer: http://localhost:8080/Java_servlet03/a.html Upgrade-Insecure-Requests: 1 Host:请求的主机 User-Agent:浏览器告诉服务器的浏览版本信息 可以在服务器段获取该头的信息,解决浏览器兼容性问题 Accept:可以解析的格式 Accept-Language:可以支持的语言 Accept-Encoding:支持的压缩格式 Connection:连接状态 Referer:告诉服务器,请求来自哪里 1:可以防止盗链 2:可以进行统计 Upgrade-Insecure-Requests:升级信息

3.请求空行

就是一个空行

4,请求体

你要发送的请求,比如表单,发送文本框的内容则 文本框名称=发送内容

5、request(请求)

当调用servlet启动时,tomcat会创建2个对象,ServletRequest,和 ServletResponse,

1.获取请求行数据

​ 方法:

​ 获取请求方式: GET

String getMethod()

​ **(重点)**获取虚拟目录: /Java_servlet03

String getContextPath()

​ 获取Servlet路径:/demo2

String getServletPath()

​ 获取get方式请求参数:username=aaaa

String getQueryString()

​ (重点)获取请求URI:/Java_servlet03/demo2

String getRequestURI() //Java_servlet03/demo2 //URI:统一资源定位符 StringBuffer getRequestURL() //http://localhost:8080/Java_servlet03/demo2 //URL:统一资源标识符

​ 获取协议及版本:HTTP/1.1

String getProtocol()

​ 获取客户机的IP地址

String getRemoteAddr()
2.获取请求头数据
//(重点,常用) String getHeader(String name) Enumeration<String> getHeaderNames()//类似迭代器 String getHeader(String name) //参数是请求头名称 ,返回请求值数据 Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()){ String nextElement = headerNames.nextElement(); //请求头名称 String value = request.getHeader(nextElement); //根据请求头返回请求值 System.out.println(nextElement+"-"+value); }
3.获取请求体

只有POST 请求才有请求体

需要开启一个输入流才能读取到内容 BufferedReader reader = request.getReader(); String line = null; while ((line=reader.readLine())!=null){ System.out.println(line); }
4、获取请求参数

请求参数与值:username=aaaa

无论是get还是post都可以使用以下方法获取参数值

//根据参数名称获取参数值 String getParameter(String name) //根据参数名称获取参数值的数组 适用于多个参数值,复选框等 String[] getParameterValues(String name) // 获取所有请求的参数名称 Enumeration<String> getParameterNames() //获取所有参数的map集合 Map<String,String[]> getParameterMap() BeanUtils 可以帮助获取参数并封装成JavaBean对象,可以简化setter过程 BeanUtils.populate(Object obj,Map map) map就是使用的通用方法里的 getParameterMap()所有的参数名称与值,键是参数名称,值是属性,obj就是你要封装的JavaBean对象

#参数中文乱码问题,get方式,tomcat解决了,post方式需要自己解决

request.setCharacterEncoding("utf-8"); //需要在一开始就声明然后再获取参数
5、请求转发

一种在服务器内部资源的跳转方式

步骤

**1.通过request对象获取请求转发器:

RequestDispatcher request.getRequestDispatcher(“资源访问路径”)

2.使用RequestDispatcher对象的forward方法来进行转发 void forward(ServletRequest var1,ServletResponse var2) **

特点

​ 1.浏览器地址栏路径不发生变化

​ 2.只能转发到当前服务器内部资源中

​ 3.转发是一次请求

6、共享数据

域对象:一个有作用范围的对象,可以在范围内共享数据

request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据

#方法

void setAttribute(String name, Object obj) //存储数据 name:存储数据的名字 obj:存储对象 Object getAttribute(String name) //根据存储数据的名字来获取存储数据 void removeAttribute(String name) //通过名字来移除存储数据

6、Response(响应)

#####1、重定向

实现资源跳转方式

//1.设置状态码302 response.setStatus(302); //设置响应头location response.setHeader("location",资源的绝对路径); 本机可以省略http只需要 虚拟目录+资源路径 简写方式 response.sendRedirect(资源的绝对路径);

服务器输出字符数据

1.获取字符输出流 PrintWriter writer = response.getWriter(); 2.输出数据 writer.write("你好 response"); 注意乱码问题 response.getWriter() 获取到的流是iso-8856-1 需要统一设置浏览器的解码方式 response.setContentType("text/html;charset=utf-8"); //设置服务端的编码格式 response.setCharacterEncoding("utf-8"); // 当然光设置服务端还不够,还要设置客户端编码 //设置客户端编码格式 response.setHeader("content-type","text/html;charset=UTF-8"); //获取到字符输出流 //PrintWriter writer=response.getWriter(); //writer.write("Hello"); // 获取字节输出流 注:字符输出流与字节输出流只能存在一个 ServletOutputStream out=response.getOutputStream(); out.write("dj".getBytes());

三、会话技术

Cookie会话技术

一次会话中包含多次请求和响应

一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止

功能

在一次会话的范围内的多次请求间,共享数据

方式

Cookie

客户端会话技术

1.创建Cookie对象,绑定数据 new Cookie(String name,String value) 2.发送Cookie对象 response.addCookie(Cookie cookie) 3.获取Cookie,拿到数据 Cookie[] request.getCookie()

实现原理

基于set_cookie和请求头cookie实现

细节

注0.可以一次发送多个cookie注1:不能获取指定的某一个cookie的值,他返回的是一个cookie数组注2:cookie中不能出现中文,不建议存中文,如果出现了中文,则需要级进行特殊的编码和解码注3: 同名问题,cookie中不能出现同名,如果出现,前一个cookie的值会被后一个值给替换注4:cookie的值的个数不是无限的,每个浏览器都会有上限存在, 创建多个Cookie对象,使用response调用调用多次addCookie方法

2.设置保存时间

默认值:当浏览器关闭后,Cookie数据被销毁 持久化: setMaxAge(int seconds) 1.正数:将Cookie数据写到硬盘的文件中,持久化存储,cookie存活时间 单位秒 2.负数:默认值 3.零:删除cookie信息

3.存储中文

在tomcat8 之前cookie不支持中文存储 需要使用URL编码 URLEncoder.encode(转码字符串,"utf-8") 获取值,同样需要解码 URLDecoder.decode("解码字符串","utf-8") //注意:特殊字符最好使用URL编码 tomcat8 之后支持中文存储

4.获取范围

默认情况是只能共享在同一个项目下的cookie 可以设置范围来进行不同项目下的共享 setPath(String path) 设置为"/" /*当前服务器下的任意资源都可以获取cookie对象*/ Cookie cookie01=new Cookie("name1","1"); //设置路径为/ 表示当前服务器下的任意资源都可访问 cookie01.setPath("/"); /*设置当前项目下的资源可访问 假设当前项目站点为jd1 */ Cookie cookie02=new Cookie("name2","2"); // 默认不设置 或者设置为当前站点名 cookie02.setPath("/jd1"); /*设置指定项目下可以访问 假设当前项目站点为dj1 ,允许访问的项目站点为dj2*/ Cookie cookie03=new Cookie("name3","3"); cookie03.setPath("/jd2"); /*设置指定目录可以访问 假设当前项目站点为dj1 ,允许访问的项目站点为dj2下的sk目录*/ Cookie cookie04=new Cookie("name4","4"); cookie03.setPath("/jd2/sk");

5.cookie值

尽量不要使用空格等特殊字符

Session

服务端会话技术

在一次会话的多次请求将共享数据,将数据保存在服务器端的对象中 HttpSession

使用

//获取session对象 HttpSession session=request.getSession(); //设置session域对象 session.setAttribute("name","摘星"); //获取指定名称的session域对象 String name=(String) session.getAttribute("name"); //因为返回的是object类型的,所以需要强制转型 //移除指定名称的session session.removeAttribute("name");

原理

Session的实现是依赖于Cookie的

其他

1.当客户端关闭后,服务器不关闭,2次获取session是否是同一个

默认情况下: 不是 如果需要,则可以创建一个Cookie 键为JSESSIONID 值就是之前的值,调用get方法,获取值,设置存活时间 Cookie c = new Cookie("JSESSIONID",session.getId())

2.客户端不关闭,服务器关闭后,2此获取的session是同一个吗?

不是同一个对象,但是为了确保数据不丢失,tomcat自动设置 1.session钝化 在服务器正常关闭之前,将session对象系列化到硬盘上 (类似序列化) 2.session活化 在服务器启动后,将session文件转化成内存中的session对象 (类似反序列化) //注 idea 无法实现活化功能,因为idea会在项目部署的时候,替换掉原来的文件,因此session文件被删除了

3.session销毁时间

1.服务器关闭 2.session对象调用invalidate()方法时 3.session默认失效时间30分钟(可以去配置文件里修改) session域对象默认到期时间 * 1、tomcat 默认是30分钟 ,可以在tomcat的配置文件中修改,不过较为不方便,不推荐 * 2、可以通过 session.setMaxInactiveInterval(); 设置到期时间,单位秒 * 可以通过 session.getMaxInactiveInterval(); 获得到期时间,单位秒 * 可以通过 session.invalidate(); 立即销毁

4.session的特点

1.session用于存储一次会话的多次请求的数据,存在服务器端 2.session可以存储任意类型,任意大小的数据

区别

1.session存储数据在服务器端,cookie在客户端

2.session没有数据大小的限制,cookie有

3.session数据安全,cookie相对不安全

ServletContext对象

每一个 web 应用都有且仅有一个ServletContext 对象,又称 Application 对象,从名称中可知,该对象是与应用程 序相关的。在 WEB 容器启动的时候,会为每一个 WEB 应用程序创建一个对应的 ServletContext 对象。 该对象有两大作用,第一、作为域对象用来共享数据,此时数据在整个应用程序中共享; 第二、该对象中保存了当 前应用程序相关信息。例如可以通过 getServerInfo() 方法获取当前服务器信息 ,getRealPath(String path) 获取资 源的真实路径等。

ServletContext对象的获取

1、通过request对象获取

ServletContext servletContext = request.getServletContext();

2、通过session对象获取

ServletContext servletContext = request.getSession().getServletContext();

3、通过 servletConfig 对象获取,在 Servlet 标准中提供了 ServletConfig 方法

ServletConfig servletConfig = getServletConfig(); ServletContext servletContext = servletConfig.getServletContext();

4、直接获取 Servlet 类中提供了直接获取 ServletContext 对象的方法

ServletContext servletContext = getServletContext();

ServletContet 对象的常用方法

// 获取项目存放的真实路径 String realPath = request.getServletContext().getRealPath("/"); // 获取当前服务器的版本信息 String serverInfo = request.getServletContext().getServerInfo();

ServletConte域对象

ServletContext 也可当做域对象来使用,通过向 ServletContext 中存取数据,可以使得整个应用程序共享某些数 据。当然不建议存放过多数据,因为 ServletContext 中的数据一旦存储进去没有手动移除将会一直保存。

// 获取ServletContext对象 ServletContext servletContext = request.getServletContext(); // 设置域对象 servletContext.setAttribute("name","zhangsan"); // 获取域对象 String name = (String) servletContext.getAttribute("name"); // 移除域对象 servletContext.removeAttribute("name");

Servlet的三大域对象

request域对象 在一次请求中有效。请求转发有效,重定向失效。session域对象 在一次会话中有效。请求转发和重定向都有效,session销毁后失效。servletContext域对象 在整个应用程序中有效。服务器关闭后失效。
最新回复(0)