javaweb三大核心基础技术
我建了一个公众号,主要是分享java项目,linux知识,日语学习相关的内容,大家喜欢的话可以关注一下,谢谢大家。
Servlet(大重点)
-
@web.xml配值方法
-
概念:运行在服务器端的小程序
- Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。
- 将来我们自定义一个类,实现Servlet接口,复写方法。
-
Servlet的生命周期
-
https://www.runoob.com/servlet/servlet-life-cycle.html 菜鸟教程
- init
- service
- destroy
-
Servlet3.0可以用注解的方式来配置虚拟路径 load-on-startup等信息,可以不用 @web.xml 。web.xml 部署描述符优先于注释
-
load-on-startup大于0的话一启动这个服务器的web项目就执行init方法,小于0时需要访问这个路径才执行init方法
-
-
Servlet体系结构
-
urlpartten:Servlet访问路径
- \1. 一个Servlet可以定义多个访问路径 : @WebServlet({"/d4","/dd4","/ddd4"})
- \2. 路径定义规则:
- \1. /xxx:路径匹配
- \2. /xxx/xxx:多层路径,目录结构
- \3. *.do:扩展名匹配(这个前面不要加/ 会报错的)
-
-
request #request
-
\3. request功能:
-
\1. 获取请求消息数据
- \1. 获取请求行数据
- * GET /day14/demo1?name=zhangsan HTTP/1.1
- * 方法:
- \1. 获取请求方式 :GET
- * String getMethod()
- \2. (*)获取虚拟目录:/day14
- * String getContextPath()
- \3. 获取Servlet路径: /demo1
- * String getServletPath()
- \4. 获取get方式请求参数:name=zhangsan
- * String getQueryString() a=b&c=d&e=f
- \5. (*)获取请求URI:/day14/demo1
- * String getRequestURI(): /day14/demo1
- * StringBuffer getRequestURL() :http://localhost/day14/demo1
- * URL:统一资源定位符 : http://localhost/day14/demo1 中华人民共和国
- * URI:统一资源标识符 : /day14/demo1 共和国
- \6. 获取协议及版本:HTTP/1.1
- * String getProtocol()
- \7. 获取客户机的IP地址:
- * String getRemoteAddr()
- \1. 获取请求方式 :GET
- \2. 获取请求头数据
- * 方法:
- * (*)String getHeader(String name):通过请求头的名称获取请求头的值
- * Enumeration
getHeaderNames():获取所有的请求头名称
- * 方法:
- \3. 获取请求体数据:
- * 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
- * 步骤:
- \1. 获取流对象
- * BufferedReader getReader():获取字符输入流,只能操作字符数据
- * ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
- \2. 再从流对象中拿数据
- \1. 获取流对象
- \1. 获取请求行数据
-
\2. 其他功能:
-
\1. 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
-
\1. String getParameter(String name):根据参数名称获取参数值 username=zs&password=123
-
\2. String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=game
-
\3. Enumeration
getParameterNames():获取所有请求的参数名称 -
\4. Map<String,String[]> getParameterMap():获取所有参数的map集合
-
-
* 中文乱码问题:
- * get方式:tomcat 8 已经将get方式乱码问题解决了
- * post方式:会乱码
- * 解决:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");
-
\2. 请求转发:一种在服务器内部的资源跳转方式
- \1. 步骤:
- \1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
- \2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
- \2. 特点:
- \1. 浏览器地址栏路径不发生变化
- \2. 只能转发到当前服务器内部资源中。
- \3. 转发是一次请求
- #重定向和转发的区别
- \1. 步骤:
-
-
-
BeanUntils
- https://github.com/sogeisetsu/-java-/blob/master/logindemo/src/club/suyuesheng/test/AD.java
- 用途:简化数据封装
- 限制
- 被封装的类必须是标准的简单java类
- 具体标准
- \1. 类必须被public修饰
- \2. 必须提供空参的构造器
- \3. 成员变量必须使用private修饰
- \4. 提供公共setter和getter方法(必须标准,如属性为name,那么setter方法必须是setName())
- 方法
- \1. setProperty()
- \2. getProperty()
- \3. populate(Object obj , Map map):将map集合的键值对信息,封装到对应的JavaBean对象中
- 注释:BeanUtils.populate(user, map); 的map对象的value如果是数组的话就以数组第一个为准
-
-
response
-
\1. HTTP协议:响应消息
-
请求消息
- #request
-
响应消息
-
响应行
- HTTP/1.1 200
- 状态码 :服务器告诉客户端浏览器本次请求和响应的一个状态
- 分类
- 1xx 表示客户端数据已经上传到服务器,但没有上传完,服务器返回1xx
- 2xx 访问成功
- 3xx 访问被重定向302(重定向) 304(访问缓存)
- 4xx客户端请求出错
- 404 客户端访问的路径不存在
- 405 请求方式没有对应的doxxx()方法
- 5xx 服务器内部程序出错
- 分类
-
响应头
-
\1. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
-
\2. Content-disposition:服务器告诉客户端以什么格式打开响应体数据
- * in-line:默认值,在当前页面内打开
- * attachment;filename=xxx:以附件形式打开响应体。文件下载
-
-
响应空行
-
响应体
-
就是数据,像文本图片一类的数据
-
-
-
-
\2. Response对象
- 1.重定向
- 第一种
- resp.setStatus(302); //设置状态码
- resp.setHeader("location","ServletDemo2"); //设置头
- 第二种
- resp.sendRedriect("ServletDemo2");
- #重定向和转发的区别
- * 重定向的特点:redirect
- \1. 地址栏发生变化
- \2. 重定向可以访问其他站点(服务器)的资源
- \3. 重定向是两次请求。不能使用request对象来共享数据
- * 转发的特点:forward
- \1. 转发地址栏路径不变
- \2. 转发只能访问当前服务器下的资源
- \3. 转发是一次请求,可以使用request对象来共享数据
- * 重定向的特点:redirect
- 路径写法:#路径
- 路径分类
- \1. 相对路径:通过相对路径不可以确定唯一资源
- * 如:./index.html
- * 不以/开头,以.开头路径
- 或者省略掉'./' index.html
- * 规则:找到当前资源和目标资源之间的相对位置关系
- * ./:当前目录
- * ../:后退一级目录
- \2. 绝对路径:通过绝对路径可以确定唯一资源
- * 如:http://localhost/day15/responseDemo2 /day15/responseDemo2
- * 以/开头的路径
- * 规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出
- * 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
- * 建议虚拟目录动态获取:request.getContextPath()
- * ,
- * 给服务器使用:不需要加虚拟目录
- * 转发路径
- * 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
- \1. 相对路径:通过相对路径不可以确定唯一资源
- 路径分类
- 第一种
- 2.服务器输出字符数据
- 输出字符数据或者字节数据
- getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一个方法。
- 编码问题
- https://github.com/sogeisetsu/javaweblearn/blob/master/day16/src/cn/suyuesheng/servlet/ServletCookieTest.java
- Tomcat使用IOS 8859-1编码 我们要将他改成utf-8
- https://segmentfault.com/a/1190000013126031
- resp.setContentType("text/html;charset=utf-8"); 将自己的编码和客户端的解码设置成utf-8
- 输出字符数据或者字节数据
- 1.重定向
-
3.ServletContext对象:
-
\1. 概念:代表整个web应用,可以和程序的容器(服务器)来通信
-
\2. 获取:
- \1. 通过request对象获取
- request.getServletContext();
- \2. 通过HttpServlet获取
- this.getServletContext();
- \1. 通过request对象获取
-
\3. 功能:
-
\1. 获取MIME类型:
- * MIME类型:在互联网通信过程中定义的一种文件数据类型
- * 格式: 大类型/小类型 text/html image/jpeg
- * 获取:String getMimeType(String file)
- * MIME类型:在互联网通信过程中定义的一种文件数据类型
-
\2. 域对象:共享数据
- \1. setAttribute(String name,Object value)
- \2. getAttribute(String name)
- \3. removeAttribute(String name)
- * ServletContext对象范围:所有用户所有请求的数据
-
\3. 获取文件的真实(服务器)路径
-
\1. 方法:String getRealPath(String path)
-
String realPath = context.getRealPath(""); 或者 System.out.println(context.getRealPath("/"));
-
都指向 '//D:\day13\out\artifacts\day16_war_exploded'
-
即web目录
-
-
String b = context.getRealPath("/b.txt");//web目录下资源访问
-
System.out.println(b);
-
String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问
-
System.out.println(c);
-
String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问
-
System.out.println(a);
-
-
-
-
-
会话技术
-
\1. 会话:一次会话中包含多次请求和响应。
- 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
-
\2. 功能:在一次会话的范围内的多次请求间,共享数据
-
\3. 方式:
- \1. 客户端会话技术:Cookie
- \2. 服务器端会话技术:Session
-
cookie----客户端会话技术
- 语法
- \1. new Cookie(name,value)
- \2. 向response添加cookie response.addCookie(cookie)
- 3 . 从request获取Cookie request.getCookies 返回cookie数组
- getValue getName
- setValue
- \2. 持久化存储:
- *** setMaxAge(int seconds)**
- \1. 正数:将Cookie数据写到硬盘的文件中。持久化存储。并指定cookie存活时间,时间到后,cookie文件自动失效
- \2. 负数:默认值
- \3. 零:删除cookie信息
- *** setMaxAge(int seconds)**
- *setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录
- * 如果要共享,则可以将path设置为"/"
- 意义
- 在一次会话的范围内的多次请求间,共享数据 数据储存在服务器端
- \5. Cookie的特点和作用
- \1. cookie存储数据在客户端浏览器
- \2. 浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个)
- * 作用:
- 1. cookie一般用于存出少量的不太敏感的数据
- 2. 在不登录的情况下,完成服务器对客户端的身份识别
- 语法
-
session--服务器端会话
- \1. 概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession
- \2. 快速入门:
- \1. 获取HttpSession对象:
- HttpSession session = request.getSession();
- \2. 使用HttpSession对象:
- Object getAttribute(String name)
- void setAttribute(String name, Object value)
- void removeAttribute(String name)
- \1. 获取HttpSession对象:
- \3. 原理
- * Session的实现是依赖于Cookie的。
- 4.细节:
- 1.当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
- 默认情况下。不是。
- 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
- Cookie c = new Cookie("JSESSIONID",session.getId());
- c.setMaxAge(60*60);
- response.addCookie(c);
- 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
- 默认情况下。不是。
- 2. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
- ** 不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作*
- ** session的钝化:*
- ** 在服务器正常关闭之前,将session对象系列化到硬盘上*
- ** session的活化:*
- ** 在服务器启动后,将session文件转化为内存中的session对象即可。*
- ** session的钝化:*
- ** 不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作*
- \3. session什么时候被销毁?
- \1. 服务器关闭
- \2. session对象调用invalidate() 。
- \3. session默认失效时间 30分钟
- 选择性配置修改
-
30
-
- 1.当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
- \5. session的特点
- \1. session用于存储一次会话的多次请求的数据,存在服务器端
- \2. session可以存储任意类型,任意大小的数据
-
session与Cookie的区别:
-
\1. session存储数据在服务器端,Cookie在客户端
-
\2. session没有数据大小限制,Cookie有
-
\3. session数据安全,Cookie相对于不安全
-
-
cookie session 转发 ServletContext 的区别
- https://zhuanlan.zhihu.com/p/73052614
- cookie session都是默认一次对话,ServletContext的作用域是所有Servlet都作用
-
-
jsp(语法不重要,重要的是思想)
-
基础语法
-
<%java代码%>
-
内置对象不需要创建,直接使用的对象
在jsp页面中不需要创建,直接使用的对象
-
九个内置对象
-
-
-
<%= 直接在页面输出%>
-
<%!定义类%>
-
-
指令
-
* 作用:用于配置JSP页面,导入资源文件
-
* 格式:
- <%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %>
-
* 分类:
-
\1. page : 配置JSP页面的
-
* contentType:等同于response.setContentType()
- \1. 设置响应体的mime类型以及字符集
- \2. 设置当前jsp页面的编码(只能是高级的IDE才能生效,如果使用低级工具,则需要设置pageEncoding属性设置当前页面的字符集)
-
* import:导包
-
* errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
-
* isErrorPage:标识当前也是是否是错误页面。
- * true:是,可以使用内置对象exception
- * false:否。默认值。不可以使用内置对象exception
-
-
\2. include : 页面包含的。导入页面的资源文件
- * <%@include file="top.jsp"%>
-
\3. taglib : 导入资源 需要先引入jstl jar包
jstl 的jar包引入方法较为复杂
- * <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- * prefix:前缀,自定义的
- * <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-
-
-
ELhttps://sogeisetsu.github.io/javaweblearn/day17/src/cn/suyuesheng/day17/rr
-
\1. 概念:Expression Language 表达式语言
-
\2. 作用:替换和简化jsp页面中java代码的编写
-
\3. 语法:$
-
\4. 注意:
- * jsp默认支持el表达式的。如果要忽略el表达式
- \1. 设置jsp中page指令中:isELIgnored="true" 忽略当前jsp页面中所有的el表达式
- \2. ${表达式} :忽略当前这个el表达式
- * jsp默认支持el表达式的。如果要忽略el表达式
-
代码参考
-
获取值
-
-
jstl
-
使用方法
-
1.导入jar包
-
引入标签库
-
-
https://sogeisetsu.github.io/javaweblearn/day17/src/cn/suyuesheng/day17/rr从这个链接学习
-
掌握少数几个标签即可
-
-
-
三层架构:软件设计架构
-
\1. 界面层(表示层):用户看的得界面。用户可以通过界面上的组件和服务器进行交互
-
\2. 业务逻辑层:处理业务逻辑的。
-
\3. 数据访问层:操作数据存储文件。
-