花了两天时间复习了在暑假期间学习的javaweb基础,整理了一份Servlet的笔记
还算比较详细
第四步 也可重写do get 或者do post方法
第五步的注解设置
可以加name也可不加 例如:
@WebServlet(name=“Servlet01”,value="/ser01")
可以设置多个访问路径 例如:
@WebServlet(name=“Servlet01”,value={"/ser01",’/ser001’})
1.当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的servlet的资源路径
2.查找web.xml文件,是否有对应的标签内容
3.如果有,则找到对应的 全类名
4,tomcat会将字节码文件加载进内存,并且创建其对象
5.调用其方法
被创建: init方法被执行一次
提供服务: service方法可执行多次
被销毁:执行destory方法只会执行一次
4、资源路径的设置方式
1.@WebServlet("/xxx")
2.@WebServlet("/xxx/xxx")
3.@WebServlet("*.do")
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,请求体
你要发送的请求,比如表单,发送文本框的内容则
文本框名称=发送内容
当调用servlet启动时,tomcat会创建2个对象,ServletRequest,和 ServletResponse,
方法:
获取请求方式: 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()
//(重点,常用)
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);
}
只有POST 请求才有请求体
需要开启一个输入流才能读取到内容
BufferedReader reader = request.getReader();
String line = null;
while ((line=reader.readLine())!=null){
System.out.println(line);
}
请求参数与值: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"); //需要在一开始就声明然后再获取参数
一种在服务器内部资源的跳转方式
步骤
**1.通过request对象获取请求转发器:
RequestDispatcher request.getRequestDispatcher(“资源访问路径”)
2.使用RequestDispatcher对象的forward方法来进行转发
void forward(ServletRequest var1,ServletResponse var2) **
特点
1.浏览器地址栏路径不发生变化
2.只能转发到当前服务器内部资源中
3.转发是一次请求
域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
#方法
void setAttribute(String name, Object obj) //存储数据 name:存储数据的名字 obj:存储对象
Object getAttribute(String name) //根据存储数据的名字来获取存储数据
void removeAttribute(String name) //通过名字来移除存储数据
#####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());
一次会话中包含多次请求和响应
一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
在一次会话的范围内的多次请求间,共享数据
1.创建Cookie对象,绑定数据
new Cookie(String name,String value)
2.发送Cookie对象
response.addCookie(Cookie cookie)
3.获取Cookie,拿到数据
Cookie[] request.getCookie()
基于set_cookie和请求头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值
尽量不要使用空格等特殊字符
服务端会话技术
在一次会话的多次请求将共享数据,将数据保存在服务器端的对象中 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相对不安全
每一个 web 应用都有且仅有一个ServletContext 对象,又称 Application 对象,从名称中可知,该对象是与应用程
序相关的。在 WEB 容器启动的时候,会为每一个 WEB 应用程序创建一个对应的 ServletContext 对象。
该对象有两大作用,第一、作为域对象用来共享数据,此时数据在整个应用程序中共享; 第二、该对象中保存了当
前应用程序相关信息。例如可以通过 getServerInfo() 方法获取当前服务器信息 ,getRealPath(String path) 获取资
源的真实路径等。
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();
// 获取项目存放的真实路径
String realPath = request.getServletContext().getRealPath("/");
// 获取当前服务器的版本信息
String serverInfo = request.getServletContext().getServerInfo();
ServletContext 也可当做域对象来使用,通过向 ServletContext 中存取数据,可以使得整个应用程序共享某些数
据。当然不建议存放过多数据,因为 ServletContext 中的数据一旦存储进去没有手动移除将会一直保存。
// 获取ServletContext对象
ServletContext servletContext = request.getServletContext();
// 设置域对象
servletContext.setAttribute("name","zhangsan");
// 获取域对象
String name = (String) servletContext.getAttribute("name");
// 移除域对象
servletContext.removeAttribute("name");