JavaEE概述总结:Servlet生命周期+JSP内置对象
前言
Servlet生命周期
JavaEE_01lifecycle学习任务:
浏览器的任务:请求,处理,响应
servlet任务:接收请求,通过对应的java代码处理请求,处理之后对其发出响应
servlet由服务器创建,是单例的
项目发布:
tomcat集成进来注意:1,添加tomcat2,配置D:\Program Files (x86)\apache-tomcat-\webapps
卸载:1,Delete 2,Servers文件夹3,server-->Runtime environment 删除对应的tomcat
1.手动发布 (实地项目)
在eclipse导出web功能为一个war文件
将war文件复制到 tomcat/webapps/ 目录下 启动tomcat
访问:ip+端口/项目名/文件
2.自动发布(开发项目)
在eclipse中集成tomcat
修改文件后,会自动将文件更新到服务器上
服务器的生命周期:由服务器创建servlet对象
前提: 在继承HttpServlet时,必须关联进tomcat
重写构造方法以及inti,service,destroy方法
构造方法和init在实例化对象时只被加载一次,
加载方法: 默认为负数,在第一次加载时实例化对象 1.在第一次实例化时被创建-1
通过在web.xml中配置,大于等于零时,在服务器启动时一并加载2.在服务器启动是被创建0
service在每一次请求时被加载--->doGet()或doPost()
destroy在该对象被摧毁时或服务器关闭时执行
客户端访问浏览器:
1.在web.xml中配置servlet文件(将servlet注册到服务器中)
2.通过注解如:@WebServlet(name="saveUserServlet",urlPatterns="/saveUser")
都可以为servlet配置多个访问路径
访问为路径错误
ServletContext和ServletConfig对象:
JavaEE_ServletConfigContext学习任务:
服务器在创建Servlet对象时,会将当前Servlet配置的初始化参数封装到ServletConfig对象中
一个servlet中对应一个ServletConfig,自己使用,别人不能用到
由init()方法通过ServletConfig进行初始化操作:
// 获得Servlet对象名
System.out.println(config.getServletName());
// 通过键的名字获得值
String value =config.getInitParameter("name");
// 获得所以参数名称的集合
Enumeration names = config.getInitParameterNames();
在web.xml文件中Servlet中配置有
0
1
这样都是在服务器启动时加载,只是数字小的先执行,这里就是通过设置来进行测试,而不是通过配置路径访问测试
ServletContext全局变量,一个应用程序有一个
getInitParameter("name")获得当前应用的初始化参数
setAttribute("attrname",value) 设置ServletContext属性并赋值
getAttribute("attrname") 获得ServletContext属性指定值
removeAttribute("attrname") 删除ServletContext指定属性
getRealPath(filename)获得文件的绝对路径
getContextPath()获得当前应用的根目录
HttpServletRequest以及HttpServletResponse对象
JavaEE_Http学习任务:
在servive()中已经有doGet()和doPost()方法只是选择请求的方式而已。
请求:
get请求:
1,在地址栏直接输入地址
2,超链接请求
3,method="get"
4,window.open("url");
5,location.assign("url");
6,location.replace("url");
post请求:
表单method="post"
当get请求不能响应时,就报错误
获得客户端的数据:
注意字符集编码-->request.setCharacterEncoding("UTF-8");其实查看JSP源码会发现在try开始就设置了字符集
通过参数名获得对应的值:
单值:String request.getParameter("name");
多值:public java.lang.String[] getParameterValues(java.lang.String name);
获得请求头信息(更多查询API):
request.getLocalPort()// 客户端端口(获得tomcat端口)
System.out.println(request.getPathInfo()// 信息路径
对客户端做出响应:
注意设置字符集编码-->response.setContentType("text/html;charset=utf-8");
response.setHeader("content-type","text/html;charset=utf-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
通过HttpServletResponse响应获得到getWrite()输出流
PrintWriter out = response.getWriter();
write和print的区别:
print底层实现是write,即print的功能更强。
响应都可以解析html标签。
注意如果直接通过response这种方式响应客户端,响应后页面的路径就是该servlet的路径
(就是通过out.write()输出的内容是显示在页面上,该页面的路径就是servlet的路径)
Jsp与servlet的区别
JavaEE_04JSP学习任务:
JSP的本质就是servlet,在运行jsp文件时,必须有服务器(tomcat等)的关联
在项目中新建一个jsp文件,用服务器运行后在服务器的work目录下观察其源码:
本机源码路径:D:\Program Files (x86)\apache-tomcat-\work\Catalina\localhost\JavaEE_04JSP\org\apache\jsp
观察源码发现jsp文件其实是一个类名为命名_jsp本项目中名字为:index_jsp;login_jsp
但是更多的我们发现其实该类还继承和实现了
extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports
在往下观察其实我们所写的jsp代码嵌套在try……catch中,而且是通过响应字符流的形式输出
out.write("hello jsp\r\n");
对JSP文件的编码以及格式进行设置:
编码:Window-->Preference-->Web-->JSP Files-->修改即可
格式:Preference-->Web-->JSP Files -->Editor-->Templates-->New JSP File(html) --> Edit-->修改即可
JSP的注释:
不会被编译且不会再页面源码中显示:<%-- --%>
会被编译且可能运行在页面源码中显示:
会被编译但不会out.write()不会再页面源码中显示:<% //单行注释 /*多行注释*/ %>
JSP的概述以及内置对象
JavaEE_05Include学习任务:
JSP概述:
语法:<%@ 指令名 键值对形式存在 %>
page指令:language="java"编译使用的语言
contentType="text/html; charset=UTF-8" 设置响应内容编码
pageEncoding="UTF-8" 页面编码
import="java.util.Date" 导入外部包中的类
errorPage=".jsp" 当页面出现异常时,指向提示页面
isErrorPage="false" 是否报错页面,默认为true
session="false" 如果设置了,则该页面将不能使用session,默认为true
include:
不管静态包含还是动态包含,被包含的能用父类的变量(数据),但是父类不能用多包含对象中的变量(数据)
<%@ include file="includeOne.jsp" %>
静态包含:在编译期间就将两个文件整合为一个.java文件,被包含的将不能被访问。这样两个jsp文件就能共享变量(数据)。
当访问被包含的文件时,报错HTTP Status – Internal Server Error
其实被包含的.java文件是存在的,但是编译整合之后只有一个.class文件
源码: out.print((new StringBuilder("目标页面includeOne")).append(num).toString());
动态包含:编译为两个独立的.java文件,及都能访问到。在运行时将被包含的内容包含进来,之间不能共享变量(数据)。
源码:JspRuntimeLibrary.include(request, response, "includeTwo.jsp", out, false);
九大内置对象:就是在JSP页面直接使用的对象
(在.jsp页面中添加isErrorPage="true",能够观察到九大内置对象)
request,response,pageContext,
session,exception,application,
config,out,page,
重定向(response)以及请求转发(request)
其实是本质的可以通过out.print("");
重定向(Status为):重新定向地址栏中的地址。地址栏中地址变化
整个过程有两次请求响应。(通过request设置参数可证明)
这就造成了重定向不能通过request带参数,但是可以通过session带参数,而且不能访问WEB-INF目录下的文件。
转发:
整个过程一次请求响应。(通过request设置参数可证明)
session :客户端和服务器间的对话。
第一次访问网页时会生成一个SessionID号,用session.isNew()观察
第二次之后再次访问服务器,会产生一个Cookie
同一浏览器用同一个session对象,可以用在不同的页面中,也是每个浏览器的唯一标识
context,request,session都拥有setAttribute(),getAttribute(),removeAttribute()
session:存储同一个会话中共享的数据,在同一个会话中不同页面中获得用户信息。
如果只用一次,或者请求一次,就将属性放在request中即可。(弄懂每个对象的使用范围)
Session对象
JavaEE_06session学习任务:
session的生命周期:
创建:
1,第一次打开浏览器,访问服务器成功,由服务器在服务器端创建。
session对象存储在浏览器端,将id号响应到浏览器中。
2,客户端Id号存在,但服务器端session会话销毁,当再次发起请求时服务器就会再次创建session对象。
设置session对象的非活动时间:
/* 设置session的非活动时间以秒为单位 */
session.setMaxInactiveInterval(5);
销毁:
错误源:会话结束,浏览器关闭,session对象不会销毁。因为sessioin对象存储在服务器中,浏览器关闭,服务器并不知道。
浏览器关闭本地sessionID号销毁,再次打开浏览器请求,就是一次全新的请求,服务器会生成新的session对象。
可以理解为只有一个User,但是可以new多个对象使用。--->一个session会话,可以有多个session对象
1,当session长时间(默认分钟)不被使用时,session对象会被服务器销毁
将当前的session对象发送个服务器,服务器其实已经将与之对应的session对象销毁,就没有与之对应的sesssionId,就会重新创建一个对象。
2,服务器关闭session会话销毁。
但是服务器tomcat会在关闭时,将session对象序列化缓存session对象。生成SESSIONS.ser文件,在启动服务器时再读取回来,SESSIONS.ser文件消失。
SESSIONS.ser文件本机位置:D:\Program Files (x86)\apache-tomcat-\work\Catalina\localhost\JavaEE_05Include\org
可以通过配置让服务器不缓存服务器对象。在Server文件夹中的context.xml将下面注释放开
当服务器关闭时间超过最大时间时,直接销毁。同理,客户端有ID,而服务器已经销毁。
3,安全退出时,强制销毁session会话。
session.invalidate()
ServletContext ---> application对象
应用于整个程序,且整个应用程序共享的唯一一个对象,这就可以在不同的浏览器中获得的application对象都是相同的。
在application对象中添加参数,这样在不同浏览器,不同页面,不同会话都能拿到该参数值。
生命周期:创建于服务器 启动 结束语服务器关闭。
pageContext---> 每个jsp网页都对应一个pageContext对象
其他页面不能共享该页面数据
exception --->在错误提示页面设置isErrorPage="true"在其body中<% 输出异常信息%>
出错页面设置errorPage=".jsp",设置错误提示地址,如果当前页面出现异常,会通过errorPage=".jsp"转发(地址栏不变).
注意一点测试异常时不要在Eclipse内置浏览器中测试,测试不出效果。
Cookie对象以及过滤器
- 向需要Cookie页面时注意不要用请求转发,没效果。
- 注意在判断是否选中记住密码复选框时不能通过.equals(""),会出现null异常
JavaEE_07Cookie学习任务:
Cookie是保存在客户端的小文本。
Cookie的作用:从服务器端向客户端响应的一些信息。
临时存储在浏览器的内存中,浏览器关闭,数据就不存在了。
可以通过设置有效时间,保存在电脑硬盘上,到期后自动删除。
设置有效时间之后,之后的每次请求,浏览器都会将Cookie的数据发送,那么我们就能在服务器端获取Cookie数据。
从页面请求中获得值,检查是否保存密码,是则给Cookie有效时间,否则不执行。
if(userName != null && password != null){
/*判断记住密码复选框是否已选*/
if(inform != null){
/*Cookie是通过键值对的形式存储数据*/
Cookie cok = new Cookie("acc", userName);
Cookie sok = new Cookie("pas", password);
/*设置时间以秒为单位*/
cok.setMaxAge();
sok.setMaxAge();
/*添加Cookie对象到response对象中,最终响应给浏览器*/
response.addCookie(cok);
response.addCookie(sok);
}
通过过滤器,在每次重定向时或其他请求时检查Cookie,注意不要用请求转发,没效果。
值得注意的是,在过滤器中,request与response是ServletResponse类型,而获取Cookie需要HttpServletRequest类型需要强制类型转换。
/* 通过过滤器设置Cookie,在返回页面,让页面拿到Cookie值,注意配置过滤器地址只能在登录页面 */
Cookie[] cookies = req.getCookies();
String acc = "";
String pas = "";
if(cookies != null){
for(Cookie cookie : cookies){
if(cookie.getName().equals("acc")){
acc = cookie.getValue();
}
if(cookie.getName().equals("pas")){
pas = cookie.getValue();
}
}
}
1.在配置文件中配置过滤器
cookie
com.wenhua.project.util.CookieFilter
cookie
/Login.jsp
2.在过滤器中进行注解配置
@WebFilter(urlPatterns="/Login.jsp")
Session 和 Cookie的区别:
session保存在服务器端,cookie保存在客户端
session保存的是任意对象,值为Object,cookie保存的是字符串,值只能是字符串,tomcat9.0之后可以保存中文
session生命周期结束后,信息随之也消失,cookie可以长期保存在客户端硬盘上,也可以临时保存在浏览器内存中(关闭浏览器,信息消失)。
过滤器:
作用:设置字符集,限定某些用户的浏览页面范围,输出日志。
创建一个类实现接口Filter--->重写doFilter(request,response,chain)方法--->执行语句+chain.doFilter(request,response)
在web.xml中配置以及要过滤文件的路径,初始化需要的参数(能在配置中进行配置在servlet中通过init()方法获得的初始化数据,就不要在servlet中定义)
其实通过过滤器时,我们可以更直观的发现原来在重定向时发起的两次请求,会经过两次过滤器(本例中为登录页面用户密码不正确时,重定向.jsp页面)
论配置文件的重要性,1,配置文件不会被加载为.class文件,而当.java文件修改后,只有重新发布项目。
1.配置文件不会加载为.class文件2.配置参数比较集中(不需要找地方)容易更改
注意在