黑马程序员技术交流社区
标题:
【成都校区】jsp/MVC/EL/JSTL/Cookie/Session/response/request/servletContext
[打印本页]
作者:
zeroHe
时间:
2018-12-27 08:52
标题:
【成都校区】jsp/MVC/EL/JSTL/Cookie/Session/response/request/servletContext
【jsp】
01 jsp 指令
格式:<%@ 指令 属性1=属性值1;属性2=属性值2 %>
01 page 指令
01 contentType,指定页面编码
低级的编辑工具还需要指定pageEncoding
language,默认且只支持java
buffer,缓冲区大小
<%@ page contentType="text/html;charset=UTF-8"
language="java"
pageEncoding="utf-8"
buffer="16kb"
%>
02 inport 导包
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
03 isErrorPage="false"(默认为false) errorPage="500.jsp"
当isErrorPage为true,可以使用exception内置对象
全局页面错误的配置 web.xml
<error-page>
<error-code>500</error-code>
<location>/jsp/500.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/jsp/exception.jsp</location>
</error-page>
02 include 指令 包含资源文件
<%@ include file="jsp/top.jsp"%>
03 taglib 指令 倒入资源
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
02 jsp 注释
01 <!-- --> html注释
02 <%-- --%> jsp注释
03 jsp内置对象 9
pageContext PageContext 当前页面
request HttpServletResquest 一次请求访问的多个资源(转发)
session HttpSession 一次会话的多次请求之间
application ServletContext 当前web应用
response HttpServletResponse 响应对象
page Object 当前页面(servlet)的对象,this
out JspWriter
config ServletConfig 配置对象
exception Throwable 异常对象
【MVC】
01 M model 模型 完成具体的业务操作
02 V view 视图 展示数据
03 C controller 控制器 获取客户端的输入,调用模型,将数据交给视图展示
【EL】 表达式语言,替换和简化jsp页面中java代码的编写
01 语法 ${表达式}
jsp默认支持El,可以使用 isELIgnored="true" 忽略 EL 表达式 或者
\${表达式}
02 运算
01 算术运算符 + - * /(div) %(mod)
02 比较运算符 > < >= <= == !=
03 逻辑运算符 &&(and) ||(or) !(not)
04 空运算符 empty 【】
${empty list}
判断字符串、集合、数组对象是否为null或者长度为0
${not empty list}
判断字符串、集合、数组对象是否为null并且长度为0
03 获取域的数据
01 ${域名.属性名}
${pageScope.page}
${requestScope.attr}
${sessionScope.attr}
${applicationScope.attr}
${属性名} 从小的区域查找,如果找不到到大的区域查找,如果实在找不到,则为
内容为空的字符串
02 对象属性的值
${user.id}
03 list ${list[索引值].属性值}
04 map ${map.key} / ${map["key"]}
04 隐式对象 EL表达式中有11个隐式对象
01 pageContext 可以获取jsp其他八个内置对象
${pageContext.request.contextPath} :动态获取虚拟目录
【jstl】jsp标准标签库,替换和简化jsp页面中java代码的编写
apache组织提供的开源的jsp标签
01 使用步骤
01 导入 jstl 相关的jar包
02 使用 taglib 引入标签库
02 常用的标签
01 if <c:if test="true">我是真的</c:if> test属性值为真,标签体内容被显示
02 choose
<c:choose>
<c:when test="${week == 1}">
周一见
</c:when>
<c:otherwise>
今天不是周一
</c:otherwise>
</c:choose>
03 foreach
01 begin
02 end
03 var 【】
04 step 步长
05 varStatus (index 从0开始,count从1开始)【】
06 items
常见的例子:
01
<c:forEach begin="1" end="10" var="i" step="1" varStatus="st">
${i} ${st.index} ${st.count} <br>
</c:forEach>
02 list
<c:forEach items="${requestScope.userList}" var="user" varStatus="st">
${st.index} ${st.count} ${user.id} ${user.username} ${user.password}<br>
</c:forEach>
03 map
<c:forEach items="${requestScope.map}" var="entry" varStatus="st">
${st.count} ${entry.key} ${entry.value}<br>
</c:forEach>
【MVC】
【三层架构】
01 界面层 用户看到的组件,用户可以通过组建跟服务器进行交互
02 业务逻辑层 处理业务逻辑
03 数据访问层 操作数据存储文件
【用户信息的增删改查操作】
servlet + jsp + mysql + jdbctemplete + druid + beanutils + tomcat
【Cookie】客户端会话技术
一次会话包含多次请求和响应
Cookie tmp = new Cookie("name","value");
resp.addCookie(tmp);
Cookie[] cookies = req.getCookies();
cookie.getName()/cookie.getValue()
生命周期:
01 默认情况下,当浏览器关闭后,cookie数据被销毁
02 设置 cookie 的生命周期 cookie.setMaxAge(int seconds);
正数,将cookie数据写到硬盘的文件中,持久化存储
负数,默认值
0,删除 cookie 信息
存储中文:
01 tomcat8之前,tomcat不能直接存储中文数据
需要将中文数据转码,一般采用URL编码
02 tomcat8之后,tomcat能直接存储中文数据
共享范围:
如果服务器有多个web项目,那么在这些web项目中cookie是否能共享
01 默认情况下,不能共享
02 cookie.setPath(String path)【默认情况下,path为当前项目的虚拟目录】
如果想共享cookie,可将 path 设置为 "/"
不同 tomcat 服务器之间的 cookie 共享问题
setDomain(String path)
【如果设置的一级域名相同,那么多个服务器之间cookie共享】
".baidu.com"
特点:
01 存储在客户端,不大安全
02 浏览器对单个cookie的大小有限制(4kb)以及同一域名的cookie的数量也有数
量(20个)
作用:
01 一般用于存储少量的不太敏感的数据
02 在不登陆的情况下,完成服务器对客户端的身份识别
【cookie : 记住上一次访问时间】
【jsp java server page】java 服务端 页面
01 既可以写html代码,也可以写java代码
02 本质上是servlet
jsp脚本 jsp定义java代码的方式
01 <% %>
02 <%= %>
03 <%! %>
jsp 内置对象(共九个)
01 request
02 response
03 out vs response.getWriter():
tomcat先清空response.getWriter()的缓冲区,在清空out的缓冲区
【Session】服务端会话技术,在一次回话的多次请求响应之间共享数据,存储在服务器。
01 获取
HttpSession session = request.getSession();
02 作为域对象
session.setAttribute("USER",new Object());
Object obj = session.getAttribute("USER");
session.removeAttribute("USER");
03 创建,第一次调用 request.getSession() 时创建
04 Session的实现依赖于Cookie JSESSIONID
05 当客户端关闭后,服务端不关闭,两次获取的session是否相同
01 默认情况下,不同
02 如果想设置相同 创建Cookie,其中name设置为JSESSIONID,value设置为
session.getID()
客户端关闭,服务器关闭后,两次获取的session是否相同
01 不是同一个,但是要保证数据不丢失
01 session的钝化:服务器正常关闭时,将session序列化到硬盘中
02 session的活化:服务器启动时,将session从硬盘中反序列化
【】01 tomcat会自动钝化与活化;02 idea会钝化,但在启动的时候会删
除work目录
06 session什么时候销毁
01 服务器非正常关闭(正常关闭,会进行session的钝化)
02 调用 session.invalidate()
03 session默认失效时间:30分钟
07 配置项目的session实现时间,单位:分钟
<session-config>
<session-timeout>30</session-timeout>
</session-config>
【Session 验证码】
【response】
javaBean 封装数据
01 类,public
02 成员变量,private
03 无参数构造函数
04 提供公共的getter/setter方法
字段
属性
【http 响应消息】
响应行
HTTP/1.1 200 OK
协议/版本 响应状态码 状态码描述
响应状态码:服务器告诉客户端浏览器本次请求和相应的一个状态
1XX:服务器接收客户端的数据,但没有接收完成。等待一段时间后,发送1XX状态
码。
2XX:成功。代表:200
3XX:重定向。代表:302,重定向;304,访问本地缓存。
4XX:客户端错误。代表:404,请求路径没有响应的资源;405,请求方式错误。
5XX:服务端错误。代表:500。
响应头
Content-Type:text/html;charset=UTF-8
服务器 告知 客户端 本次响应体【数据格式】以及【编码方式】
Content-disposition:
服务器 告知 客户端,以什么格式打开响应体的数据
01 默认为 in-line,在当前页面内打开
02 attachment;filename=xxx,以附件的格式打开
Location:结合302状态码做重定向使用
响应空行
响应体:传输的数据
【response】
01 setStatus(int state)
02 setHeader(String header,Stirng value)
03 getOutputStream()/getWriter()
【重定向】
01 状态码,302
02 location,新资源的请求路径
response.setStatus(302);
response.setHeader("location","/servlet/response02");
response.sendRedirect("/servlet/response02");
response.sendRedirect("http://www.baidu.com");
重定向特点:
01 浏览器地址栏发生变化
02 可以访问其他站点的资源
03 两次请求【不能使用request对象来共享数据】(可以通过url传递参数)
【路径】
相对路径 绝对路径
虚拟目录的动态获取:String contextPath = request.getContextPath();
【输出字符数据】
01 获取流之前,设置流的编码方式(默认为 ISO-8859-1)为utf-8
request.setCharacterEncoding("utf-8");
02 告知浏览器,响应体数据的编码方式
response.setHeader("Content-Type","text/html;charset=UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();【默认为 ISO-8859-1】
writer.write("世界你好");
writer.flush();
writer.close();
【输出字节数据】
response.setHeader("Content-Type","text/html;charset=UTF-8");
OutputStream os = response.getOutputStream();
os.write("世界你好".getBytes("utf-8"));
【验证码】
【ServletContext】
代表整个web应用,可以 和程序的容器(服务器)进行通信
request.getServletContext();
this.getServletContext();
01 获取文件的MIME类型
String mime = servletContext.getMimeType("1.txt");//text/plain
MIME
多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类
型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一
些客户端自定义的文件名,以及一些媒体文件打开方式。
02 作为域对象
void setAttribute(String name,Object value)
Object getAttribute(String name)
void removeAttribute(String name)
整个web应用范围
服务器启动的时候,会为每个web项目创建独立的servletContext对象
服务器关闭/项目被移除的时候销毁
03 获取路径
String realPath = servletContext.getRealPath(String path);
InputStream is = servletContext.getResourceAsStream(String path);
【文件下载】
一次会话:浏览器第一次请求服务端资源,会话建立,直到其中一方断开为止
功能:在一次会话的多次请求间,共享数据
【servlet && http && request】
Servlet 接口
GenericServlet 抽象类
将servlet接口其他方法进行了空实现
只保留service抽象方法
String method = req.getMethod();
if("GET".equals(method)){
//get方式获取数据
doGet();
}else if("POST".equals(method)){
//post方式获取数据
doPost();
}
HttpServlet 抽象类
http请求方式,7种
对http协议的一种封装,简化操作
定义类继承 HttpServlet
复写 doGet\doPost 方法
url 直接访问,get方法
form method="post" post方式
servlet 相关配置
一个servlet可以定义多个访问路径
路径定义规则:
/xxx
/xxx/xxx /xxx/* /*
*.do
http 超文本传输协议
定义了客户端和服务器端通信时,发送数据的格式
基于 TCP/IP 的高级协议
默认端口:80
基于请求/响应模型的:一次请求一次响应
无状态的:每次请求之间互相独立,不能交互数据
历史版本:1.0 1.1
【http 1.0 VS http 1.1】
http 1.0:每一次请求都会建立一个新的连接
http 1.1:复用连接
请求消息数据格式
请求行
请求方式 请求url 请求协议/版本
GET /login.html HTTP/1.1
请求头
请求头名称: 请求头值(如果有多个,使用分号分隔)
User-Agent: 浏览器告诉服务器,我访问你使用的浏览器版本信息
可以在服务器获取该信息,解决浏览器的兼容问题
Referer: 告诉服务器,当前请求从哪里来
防止盗链、统计工作
请求空行
空行
请求体
useranme=zhangsan
get
请求参数在请求行中
请求的url长度有限制
不太安全
post
请求参数在请求体中
请求的url长度没有限制
比较安全
【Request】
封装请求信息,request对象有服务器创建
ServletRequest(接口)
HttpServletRequest(接口)
org.apache.catalina.connector.RequestFacade(实现)
【request方法】
方法:
01 getMethod() 请求方式
02 getContextPath() 虚拟路径
03 getServletPath() servlet路径
04 getRequestURI() 较短 getRequestURL() 较长
URI:统一资源标识符 /request01 【共和国】
URL:统一资源定位符 http://localhost:8080/request01 【中华人民共和国】
05 getRemoteAddr() 获取客户端ip
参数相关:
01 String getParameter("name")
02 String[] getParameterValues("hobby")
03 Map<String, String[]> getParameterMap()
04 Enumeration<String> getParameterNames()
请求头相关:
01 String getHeader(String header)
02 Enumeration<String> getHeaderNames()
请求体相关:
01 BufferedReader getReader()
02 ServletInputStream getInputStream()
注意:由于get请求方式,请求体为空;所以需要使用post请求方式
而,当前我们的知识需要使用 html-form
getReader() 与 getInputStream() 不能同时使用【】
乱码问题:
get方式 : tomcat 8已经将get方式乱码问题解决了
post方式 :request.setCharacterEncoding("utf-8");
【请求转发】
浏览器地址栏不发生变化
只能转发到当前服务器内部资源
客户端是一次请求
当前请求路径:http://localhost:8080/servlet/request02
目标请求路径:http://localhost:8080/servlet/request03
RequestDispatcher requestDispatcher =
request.getRequestDispatcher(path);
requestDispatcher.forward(request,response);
【如何确定path】path为相对路径
当前请求路径:http://localhost:8080/servlet/request02
目标请求路径:http://localhost:8080/servlet/request03
01 相同访问路径下
./request03 a
request03 b
/request03 c
a 和 b等价,c的访问路径为servletPath
当前请求路径:http://localhost:8080/servlet/c/request02
目标请求路径:http://localhost:8080/servlet/a/b/request03
01 不同访问路径下
../a/b/request03
/a/b/request03
其中,get/post请求方式,将调用相对应servlet路径的get/post请求方式
【共享数据】
域对象:一个有作用范围的对象,可以在范围内共享数据
request区域:代表一次请求的范围,一般用于【请求转发】的多个资源中共享数据
方法:
request.setAttribute("MSG","attr");
String msg = (String) request.getAttribute("MSG");
request.removeAttribute("MSG");
Enumeration<String> attributeNames = request.getAttributeNames();
【获取ServletContext】
ServletContext servletContext = request.getServletContext();
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2