Web服务器
Weblogic(Oracle)
WebSphere(IBM)
JBoss(Redhat)
以上产品均收费,支持J2ee规范
Tomcat(Apache)
免费产品,仅支持部分J2ee规范
Tomcat
Tomcat是Apache的Jakarta项目中的一个核心项目,Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,实际上Tomcat部分是Apache服务器的扩展,但它是独立运行的,所以当你运行tomcat时,它实际上作为一个与Apache独立的进程单独运行的。
常见问题:
(1)闪退:tomcat软件启动时会默认在环境变量中寻找一个JAVA_HOME的变量,若没有,则启动失败,闪退。
(2)端口占用:tomcat启动时所需要的端口被其它程序占用。修复办法是修改conf/server.xml,修改相关选项的port。
(3)项目主目录错误:tomcat在启动的时候会在环境变量中寻找CATALINA_HOME,并按照其值加载相关文件。
Http协议(超文本传输协议)
HTTP是一个基于请求与响应模式的、无状态的、应用层的协议。
HTTP是建立在tcp/ip协议的基础上的,它多了一层数据传输格式是否规范的处理。也就是说它是对浏览器客户端和服务器之间数据传输格式的规范。
HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。
名词:
URL:统一资源定位符,只能用于定位互联网信息。是URI的子集。
URI:统一资源标记符,可用于定位本地、局域、互联网资源。
提交方式:
POST:这是一种安全的提交方式,提交内容会跟在请求实体内容后面,对于提交数据的大小没有要求,使用队列方式处理提交是的数据。
GET: 这是一种不太安全的提交方式(浏览器默认资源请求方式),提交内容跟在地址栏请求后面,要求提交数据大小<2k。
HTTP请求
Accept: text/html,image/* -浏览器接受的数据类型
Accept-Charset: ISO-8859-1 -浏览器接受的编码格式
Accept-Encoding: gzip,compress -浏览器接受的数据压缩格式
Accept-Language: en-us,zh- -浏览器接受的语言
Host: www.it315.org:80 -当前请求访问的目标地址(主机:端口)
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT -浏览器最后的缓存时间
Referer: http://www.it315.org/index.jsp -当前请求来自于哪里
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) --浏览器类型
Cookie:name=eric -浏览器保存的cookie信息
Connection: close/Keep-Alive -浏览器跟服务器连接状态。close: 连接关闭 keep-alive:保存连接。
Date: Tue, 11 Jul 2000 18:23:51 GMT -请求发出的时间
HTTP响应
Location: http://www.it315.org/index.jsp -表示重定向的地址,该头和302的状态码一起使用。
Server:apache tomcat -表示服务器的类型
Content-Encoding: gzip -表示服务器发送给浏览器的数据压缩类型
Content-Length: 80 -表示服务器发送给浏览器的数据长度
Content-Language: zh-cn -表示服务器支持的语言
Content-Type: text/html; charset=GB2312 -表示服务器发送给浏览器的数据类型及内容编码
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT -表示服务器资源的最后修改时间
Refresh: 1;url=http://www.it315.org -表示定时刷新
Content-Disposition: attachment; filename=aaa.zip -表示告诉浏览器以下载方式打开资源(下载文件时用到)
Transfer-Encoding: chunked
Set-Cookie:SS=Q0=5Lb_nQ; path=/search -表示服务器发送给浏览器的cookie信息(会话管理用到)
Expires: -1 -表示通知浏览器不进行缓存
Cache-Control: no-cache
Pragma: no-cache
Connection: close/Keep-Alive -表示服务器和浏览器的连接状态。close:关闭连接 keep-alive:保存连接
状态响应码
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
Servlet
Servlet是工作在服务器端的java程序。
开发方式:
实现Servlet接口:可明显看出servlet声明周期,要重写5个方法
继承GenericServlet类,重写service()方法
继承HttpServlet类,重写doGet()和doPost()方法,可以讲用户请求按照提交方式做不同处理。
映射路径:
url-pattern 要么以/开头,要么以*开头。
url-pattern 不能同时使用两种匹配模式。
url-pattern 中的URL在多个servlet同时被匹配的情况下:精确匹配优先级最高,以后缀名匹配的方式优先级最低。
声明周期:
构造方法():servlet对象创建时调用
init():第一次访问时调用
service():每次访问时调用
destory():servlet对象销毁是调用
自动加载:
servlet默认在第一次访问时创建对象,这样会导致第一次访问缓慢,为解决这个问题,
可以修改web.xml的<servlet>元素,将servlet对象的创建时间提前至web.xml加载时。
<load-on-startup>$num</load-on-startup>
这里的$num越大,创建优先级越低
线程安全问题:
问题描述:servlet是单实例多线程的,这种机制在多个线程访问共享数据时就存在线程安全问题。
解决方案:将使用共享数据的部分代码加锁。
Request:通过HttpServletRequest对象获取http请求信息
请求行:
getRequestURL():URL
getRequestURI():URI
getMethod():请求方式
getProtocol():版本协议
请求头:
getHeader(String key):根据头名称获取头内容
getHeaderNames():得到所有的请求头名称,返回一个Enumeration迭代器
实体:
getInputStream():以输入流的方式读取实体内容(针对POST提交)
getQueryString():接受地址栏的数据(针对GET方式)
getPapameter(String key):获取指定key的value,但是只可以用于一个返回值的情况
getParameterValues(Sting key):获取指定key的value,可以用于多个返回值的情况
getParameterNames():得到所有的请求参数名称,返回一个Enumeration。
设置字符集,解决编码问题:
方式一:
setCharacterEncoding("utf-8");
方式二:手动解码
new String(req.getParameter($key).getBytes("iso-8859-1"),"utf-8");
方式三:更改整个tomcat的编码集
<connector ... >最后加上URLEncoding="utf-8"
Response:通过HttpServletResponse对象设置http请求信息
响应行:
setStatus(int num):响应码
响应头:
setHeader(String key,String value)根据键值对设置响应头
setContentType("text/html;charset=utf-8") 设置浏览器解析格式及编码
实体:
getoutputStream().write() 可以发送字符或者字节内容内容
getWriter().write() 只可发送字节内容,但是效率比较高
注意:getWriter和getOutputStream二者只能选其一,调用了其中一个就不能调用另一个了
sendRedirect(String url):请求重定向
ServletConfig:用于加载servlet中的初始化参数,在GenricServlet中已经创建,通过getServletConfig()即可获取到
ServletContext getServletContext():获取servlet上下文
String getInitParameter(String name):根据初始化参数名字得到对应的值
Enumeration<String> getInitParameterNames():获取所有参数的名字
初始化参数的配置:配置在web.xml中
<servlet>
<init-param>
<param-name>name</param-name>
<param-value>value</param-value>
</init-param>
</servlet>
ServletContext:servlet上下文对象,代表当前web应用程序,一个应用只有一个servletContext,加载web应用是创建,关闭主机时销毁。
本对象可以通过getServletConfig()方法得到,本质上使用getServletConfig().getServletConetxt()得到。
常用API:
getContextPath():获取web应用路径
String getInitParameter(String name):根据初始化参数名字得到对应的值
Enumeration<String> getInitParameterNames():获取所有参数的名字
初始化参数的配置:
<context-param>
<param-name></param-name>
<param-value></param-value>
</context-param>
ServletContext是一个作用于整个web应用的域对象,可以用于在多个servlet之间传递参数。
setAttribute(String key,Object value):添加
getAttribute(String key):查找
removeAttrtibute(String key):移除
RequestDispatcher getRequestDispatcher(String uri):url转发
一般与forward(request,response)连用用于转发
资源获取路径:
在java项目中,相对路径中的.代表当前路径
在javaweb项目中,相对路径中的.代表当前应用的jvm启动路径。
web项目中加载资源的方式是
String getRealPath(String uri):获取资源的绝对路径字符串形式
InputStream getResourceAsStream():获取资源的输入流
关于转发(sendRedirect)与转向(forward)的异同:
(1)转发和转向都可以实现页面的跳转。
(2)转发是地址栏会发生变化,转向时地址栏不会发生变化。
(3)sendRedirect由response对象调用,forward有RequestDispatcher对象调用。
(4)转发的原理是浏览器重新发起url请求,转向是在服务器端直接跳转。
(5)转发对请求资源范围没有要求,转向的请求资源范围只能是本应用下的。
(6)转向发生在一次url请求中,转发是重新开启一次url请求。
Cookie会话技术
Cookie会话是客户端技术,是服务器保存在客户端的信息文件,同一台客户端默认是用共同的cookie区。
常用API:
创建:
Cookie cookie = new Cookie(String name,String value);
设置cookie相关参数:
setMaxAge(int seconds):存活时间,默认是随着浏览器关闭而灭亡
正整数:将cookie信息保存在浏览器的缓存目录中,数值表示存留时间,单位是s
负整数:将cookie信息保存在浏览器的内存中,随浏览器关闭而消失。
0:删除同名cookie
setpath(String uri):有效访问路径(默认为当前应用),保证不同资源之间的cookie共享
写到浏览器:
response.addCookie(cookie):底层是通过http响应的Set-Cookie实现
读取:
Cookie[] request.getCookies():底层是读取http请求的Cookie实现的
获取cookie信息
getName():获取cookie名称
getValue():获取cookie值
注意细节:
(1)cookie是创建、读取在服务器,保存在客户端的文件。
(2)cookie内部是一个类似于表格,以键值对形式存储数据的。
(3)cookie只能保存简单的字符串数据信息。
(4)cookie如果发生重名,后面的cookie会替换前面的。
(5)浏览器默认保存不超过300个cookie,每个站点不超过20个,每个大小不超过4KB
(6)cookie无法存放中文字符,
Session会话技术
Session会话技术是服务器端技术,服务器会为每一个浏览器创建一个独享的session对象,并将一个JSessionID发送给浏览器作为浏览器以后每次访问的凭证。
常用API:
getSession(boolean):获取
boolean:true或者不写表示session存在返回,不存在就创建再返回;false表示存在就返回,不存在就返回null
invalidate():注销
setAttribute(String name.Object value):添加属性
getAttribute(String name):获取值
removeAttribute(String name):移除属性
setMaxInactiveInterval(int minutes):设置session生命周期
session的默认生命周期为30min,也可以通过配置文件来调整:<session-timeout>$minutes</session-timeout>
注意细节:
(1)session的实现是基于cookie的,所以其生命周期会受到cookie的影响。
(2)如果客户禁用了cookie,就会导致session失效,这是要用到URL重写(就JSESSION写到URLdizhilan来传输)
response.encodeRedirectURL(String url)
response.encodeURL(String url)
JSP
这是Sun公司推出的一款包装版的Servlet技术,主要用于网页的开发。
页面访问流程:
(1)如果是第一次访问或者服务器文件发生了改动,走第(2)步;否则,走第(5)步;
(2)将jsp翻译成.java文件(Servlet文件);
(3)将.java文件编译成.class文件;
(4)将class文件加载到内存,创建对象;
(5)执行service()方法,将页面回显给浏览器.
语法:
注释:
<%-- --%>:jsp注释,推荐使用
<!-- -->:html注释
脚本:
<% %>:用于在jsp中嵌入java代码
声明:
<%! %>:用于声明变量或者函数,声明的函数或者变量是成员属性。
表达式:
<%= %>:相当于out.write()
指令:<%@ %>
>include:在当前页面引入其它页面内容,这里是静态引入,它会将其它文件的内容原封不动的全部引入到本文件,然后合并翻译成一个文件返回给浏览器。
file:指定引入源文件
>targlib:
prefix:指定标签前缀
uri:路径
>page:
language="java" --告诉服务器使用什么动态语言来翻译jsp文件
import="java.util.*" --告诉服务器java文件使用什么包,导入包,多个包之间用逗号分割
pageEncoding="utf-8" --告诉服务器使用什么编码翻译jsp文件(成java文件)
contentType="text/html; charset=utf-8" 服务器发送浏览器的数据类型和内容编码
errorPage="error.jsp" --指定当前jsp错误处理页面
我们一般习惯是在web.xml里面使用全局配置,而不是直接在jsp里面指定错误页面
<error-page>
<error-code>$num</error-code>
<location>$pathToErrorPage</location>
</error-page>
isErrorPage="false" --指定当前页面是否为错误处理页面,在处理页面可以拿到execption对象
buffer="8kb" --out对象的缓存区大小
session="true" --是否对当前页面开启session
isELIgnored="false" --是否忽略EL表达式
9大内置对象:
由jsp进行过初始化的servlet API实例,可以在jsp中直接使用:
request--->HttpServletRequest
response-->HttpServletResponse
config---->SevletConfig
application-->ServletContext
session--->HttpSession
exception-->throwable
page---->Object(this)
out---->jspWriter:
这是一个带缓冲的PrintWriter,使用它作为输出对象时,会先将数据写入缓存区,等满足一定条件后再输出到浏览器:
条件1:缓存区满了时
2:关闭缓存区时
3:调用了flush()方法手动刷出时
4:jsp加载完成时
pageContext-->PageContext
pageContext的对象是PageContext,称作jsp上下文,一般有两个作用:
(1)从这个内置里面获取其它8个内置对象
(2)本身也是一个域对象,用来共享数据
保存数据:
setAttribute(String name,Object value,Scope scope):可以向四个域对象保存数据,如不指定,默认保存在page域
获取数据:
getAttribute(String name,Scope scope):可以从指定域对象获取数据,如不指定,默认使用在page域
清除数据:
removeAttribute(String name,Scope scope):可以从指定域对象清除数据,如不指定,默认使用在page域
域范围常量:
PageContext.PAGE_SCOPE page(当前页)
PageContext.REQUEST_SCOPE reques(当前请求)
PageContext.SESSION_SCOPE session(当前session)
PageContext.APPLICATION_SCOPE application(当前web应用)
自动在四个域中搜索数据:pageContext.findAttribute(String name);
顺序:page域 -> request域 -> session域- > context域(application域)
EL表达式:
向浏览器输出域对象中的变量值或表达式计算的结果(用于替换jsp中的<%= %>)
语法:
输出简单数据:${变量或表达式}
${name}================>pageContext.findAttribute(name)
${scope.name}==========>pageContext.getAttribute(name,scope)
输出对象:${对象.属性}
${class.name}==========>pageContext.getAttribute(class).getName()
输出集合:${list[i]}
${list[i]}=============>pageContext.findAttribute(class).get(i)
表达式计算
标签:
(1)内置标签:
无需向jsp页面导入标签库
<jsp:forward>转发标签
page:转发的目标地址
<jsp:param>参数
name:参数名
value:参数值
<jsp:include>动态包含,包含和被包含文件分开编译,生成两个文件
file:被包含文件位置
(2)JSTL标签:
核心标签库的重点标签:
保存数据:
<c:set></c:set>
var:名字
value:值
scope:指定保存的域,默认是pageContext
获取数据:
<c:out></c:out>
value:输出值
default:默认值
eacapeXml:是否对value值进行转义
单条件判断
<c:if></c:if>
test:判断条件
多条件判断
<c:choose>
<c:when test=""></c:when>可存在多个,但是判断条件不要出现交集
<c:otherwise></c:otherwise>
</c:choose>
循环数据
<c:forEach items="数据源" var="目标" begin="开始点" end="结束点" step="步长">
index:迭代索引值()
conut:迭代次数()
varStatus:当前正在迭代的状态对象
first:是否是第一个
last:是否是最后一个
</c:forEach>
<c:forTokens items="数据源" delims="分隔符" var="目标">
</c:forTokens>
重定向
<c:redirect></c:redirect>
(3)自定义标签:
过滤器
Filter使得开发人员可以对web服务器管理的所有web资源进行拦截,然后对公共资源进行一些统一处理。
开发Filter:
1)开发一个过滤器需要将一个类实现Filter接口,并实现其方法。
2)FilterAPI:
void init(FilterConfig f); 初始化方法,在服务器启动时候执行
void doFilter(Request req,Response resp,FilterChain chain);过滤器拦截的业务处理方法
void destroy()销毁过滤器实例时候调用
Filter生命周期:
和Servlet一样Filter的创建和销毁也是由WEB服务器负责。
1)在应用启动的时候就进行装载Filter类(与Servlet的load-on-startup配置效果相同)。
2)容器创建好Filter对象实例后,调用init()方法,然后被Web容器保存进应用级的集合容器中去等待着调用。
3)当用户访问的资源正好被Filter的url-pattern拦截时,容器会创建Filter类对象,调用doFilter方法,后面访问被拦截的资源时,Web容器会直接使用第一次创建Filter对象实例调用doFilter方法(Filter对象常驻留Web容器了)。
4)当应用服务被停止或重新装载了,则会执行Filter的destroy方法,Filter对象销毁。
配置Filter:
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>cn.asop.demo.HelloFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
拦截配置:
(1)根据请求的url拦截:
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
<url-pattern>/*.jsp</url-pattern>
<url-pattern>/Myservlet</url-pattern>
</filter-mapping>
(2)根据请求类型拦截:
<filter-mapping>
<dispatcher>REQUEST</dispatcher>//如果目标是直接访问时,该过滤器将被调用
<dispatcher>FORWARD</dispatcher>//如果目标资源是通过RequestDispatcher的forward()方法访问时,该过滤器将被调用
<dispatcher>INCLUDE</dispatcher>//如果目标资源是通过RequestDispatcher的include()方法访问时,该过滤器将被调用
<dispatcher>ERROR</dispatcher>//如果在jsp页面page指令中指定了error属性,那么jsp中若出现了异常,在跳转时,该浏览器将被调用。
</filter-mapping>
(3) 根据servlet-name拦截:
<filter-mapping>
<servlet-name>/index</servlet-name>
</filter-mapping>
注意细节:
Filter执行准则:先以此执行每一个Filter的chain.doFilter()之前的部分,再去执行后面的Servlet,然后再一次倒序执行每一个Filter的chain.doFilter()之后的部分;
Filter在执行init()时可以通过FilterCionfig获取web.xml中的初始参数:filterConfig.getInitParameter(String key)
监听器
Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。
监听器类型:
监听request:
监听request对象的创建或销毁:ServletRequestListener
监听request属性的增删改:ServletRequestAttributeListener
监听session:
监听session对象的创建或销毁:HttpSessionListener
监听session属性的增删改:HttpSessionAttributeListener
监听servletContext:
监听servletContext对象的创建或销毁:ServletContextListener
监听servletContext属性的增删改:ServletContextAttibuteListener
session相关监听器
HttpSessionBindingListener 监听对象绑定(接触)session上的事件
这个监听器用于监听session中存取对象,跟其他监听器不同之处是:
(1)它不用在web.xml中生明监听器;
(2)它需要被监听的对象来实现这个接口,并实现其方法;
HttpSessionActivationListener(了解) 监听session序列化及反序列化的事件