JavaWeb——Servlet学习笔记

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

Servlet部分

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

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

第五步的注解设置

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

  2. 可以设置多个访问路径 例如:
    @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 getHeaderNames()//类似迭代器
String getHeader(String name)
//参数是请求头名称 ,返回请求值数据
Enumeration 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 getParameterNames()

//获取所有参数的map集合
Map 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的三大域对象

  1. request域对象
    在一次请求中有效。请求转发有效,重定向失效。
  2. session域对象
    在一次会话中有效。请求转发和重定向都有效,session销毁后失效。
  3. servletContext域对象
    在整个应用程序中有效。服务器关闭后失效。

你可能感兴趣的:(javaweb学习笔记,servlet,java,session,Javaweb,cookie)