09重点复习
09重点复习
1、动态web资源 静态web资源
Servlet/JSP
Servlet web.xml
2、真实路径 虚拟路径
Servlet (Sun)--GenericServlet--HttpServlet doXXX
!!Servlet的生命周期,调用过程图(当浏览器访问一个Servlet对象时,服务器可能创建的对象: ServletConfig、可能(第一次)Servlet、request和response必然),知道javaee常用对象的由谁创建、什么时候创建、什么时候销毁。
ServletContext:服务器启动,web应用加载时创建,当浏览器第一次访问Servlet时,已启动过。
web容器--tomcat (基于Sun标准的Apache)
Servlet容器--tomcat
3、Attribute、parameter、InitParameter的区别,对应的操作方法。
初始化参数:InitParameter 在web.xml中为Servlet或ServletContext配置的初始化时带有的基本参数
请求参数:parameter 浏览器发送过来的请求中的参数信息
以上两种:有get,无set和remove
域属性:Attribute 自己设置 有get、set、remove
4、ServletContext:域、获取web应用的初始参数、读取资源文件(getRealPath、利用类加载器去加载资源)
!!!四大作用域的生命周期、作用范围 、主要用途。Servlet(JSP)
ServletContext(application域)
整个作用域
随着web应用加载而创建,随着web应用销毁而销毁
HttpSession(session域)
整个会话。所谓当前会话,就是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。这个过程可能包含多个请求响应。(session),而放到会话中的变量,
request.getSession()创建session。当session超过30分钟没人用销毁、invalidate方法自杀、服务器非正常关闭session销毁。
request(request域)
整个请求链。所谓请求周期,就是指从http请求发起,到服务器处理结束,返回响应的整个过程。在这个过程中可能使用forward的方式跳转了多个jsp页面。
请求开始时创建request对象代表请求,request产生,请求结束request对象销毁,request域销毁。
pageContext(page域)
当前jsp页面里。
随着JSP页面被访问时创建,访问结束后销毁。从把变量放到pageContext开始,到jsp页面结束。
5、response
响应乱码:
getOutputStream().write("中国".getBytes("utf-8"));------Content-Type
getWriter().write('中国');-------setCharacterEncoding(""utf-8");Content-Type----- setContentType("text/html;charset=UTF-8");
重定向:
response.setHeader("Location", "/Day04/index.jsp");
response.sendRedirect("/Day04/index.jsp");
request
请求乱码:
浏览器发送请求参数时,当初浏览器以什么编码打开的表单页面,就用什么编码发送这个页面提交的数据;而 服务器若不指定就使用ISO8859-1打来,造成乱码。
post: request.setCharacterEncoding(“utf-8”) //放在getParameter前才有效
get: new String(str.getBytes(“ISO-8859-1”),”utf-8”)
设置tomcat Connector URIEncoding=“utf-8”
获取请求参数:
域:
转发 包含
6、Cookie技术:客户端技术
//解决中文乱码
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//返回多个cookie信息
Cookie[] cs = request.getCookies();
Cookie findC = null;
//cs部位空,才可以增强for循环
if (cs != null)
for(Cookie c : cs){
if ("lastTime".equals(c.getName())) {
findC = c;
}
}
if (findC == null) {
response.getWriter().write("这是您第一次访问本网站!");
} else {
Long lastTime = Long.parseLong(findC.getValue());
response.getWriter().write("您上次访问的时间是:" + new Date(lastTime).toLocaleString());
}
//缓存最新时间
Date date = new Date();
Cookie cTime = new Cookie("lastTime", date.getTime()+"");
response.addCookie(cTime);
300个(浏览器容纳) 20个(每个站点) 4KB(最大)
cookie对象常用方法及其作用 setMaxAge(设置与不设置的区别)、SetPath(若不设置浏览器使用默认值)、SetDomain(设置后浏览器的反应)
如何覆盖一个Cookie?
如何删除一个Cookie?
7、Session技术:服务器端技术 内存中 域
Session原理(基于cookie),了解如何是同一台计算机中的浏览器公用session(利用session原理自己创建JSESSIONID cookie,设置MaxAge,覆盖自动生成的)/了解禁用cookie下如何使用session(URL重写)
cookie是客户端技术
优点:数据保存在客户端,这个信息可以保存很长时间。
缺点:数据随时有可能被清空,所以cookie保存的数据是不太靠谱的;
数据被保存在了客户端,随时有可能被人看走,如果将一些敏感信息比如用户名密码等信息存在cookie中,可能有安全问题。
session是服务器端技术
优点:数据保存在服务区端,相对来说比较稳定和安全。
缺点:占用服务器内存,所以一般存活的时间不会太长,超过超时时间就会被销毁。所以 我们要根据服务器的压力和session 的使用情况合理设置session的超时时间,既能保证session的存活时间够用,同时不用的session可以及时销毁减少对服务器内存的占用。
8、JSP
改变了在java中写html的过程变为在HTML中嵌入java代码
JSP本质上是一个Servlet,在第一访问到时有JSP翻译引擎翻译为Servlet
模板元素:---out.write("")
脚本表达式<%= %>----out.print();
脚本片段:<% %>----不变
JSP声明<%! %>----类成员
JSP注释<%-- --%>
JSP指令
page---用来通知JSP翻译引擎如何翻译当前JSP
session----是否有隐式内置对象
errorPage----指定错误提示页面
isErrorPage----设置为true后,翻译页面会出现一个exception对象,可直接使用;友好提示错误页面
pageEncoding----通知翻译引擎以什么编码打开JSP页面 通知服务器以什么编码发送数据
通知浏览器以什么编码打开数据,而在myeclipse环境下这个属性配为了什么myeclipse自动以什么编码打开文件
include---用来进行静态包含
静态包含:源文件级别的合并多个JSP翻译为一个Servlet。 <%include file="URL"%>
动态包含:在输出流级别的合并,对个JSP翻译为各自的Servlet,在输出时进行合并。
taglib---用来导入标签库
9、!!!请求转发和重定向
1.请求重定向的原理:(302 Location)
2.请求转发的原理:(服务器内部资源流转)
3.请求重定向和请求转发的不同应用场景
4.常用的请求重定向和请求转发的实现方法
10、!!!常考点:静态包含、动态包含的原理,常用的请求包含实现方法
11、九大内置对象:
page
config
application
response
request
session
out
exception
pagecontext
作为入口对象获取其他八大内置对象
作为入口操作四大作用域
findAttribute(从小到大搜索域)
域
提供了快捷方法可以用来转发和包含
12、JSP标签:
jsp:forward
jsp:include
jsp:param
EL
1.获取数据
获取的数据放在域中,常用,变量、数组、集合、map、
javabean的属性----${pageContext.request.contextPath}
.[]
2.执行运算
算术运算 比较运算 逻辑运算
三元表达式 ${user!=null?user.name : “”}
empty---null “” list 域
3.获取常用开发对象(11个内置对象)
!pageContext -- 有了它可以很方便的获取jsp页面中的9大隐式对象,对应于JSP页面中的pageContext对象
!pageScope -- page域中属性组成的Map,代表page域中用于保存属性的Map对象
!requestScope -- request域中属性组成的Map
!sessionScope -- session域中属性组成的Map
!applicationScope --application域中属性组成的Map
!param -- 所有请求参数组成的Map<String,String>
paramValues -- 所有请求参数组成的Map<String,String[]>
header -- 所有请求头组成的Map<String,String>
headerValues -- 所有请求头组成的Map<String,String[]>
!cookie -- 所有cookie信息组成的Map<String,Cookie>
initParam -- 所有web应用的初始化参数组成Map
4.调用java方法
会调用jstl提供的fn函数就可以了
13、JSTL
c:out c:set c:remove
c:if c:foreach c:choose
14、自定义标签
15、mysql
16、jdbc
17、web开发模式
==========================================================================================
一、请求转发、请求重定向和请求包含
请求转发和请求重定向区别
请求重定向地址栏会发生变化。 请求转发地址栏不发生变化.
请求重定向两次请求两次响应。 请求转发一次请求一次响应.
如果需要在资源跳转时利用request域传递域属性(一些参数)则必须使用请求转发;
如果希望资源跳转后修改用户的地址栏则使用请求重定向;
如果使用请求转发也可以重定向也可以,则优先使用请求转发,减少浏览器对服务器的访问次数减轻服务器的压力。
转发之前如果已有数据写给浏览器,浏览器转发失败。
转发之前如果已有数据写给response缓冲区中但未发送给浏览器,转发成功;但之前写入的数据清空,清空的只是实体内容,响应头不会清空。
不可以在一个Servlet中转发两次;;
被包含的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略。
一.请求重定向:
1.原始方式
response.setStatus(302);
response.setHeader("Locaton","/xxxxxx");
2.快捷方式
response.sendRedirect("/xxxx");
*3.额外的方式
1. response.setHeader("refresh","0;url=/xxxx");
2. <c:redirect>
二、请求转发
1.ServletContext.getRequestDispatcher().forward();
2.request.getRequestDispatcher().forward();
3.pageContext.forward("");
4.<jsp:forward>
三、请求包含
1.ServletContext.getRequestDispatcher().include()
2.request.getRequestDispatcher().include()
3.<%@ include file=""%>
4.pageContext.include("/index.jsp");
5.<jsp:include/>
6.<c:import/>
getOutputStream和getWriter两个方法互斥。
http协议--规定浏览器和服务器如何通信
html--超文本数据的格式 http规定html 错错错!
servlet规范--sun定义
servlet容器--给规范实现
============================================================================================
二、常用地址的写法:
绝对路径:以/开头的路径就叫做绝对路径,绝对路径在相对于的路径上直接拼接得到最终的路径。
相对路径:不以/开头的路径就叫做相对路径,相对路径基于当前所在的路径计算的到最终的路径。
硬盘路径:以盘符开头的路径就叫做硬盘路径。是哪个路径就是哪个路径。没有相对于谁的问题。
1、虚拟路径: --写虚拟路径时都使用绝对路径
如果路径是给浏览器用的,这个路径相对于虚拟主机,所以需要写上web应用的名称;
如果路径是个服务器用的,这个路径相对于web应用,所以可以省写web应用的名称。
<a href="/Day04/....."> 浏览器
<form action="/Day04/..."> 浏览器
<img src="/Day04/...."> 浏览器
response.setHeader("Location","/Day04/...."); 浏览器 302+Locaction
response.setHeader("refresh","3;url=/Day04/..."); 浏览器
response.sendRedirect("/Day04/..."); 浏览器
request.getRequestDispathce("/index.jsp").forward(); 服务器
request.getRequestDispathce("/index.jsp").include(); 服务器
/Day04/Demo6转发到:
/Day04/index.jsp
若使用绝对路径:
request.getRequestDispathce("/Day04/index.jsp").forward();
若使用相对路径:(分析路径,麻烦,易出错)
request.getRequestDispathce("../index.jsp").forward();
2、 真实路径: --写真实路径时都使用相对路径
根据原理,具体问题具体分析
servletContext.getRealPath("config.properties");//--给一个相对于web应用目录的路径
classLoader.getResource("../../config.properties");//--给一个相对于类加载目录的路径
@WebServlet("/Demo6")
public class Demo6 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/Day04/index.jsp");//绝对路径
String path = Demo6.class.getClassLoader().getResource("config.properties").toString();
System.out.println(path);
- //在src下新建config.properties,与包同路径下
/输出:file:/F:/tomcat8/webapps/Day04/WEB-INF/classes/config.properties
}
File file = new File("config.properties");//--相对于程序的启动目录,web工程下面找
new InputStream("config.properties");//--相对于程序的启动目录