第一章 Java Web工作原理
(一) HTTP请求流程及包含的内容:
1. 客户端与Web服务器建立连接;
2. 客户端发送HTTP请求;包括:
1) 请求行:由请求的HTTP方法、请求的URL、HTTP版本 组成,中间用空格分开;
2) 请求头:用来传递请求的元信息。由用户代理资料、可接收的格式、语言、内容编码等组成;
3) 空行:发送回车符和换行。分割请求头和消息体;
4) 消息体:HTTP请求中带有查询字符串时,如果是GET方法,查询字符串或表单数据附加在请求行中,那么消息体中就没有内容;如果是POST方法,查询字符串或表单数据就附加在消息体中;
3. 服务器端接收客户端HTTP请求,生成HTTP响应回发;
1) 状态行:由HTTP协议版本、响应状态码、响应描述组成;
2) 响应头:内容类型(Content-Type)描述(MIME类型)、内容长度、时间邮戳、服务器你信息、内容最后更改时间;
3) 空白行:发送回车符和换行。分割请求头和消息体;
4) 消息体:Web服务器会把要发送给客户端的文档信息放在消息体中;
4. 服务器端关闭连接,客户端解析回发响应,恢复页面;
Servlet特点:
1. Servlet是常规的Java代码。代码中用了一些新的API;
2. Servlet不属于J2SE,它属于单独的规范;
3. Servlet对标准的类(HttpServlet)进行了扩展;
4. Servlet没有main();
Servlet在服务器端工作执行的任务:
1. 读取客户端发送的显式和隐式数据;
2. 生成结果;
3. 向客户端发送显式数据(即文档)和隐式数据(HTTP响应数据);
Web容器对Servlet的支持包括:
1. 通信支持;
2. 生命周期管理;
3. 多线程支持;
4. JSP支持;
5. 处理安全性;
第二章 Servlet基础
概念:
Java Servlet是运行在Web服务器或应用服务器上的Java程序,是在Web上创建动态内容的有效的解决方案;
Servlet规范的组成:
1. Web应用程序:
2. Servlet和HTTP Servlet:
3. 过滤器:
4. 安全:
5. 国际化:
Servlet API
1. Servlet API是专门用来开发Servlet的java类和接口,Web容器和Servlet之间用API进行通信;
2. 一个Servlet程序就是运行服务器端的一个Servlet APId java类,定义了与容器的一些规范;
3. Javax. Servlet。
第三章 HTTP响应包括:
第四章 使用Servlet处理HTTP响应
Hidden
Cookie
Cookie是客服端的技术,程序把每个用户的数据都通过K-V对的方式保存到cookie。下次请求的时候,将cookie放到请求头里面再次访问服务器,服务器就可以根据cookie里面的内容来判断当前用户的状态。
会话:打开浏览器,通过超链接或者按钮访问服务,获取内容,关闭浏览器,的过程,称为会话;
获取cookie:
Cookie[] cookie=request.getCookies();返回数组
if(cookie==null){
创建一个cookie:
Cookie cook=new Cookie(“名字”,“值”);
Cookie创建好后,要将cookie发送回客户端保存:
response.addCookie(cook);
Cookie的时间默认是会话结束就消失,设置过期时间,会将cookie保存到硬盘:
销毁cookie设置setMaxAge(0);//保存时间为0秒;
cook.setMaxAge(秒的时间长度);
}
Session
session是服务器端的技术,利用这个技术,我们可以为每一个浏览器(用户)创建一个独特的session对象。
Session工作流程:
客户端请求服务器创建一个Session,将SessionID保存在cookie里面。再将cookie发送回客户端;客户端在再次请求,就将cookie发送到服务器,服务器取出sessionID去匹配所有的session,返回当前匹配到的session对象;
1、创建一个Session对象,getSession()创建好了一个Session;直接返回一个Httpsession对象:
——匹配成功,就返回当前匹配的session对象,匹配失败,创建一个session;
HttpSession session = request.getSession();
——自动匹配sessionID,匹配成功就返回session,匹配失败就返回null;
HttpSession session = request.getSession(false);
——如果session==null;可以考虑要不要创建session;
——获取到cookie里面的id和session进行匹配
底层代码:int id = session.getId();
——isNew()方法:判断当前session是否为新创建的session:
if(session.isNew()){是新的session
}else{ 是久的session }
3、在session对象下存储信息:
配置:session.setAtrribute(“属性”,“值”)
取值 = session.getAtrribute(“属性”)
4、设置销毁session:(3种方式)
a、setMaxInactiveInterval设置session的销毁时间,秒作为单位,最长不活动时间;
session.
b、立即销毁session:
session.invalidate();
c、在web.xml下设置:最长不活动时间间隔;
<session-config><session-timeout>只能是正数:分钟为单位</session-timeout></session-config>
5、设置cookie的最大保存时间,覆盖getSession的底层
6、上下文对象是所有Servlet和所有用户都共享的,(一个浏览器可看作是一个用户);
7、Session对象是所有Servlet共享的,但是每一个用户(浏览器)是一个Session,不同的用户不能共享Session;即:在同一个浏览器下,所有的Servlet都共享相同的Session;
URL地址重写
1、 获取当前工程的名字:
String path = Request.getContextPath();
2、 获取Servlet的地址:
String spath = Request.getServletPath();
3、 URL重写是容器自动完成的,我们只需要对URL进行编码
String newPath = response.encodeURL(path+spath);//会增加在最后“;JsessionId”
4、 EncodeRedirectURL()也可以进行编码,对重定向的URL进行编码;
5、 Cookie和URL重写都工作的时候,cookie优先,所以说,以后为了防止用户屏蔽cookie,可以将两种技术同时使用;
总结:Session可用的条件:1.客户端有JsessionID(①通过cookie来保存在浏览器,②通过URL地址的重写将JsessionID传到服务器);
2.服务器端存在Session对象,
------实例:登录时验证码的产生
在内存里面创建一张图片,参数:宽度、高度、图片的类型:
BufferedImage im=new BufferedImage(宽,高,BufferImage.TYPE_INT_RGB);//图片类型不透明设置
获取到图片,用于在java平台获取带一个二维图形,
Graphics2D g=new(Graphics2D) im.getGraphics();
设置图片的背景
g.setColor(Color.gray);
设置背景填充,第一个和第二个都是位置,第三个和第四个是要填充的大小
g.filRect(0,0,80,20);
向图片上写数据
设置图片上的文字颜色
g.setColor(Color.gray);
设置字体的风格
g.setFont(new Font(“宋体”,Font.BOLD,20));//字体,加粗,大小
g.DrawString(“3601”,10,20);//随机数,位置
设置响应的MIME类型
response.setContextType(“image/jpeg”);
控制浏览器不能缓存此图片
将图片发送给浏览器
response.setDate
response.setHeader(“Cache-Control”,”no-cache”);
response.setHeader(“Pragma”,”no-cache”)
//将图片发送给浏览器
ImageIO.write(image,"jpg", response.getOutputStream());
产生一个随机数,不够4位,在前补零
public String getNum(){
Random r = new Random();
String num =r.nextInt(9999)+"";
StringBuffer b = new StringBuffer();
for(int i=0;i<4-num.length();i++){
b.append("0");
}
String newStr = b.toString()+num;
return newStr;
}
//创建一个session用于装每个用户的验证码
HttpSessionsession = request.getSession();
session.setAttribute("code",num);
————》跳转验证:
//获取到session保存的验证码,一个浏览器共用Session
HttpSession session=request.getSession();
String code = (String)session.getAttribute("code");
if(code.equals(imageCode)){
request.getRequestDispatcher("/index.jsp").forward(request,response);
}else{
response.sendRedirect("/JavaWeb06_imgCode/login.html");
}
//设置Math.random()作用
//两次请求地址一样,服务器只会处理第一次请求,第二次请求得到的结果跟第一次结果就是一样,(缓存显示)
//第一次服务器缓存了上次请求得到的结果,加上一个随机数,服务器就认为每次请求都不一样。
oimg.src="/JavaWeb06_imgCode/ImgCodeServlet?"+Math.random();
JSP基础(Java ServerPages)
概念:jsp=html模板+java代码。所有的java语言都可以在JSP中使用;
html定义了整个网页的骨架、页面的结构和外观,java代码显示数据
JSP声明:可以声明常量、变量、函数、静态块。。。主要是定义全局的变量方法
<%!
JSP声明
%>
JSP API : test.jsp→翻译为test.java代码。test类继承了HttpJSPBase继承了HttpServlet。
则,JSP本质上就是Servlet;
JspServlet类是jsp引擎;用来执行jsp代码;
Tomcat web.xml里面已经配置了jsp的内容,注册和映射都配置好了,tomcat是一个jsp、Servlet的容器;
Jsp和Servlet之间的异同:
他们都是Servlet,都是服务器端动态网页的技术,jsp重在显示数据,而Servlet重在对业务逻辑的处理;
Jsp的脚本片段:所有的java代码都是放在service方法的内容中,可以调养外部的属性和方法。该jsp脚本片段只能出现java代码,不能出现任何模板元素,jsp引擎在翻译jsp代码都放在service方法里。Jsp脚本代码片段必须完全遵循java语言规则。
在一段脚本片段里面要嵌套模板元素,只能将脚本片段放开;
<%
(Jsp的脚本片段)
%>
Jsp脚本表达式:用于将程序的数据输出到客户端,jsp引擎会将脚本表达式变成out.print(…)或out.write(…);
<%= m(Jsp脚本表达式) %> //注:不能在后面加”;”分号
等价于:<%out.print(m)%>
Jsp运行机制:
生命周期:1、jsp页面翻译阶段,将*.jsp引擎转换成*.java文件;2、jsp页面编译阶段:将*.java文件编译成*.class文件;3、jsp页面类装载阶段。Web容器新生成的Servlet类;4、jsp页面类实例化阶段;5、jsp页面实例化阶段;6、jsp页面服务阶段;7、jsp页面销毁阶段;
Jsp注释:<%--jsp的注释--%>
html注释:<!--html的注释--%>
jsp指令:(3种)
page:page指令用于定义jsp页面的各种属性;无论page指令出现jsp的哪个地方,它都是作用整个页面;
<%page contentType=“text/html;charset=utf-8” %>
include:include指令可以包含任意文件,用于引用其他的文本文件内容;
用来包含外部文件,可以是静态文件,也可以是动态文件;
静态包含:先把其他页面的内容引入到当前这个页面,变成一个页面。最终只会产生一个Servlet。包含动态网页时,包含的内容必须遵循jsp的语法。被引入的文件可以是任意的扩展名,静态引入会产生一个文件,在翻译成Servlet,引入的文件不能有指令冲突;
也表示在jsp编译时插入一个包含文本或者代码的文件,把文件中的文本静态地包含过去,也就是说,会把被包含的页面拷贝到包含的页面中指令所在的位置;
<%@ include file=”相对路径” %>
Taglip:导入标签库的指令;
Jsp标准动作:
<jsp:include>动作是一种动态的包含;
动态包含的是结果,有多少动态页面就包含多少个结果,创建多个Servlet,将所有Servlet的结果放在一起;
——如果包含是静态页面,相对于静态包含,包含的每一个页面都可以设置自己的指令和变量,不会冲突;
<jsp:includepage=”相对路径”>
<jsp:forward>:当执行到派发动作的时候,将控制权交给了下一个资源,就相当于Servlet里<jsp :forward page =”相对路径”></jsp :forward>里面的请求派发;
Jsp隐式对象(9种)
可以直接在jsp里面使用,不需定义,jsp引擎已经定义好了;
pageContext:是jsp技术中最重要的一个对象,代表jsp页面的运行环境。这个对象封装了其他八个对象。
通过findAttribute(“属性”)获取到其他对象的属性值;getAttribute(“属性”)能获取自己对象的属性值;
它自身还是一个容器(域对象),用当前这个对象来封装数据。当前这个对象还包括了一些动作,跳转、引入文件;
查询内容,首先找本身这个对象,找到就返回并结束查找,未找到就继续从其他对象查找。查找其他的对象顺序,按照从小到大(表示当前对象作用的范围)的一个顺序:page》request》Session》application 找不到就返回null;
Page:表示当前页面,可以理解为一个对象本身。就相当于把jsp看成一个对象;
第七章 Web开发模式
<jsp:useBean >
id:当前实例化对象的引用;
class;创建的实例,对用的包和类的名称;
scope:javaBean保存的范围page-request-Session-application
()
<jsp:setProperty>
Property:代表当前对象的属性的名字
Name:当期javabean对象的名字
Value:代表当前属性的值;
Parem:用于获取用户传送过来的参数,值是username(属性名)。传递的是属性的名字。获取到用户传递的值,再设置给property-name;property=“*”:表示匹配所有的属性,用户请求过来的属性名字必须和javabean下的属性名字保存一致;
<jsp:setProperty>
Property:代表当前对象的属性的名字
Name:当期javabean对象的名字
开发模式
1、 Jsp+javabean模型:
Jsp:负责控制逻辑、业务对象的调用,还有显示数据;
Javabean:主要用于封装数据,处理程序的业务;
优点:效率高,不需要很复杂的构架模式。开发起来简单。适合开发小程序;
2、 MVC模型:
是一种架构模型。本身没有引入任何的性能。只是把我们开发的架构组织的更合理,将表现和结构分离,将逻辑和表现分离;
Model模型用javabean,把javabean称为javabean组件,既负责收集封装数据,又要进行业务逻辑的处理,造成javabean非常庞大,将javabean组件替换为三层架构;
Javabean组件=域模型+业务层+持久层
MVC在三层结构里面主要存在于表示层;
Mode(模型):提供要展示的数据,包含数据和行为;
View(视图):主要是负责模型的数据展示;
Controller(控制器):接受用户请求,委托模型进行业务处理,处理完了后,将数据发送给视图。是一个调度员。
Model → javabean
View → jsp、html
Controller → Servlet