花了两天时间复习了在暑假期间学习的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()只有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<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"); //需要在一开始就声明然后再获取参数一种在服务器内部资源的跳转方式
步骤
**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());一次会话中包含多次请求和响应
一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止在一次会话的范围内的多次请求间,共享数据
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值
尽量不要使用空格等特殊字符服务端会话技术
在一次会话的多次请求将共享数据,将数据保存在服务器端的对象中 HttpSessionSession的实现是依赖于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();ServletContext 也可当做域对象来使用,通过向 ServletContext 中存取数据,可以使得整个应用程序共享某些数 据。当然不建议存放过多数据,因为 ServletContext 中的数据一旦存储进去没有手动移除将会一直保存。
// 获取ServletContext对象 ServletContext servletContext = request.getServletContext(); // 设置域对象 servletContext.setAttribute("name","zhangsan"); // 获取域对象 String name = (String) servletContext.getAttribute("name"); // 移除域对象 servletContext.removeAttribute("name");