1.项目在Tomcat的配置:在tomcat的conf文件夹下的server.xml中加入如下代码:
2.http请求方法
<1>GET方法用于获取由Request-URI所标识的资源信息,常见形式是:-GET Request-URI HTTP/1.1 ,通过在浏览器地址中直接输入网址的方式访问网页的时候,浏览器采用
GET方法向服务器获取资源。
<2>POST方法用于向服务器发送清求时,要求服务器接受附加在请求后面的数据。POST方法常用于表单提交。
POST: /login.jsp HTTP/1.1 (CRLF)
Accep:image/gif(CRLF)(.....)
Host:www.sample.com(CRLF)(......)
.....
Cache-Control:no=cache(CRLF)
(CRLF)
username=hello&password=12345
3.jsp详细内容:嵌入代码的html页面 JSP(java server pages)
<1>所有程序操作都在服务器执行,网络上传送给客户端的仅是得到的结果,这样大降低了对客户浏览器的要求,即使客户浏览器不支持java,也可以访问jsp页面。
<2>JSP执行过程:如图所示:
<3>jsp最终都会转换成Servlet去执行
<4>jsp语法概述:
a.jsp原始代码中包含了JSP元素和Template (模板) data两部分
a_1:Template Data:JSP引擎不处理的部分,即标记<%%>以外的部分,例如代码中的HTML的内容等,这些数据会直接传送到客户端浏览器
a_2:JSP元素是指将由JSP引擎直接处理的部分,这一部分必须符合JAVA语法,否则将会导致编译错误。
b.JSP语法分为三种不同的类型:
b_1:编译器指令(DIRECTIVE):例如<%@ page import="java.io.*" %>
----包括:”包含指令“ ”页指令“ ”taglib指令“
----编译器指令包含在”<@%...%>“卷标里
----两个主要的指令:Page include
--- include:包含指令<%@ include file="文件的相对路径//绝对路径" %>,包含静态页面
--- page指令:<%@ page import="" pageEncoding=""%>作用于整个JSP页面,同样包括静态的包含文件,不能作用于动态的包含文件,如"
<jsp:include>"
可以在一个页面上用多个”<%@page %>“指令,但是其中的属性只能用一次,不过也有例外,那就是import属性,类比于java中的
import语句
<%@page%>指令可以放于JSP页面的任何地方,但是为了JSP的可读性,通常放于JSP页面的顶部。
--- taglib指令:用于定制标签库<%@ taglib uri="" prefix="" %>
--- <jsp:forward>指令:用于转向页面,在该指令后面的所有代码都没有机会执行,因为页面的流程已经转向新的页面。下图打印不会执行
--- <jsp:include>指令:包含一个静态或动态文件,可以向被包含的jsp文件发送参数,而<%@ include ..%>不能向包含页面传送参数。
b_2:脚本语法(SCRIPTING):
b_2_1:主要包括以下内容:
----”HTML注释“:<!--comments--> 发送到客户端同时也显示,如果其中嵌入jsp脚本,其中的脚本仍然会执行。
----"隐藏注释":<%--comments--%>这种注释发送到客户端但是不显示
----"声明"<%! declaration;[declaration;]......%>,jsp转换成Servlet后,如果代码没有进行修改,Servlet是单例的,只在内存中加载一次。声明中声明的变量,转化成
Servlet的成员变量,每个用户每次访问的都是同一个成员变量,脚本段中定义的变量,转换成方法的局部变量,每个用户每次访问JSP页面都会新生成新的变量。
----”表达式“:后面不需要加分号,用于在页面上输出信息,语法格式:<%=expression%>
----”脚本段“:里面任何合法的java代码,<%%>
b_3:动作语法(ACTION):<jsp:forward><jsp:getProperty><jsp:include>
c.***JSP内置对象:
request(请求对象);response(响应对象);pageContext(页面上下文对象);
session(会话对象);application(应用程序对象);out(输出对象);
config(配置对象);page(页面对象);exception(异常对象)
c_1:out对象:out.print().out.println()----源代码换行 <br>----页面换行,代表了向客户端发送数据的对象,与response对象不同,通过out对象发送的内容是浏览器要显示
的内容,是文本一级的,可以通过out对象直接向客户端写一个由程序动态生成的html文件,常用的方法除了print和println()之外,还包括
clear(),clearbuffer(),flush(),getBufferSize()和getRemaining(),这是因为out对象内部包含了一个缓存区,需要一些对缓存区进行操作的方法。
c_2:request对象:代表来自客户端的请求,例如在表单中提交的信息,是最常用的对象。方法中使用较多的是
getParameter(),getParameterNames(),getParameterValues(),通过这几个方法来获取请求对象中所包含的参数值。
其中getParameter()是getParameterValues()的特例,表示请求参数值只有一个,如果请求的参数值有多个,则使用getParameterValues(),在多选框中
需要使用getParameterValues()。
---getAttribute(String name):以对象的形式返回特定名称的属性值。如果所给的名称的属性不存在将返回空值 。
---getParameter(String name)和getAttribute(String name)区别:getParameter()是服务器端获取用户请求发送过来的参数,是客户端和服务器端的
交互getAttribute()获取的是服务器端已经设置过的信息,与服务器的setAttribute()方法相对应,getAttribute()方法是服务器内部执行的,对客户是不公
开的。
---request对象内数据的存活范围就是在request对象的存活范围内,当客户端向服务端发送一个请求,服务端向客户端返回一个响应后,该请求对象
就被销毁了;之后再向服务端发送新的请求进,服务器会创建新的request对象,该对象与之前的request对象没有任何关系,因此也无法获得在之前
request对象中存放的任何数据。
c_3:response对象:代表对客户端的一个响应,也就是说可以通过"response"对象来组织发送到客户端的数据,但是由于组织的方式比较底层,不建议使用,需要向客户
端发送文字时直接使用"out"对象。通常用于文件下载。与服务器连接是一个TCP/IP的过程。
---sendRedirect(String fileName):该方法用于重定向,如果参数fileName中加“/",则是相对于Servlet容器的根路径(http://localhost:8080)寻找资源,不加
"/"则是相对于当前访问uri寻找路径.重定向会服务器发送两个请求,第一个请求为用户提交表单的请求,第二次请求是sendRedirect所带参数指定
的资源。
两次请求
---requestDispatcher的forward(request,response)称之为请求转发,从始到终均为一个请求。
---RequestDispatcher是通过调用HttpServletRequest对象的getRequestDispathcer()方法得到的,是属于请求对象的方法。
---sendRedirect()是HttpServletResponse对象的方法,即响应对象的方法,既然调用了响应对象的方法,那就表明整个请求过程已经结束,服务器开
始向客户端返回执行的结果。
c_4:pageContext对象:页面上下文对象,代表当前页面运行的一些属性,常用的方法findAttribute(),getAttribute(),getAttributesScope(),getAttributeNamesInScope(),该内
置对象,在项目所面临的情况比较复杂时,会用到页面属性辅助处理,一般Servlet容器会使用该对象。
c_5:session对象:代表服务器与客户端所建立的会话,当需要在不同的JSP页面中保留客户信息的情况下使用。
----使用session的原因:首先HTTP是基于请求-响应模式的无状态协议,它不会保存用户访问的任何相关信息,Web Server对每个客户端请求也都没有历史记忆
,因此采用Session来保存客户端的状态信息。
----session对象内数据的存活范围也就是session对象的存活范围(只要浏览器不关闭,session对象就会一直存在),因此在同一个浏览器窗口中,无论向服务器
发送多少个请求,session对象只有一个。
-----登录后通常会使用session,用于存放用户的相关信息。
c_6:config对象:提供一些配置信息,常用的方法有getInitParameter()和getInitParameterNames(),以获得servlet初始化的参数,通常用于Servlet中,在jsp中使用很少。
c_7:page对象:正在运行的jsp文件所产生的类对象,不建议使用
c_8:exception对象:代表了jsp文件运行时产生的异常对象,此对象不能在jsp文件中直接使用,而只能在使用了”<%@ page isErrorPage="true"%>“的jsp文件中使用。
c_9:application对象:ServletContext类的一个实现对象。存活范围最大的对象,只要服务器没有关闭,application对象中的数据就会一直存在,在整个服务器运行过程中
application对象只有唯一的一个,会被所有的访问用户共享。getRealPath(String filename)--返回文件对应服务器上的真实路径。
小结:request,session及application对象的范围是逐个增加的,request只在一个请求范围内;session是在浏览器窗口的范围内;application则是在整个服务器运行的过
程中。
<4>表单的验证:客户端验证---------服务端验证
<5>JavaBean:可以重复使用,跨平台的组件(有图形界面,无图形界面)
a.MVC设计模式(Model,View,Controller)
Model---模型完成实际处理的组件
View---视图
Controller-控制器
b.声明JavaBean:<jsp:useBean id="myBean" class="com.it.bean.MyBean" scope="session" />,如果Bean已经在别的“<jsp:useBean>”标记中创建,则当使用这个已经创建
过的Bean时,id的值必须与原来的那个id值一致,否则意味着创建同一个类的两个对象。
获取JavaBean的属性值:<jsp:getProperty property="" name=""/>
设置JavaBean的属性值:<jsp:setProperty property="" name="" value=""/> param与value属性不能共存
c.JavaBean的范围:scope属性决定了JavaBean对象存在的范围,scope的可选值:page,request,session.application
c_1:page范围:客户每次请求访问JSP页面时,都会创建一个JavaBean对象,JavaBean对象的有效范围是客户请求访问的当前JSP网页。
JavaBean对象在以下两种情况下都会结束生命周期:
客户请求访问的当前JSP网页通过<forward>标记请求转发到另一个文件
客户请求访问的当前JSP页面并向客户端发回响应。
c_2:request范围:客户每次请求访问JSP页面时,都会创建一个JavaBean对象,有效范围
客户请求访问的当前JSP网页
和当前jsp网页共享同一个客户请求的网页,即当前网页中<%@ include%>指令,以及<forward>标记包含的其他JSP文件
当所有共享同一个客户请求JSP页面执行完毕并向客户端发回响应时,生命周期结束。
c_3:session范围:Java对象被创建后,存在于整个Session的生命周期内,同一个Session中的JSP文件共享JavaBean对象
c_4:application范围:存在于整个web应用的生命周期,web应用的所有jsp文件都能共享同一个生命周期。
<6>Servlet详细概述:
a.定义:java servlet是和平台无关的服务端组件,它运行在Servlet容器中,Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户通信采用请求响应
b.功能:
创建并返回基于客户请求的动态HTML页面,
创建可嵌入到现有HTML页面中的部分HTML页面(HTML页面片断),
与其他服务器资源(如数据库或基于Java的应用程序)进行通信;
c.框架:由两个java包组成
javax.servlet包:定义了所有的Servlet类都必须实现或扩展的通用接口和类;
javax.servlet.http包:定义了采用Http协议通信的HttpServlet类
核心:javax.servlet.Servlet接口,所有的Servlet都必须实现这一接口。
d.Servlet源码解析:
每个Servlet必须要实现Servlet接口,GenericServlet是个通用的,不特定于任何协议的Servlet,它实现了Servlet接口,而HttpServlet继承于GenericServlet,因此HttpServlet也
实现了Servlet接口,所以自定义的Servlet只需集成HttpServlet父类。
Servlet接口中定义了一个service方法,HttpServlet对该方法进行了实现,实现方式是将ServletRequest与ServletResponse转换为HttpServletRequest与
HttpServletResponse,转换完毕后,会调用HttpServlet自定义的service方法,在该service方法中,首先得到请求的方法名,然后根据方法名调用对应的doXXX方法,请求
为GET,就去调用doGet方法,请求方法为POST,就去调用doPost方法。在HttpServlet类中提供的doGet,doPost等方法直接返回错误信息,所以我们需要在自己定义的
Servlet中重写这些方法。request----org.apache.catiliana.connector.RequestFacade(Tomcat中的类)
e.生命周期:init(负责初始化Servlet对象)----service(负责响应客户请求)---destroy(当Servlet对象退出生命周期时,负责释放占用资源)
e_1:初始化分为两步:装载------------>初始化
e_1_1:装载在下列情况下Servlet容器会装载Servlet:
(1)Servlet容器启动时自动装载某些Servlet在web.xml的<Servlet>标签下,添加<load-on-startup>8</load-on-startup>元素,数字代表启动顺序
(2)在Servlet容器启动后,客户首次向Servlet发出请求
(3)Servlet类文件被更新后,重新装载Servlet
e_1_2: Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化,在Servlet的整个生命周期中,init方法只会调用一次
e_2:响应客户请求阶段:对于到达Servlet容器的客户请求,Servlet容器创建特定于这个请求的ServletRequest对象和ServletResponse对象,然后调用Servlet的Service方法
Service方法从ServletRequest对象中获取用户请求信息,处理该请求,并通过ServletResponse对象向客户返回响应结果。
e_2_1: ServletRequet接口:封装了客户请求信息,如客户请求方式,参数名和参数值,客户端正在使用的协议,以及发出的请求的远程主机信息等,ServletRequest接口
还为Servlet提供了直接以二进制方式读取请求数据流的ServletInputStream(文件上传) 其子类可以为Servlet提供更多的和特定协议相关的数据,
如HttpServletRequest提供的读取Http Head信息的方法。主要方法如下
对于Tomcat6.0.29来说,它会将客户端传过来的参数放在一个HashTable中,该HashTable的定义如下:
对于Tomcat6.0以上版本,会交客户端传过来的参数放在一个HashMapp中,该HashMap定义如下:
下图从上到下依次取于Tomcat6.0.35和Tomcat7.0源码:这是一个String ArrayList<String>的健值对
e_2_2:ServletResponse接口:为Servlet提供了返回响应结果的方法,它允许Servlet设置返回数据长度和MIME类型,并且提供输出流ServletOutputStream(文件下载),
e_3:终止阶段:
当Web应用被终止时,或Servlet容器终止运行,或Servlet容器重新装载Servlet新实例时,Servelt容器会首先调用Servlet的destroy方法,在destroy方法中,可以释放
Servlet所占用的资源。
e_4:Servlet的多线程处理:Servlet/JSP是以多线程模式执行。
Servlet本身是单实例的,这样当有多个用户同时访问某个Servlet时,会访问该唯一的Servlet实例的成员变量,如果对成员变量进行写入操作,就会导致Servlet的多线程问
题,即数据不一致。
解决Servlet同步问题的方法
(1)去除实例变量,使用局部变量
(2)使用同步代码块synchronized{}
e_5:cookie:用户访问web服务器时,服务器在用户硬盘上存放的信息,服务器可以根据cookie来跟踪用户,一个cookie包含一个key/value
设置cookie:Cookie cookie=new Cookie(name,value)----response.addCookie(cookie);
获取cookie:Cookie[] cookies=request.getCookies(),然后借助于循环获取。
e_6:Session详解:
e_6_1:服务器跟踪客户状态通常有四种方法
1)建立含有跟踪数据的隐藏字段
2)建立包含额外参数的URL
3)使用持续的Cookie
4)使用ServletAPI的Session(会话机制)
e_6-2概念:用于跟踪客户的状态,是在一段时间内,单个客户与web服务器的一连串相关的交互过程。在一个session中,客户可能会请求访问多次同一个网页,也有可
能请求访问服务器的其他资源。
e_6_3运行机制:
1)当一个session开始时,Servlet容器将创建一个HttpSession对象,在HttpSession对象中可以存放客户状态信息。
2)Servlet容器为HttpSession分配一个唯一的标志符,称为SessionID,Servlet容器把SessionID作为Cookie保存在客户浏览器中。
3)每次客户发出http请求时,Servlet容器可以从HttpServletRequest对象中获取SessionID,然后根据SessionID找到对应的HttpSession对象,从而获取客户的
状态信息。
e_6_4:生命周期:
1) 当客户第一次访问web应用中支持Session的某个网页时,就会开始一个新的session
2)接下来当客户访问这个web应用的不同网页时,始终处于同一个session中
3)JSP网页默认都是支持session的,也可以通过显式声明<%@ page session="true"%>
4)在以下情况下session会结束生命周期,Servlet容器会释放session所占用的资源
a.客户端关闭浏览器(严格来讲这并不能结束session,可以通过调用javascrip中window.onclose监视浏览器的关闭动作,向服务端发送请求删除session);
b.Session过期
c.服务端调用了session.invalidate()方法
5)session过期是指当session开始后,在一段时间内客户没有和web服务器交互,这个session就会失效,HttpSession地setMaxInactiveInterval()方法可以设置
session保持不活动的时间,如果超过这一时间session就会失效。
e_7:过滤器(Filter):可以对servlet容器的请求和响应进行检查和修改,filter本身不生成请求和响应对象,只提供过滤作用
e_7_1:作用:
a.在servlet被调用之前检查request对象,修改RequestHeader和Request的内容
b.在servlet被调用之后检查response对象,修改ResponseHeader和Response的内容
e_7_2: 过滤过程:
e_7_3:结构--所有的filter必须实现javax.servlet.Filter接口,这个接口包含三个必须实现的方法:init() doFilter(),destroy()
init(FilterConfig):Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法,在此方法中可以读取web.xml文件中的过滤器参数
doFilter(ServletRequest,ServletResponse,FilterChain):完成实际的过滤操作,当客户请求访问与过滤器关联的URL时,Servlet容器会先调用过滤器的
doFilter方法,FilterChain用于访问后续过滤器
destroy:Servlet容器在撤销过滤器实例前调用该方法,同时释放过滤器所占用的资源。
e_7_4:过滤器的执行流程:
e_7_5:串联Servlet过滤器的工作流程:
e_8:监听器(Listener):web.xml文件中要进行配置
e_8_1:定义--Listener是Serlvet的监听器,它可以监听客户端的请求,服务端的操作等,通过监听器,可以自动激发一些操作
e_8_2:常用的监听器接口:
a.ServletContextAttributeListener:监听ServletContex属性的操作
b.ServletContextListener:监听ServletContext
c.HttpSessionListener:监听HttpSession操作,
当创建一个Session时,激发session created(HttpSessionEvent)方法,
当销毁一个session时,激发sessionDestroyed(HttpSessionEvent)方法
d.HttpSessionAttributeListener
e_9:小结:
e_9_1,某些Servlet在web.xml文件中只有<Servlet>元素而没有<Servlet-mapping>元素,这样就无法通过url地址的方式访问这个Servlet了,这种Servlet通常会在
<Servlet> 中配置一个<load-on-starup>子元素,让容器在启动的时候自动载Servlet,并且调用其init方法完成一些全局性的初始化工作。
e_9_2:当Servlet容器启动web应用时,为每个web应用创建一个ServletContext对象,可以把ServletContext对象当作服务器组件的共享内存,在ServletContext中
可以存放共享数据,它提供了读取或设置共享数据的方法。setAttibute() getAttribute()
e_9_3:比较Servlet和Jsp:
相同之处:可以生成动态网页
不同之处:JSP的优点擅长网页制作,生成动态网页,比较直观。其缺点是不容易跟踪与排错
Servlet是纯粹的java语言,擅长于处理流程和业务逻辑,其缺点是生成动态网页不直观
<7>EL表达式:expression lanuage---->用于jsp语言中,消除jsp页面中的java代码
a.默认对象:
pageContext :使用较少
pageScope:Map,包含页面范围内的属性和值
requestScope:Map 包含reques范围内的属性和值
sessionScope:Map 包含session范围内的属性和值
applicationScope:Map包含application范围内的属性和值
param:request.getParameter()
paramValues:包含请求参数及他们的属性值数组
header:
headerValues:
cookie:
b.EL变量:EL存取变量如果没有指定范围,它的默认值会从Page范围找,假如找不到,再依序从Request,Session,Application范围寻找,如果中间找到相应变量返回。
<8>客户化JSP标签:
a.创建客户化标签的步骤:
1)创建标签的处理类
2)创建标签库的描述文件
3)在JSP文件中引入标签库,然后插入标签
b.JSP Tag API:
Servlet容器编译jsp网页时,遇到自定义标签就会调用标签处理类
标签处理类必须扩展以下两个类之一:
javax.servlet.jsp.tagext.TagSuppor
doStartTag:容器遇到自定义标签的起始标志时调用该方法,返回一个整数值,用来决定程序的后续流程。
返回值:Tag.SKIP_BODY表示标签之间的内容会被忽略
Tag.EVAL_BODY_INCLUDE表示标签之间的内容正常执行。
doEndTag:容器遇到自定义标签的结束标志时调用该方法,返回一个整数值,用来决定程序的后续流程
返回值:Tag.SKIP_PAGE表示立刻停止执行JSP网页,网页上未处理的静态内容和JSP程序均被忽略,任何已有的输出内容立刻返回到客户浏览器上
Tab.EVAL_PAGE表示按正常的流程继续执行JSP网页
javax.servlet.jsp.tagext.BodyTagSupport;
c.标签库的描述文件的后缀名:.tld,--->标准的xml文件,与web.xml文件必须在同一目录下。