javaWeb

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对象的创建时间提前至web.xml加载时。

$num

这里的$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的编码集

最后加上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 getInitParameterNames():获取所有参数的名字

初始化参数的配置:配置在web.xml中

  name

  value

ServletContext:servlet上下文对象,代表当前web应用程序,一个应用只有一个servletContext,加载web应用是创建,关闭主机时销毁。

本对象可以通过getServletConfig()方法得到,本质上使用getServletConfig().getServletConetxt()得到。

常用API:

getContextPath():获取web应用路径

String getInitParameter(String name):根据初始化参数名字得到对应的值

Enumeration getInitParameterNames():获取所有参数的名字

初始化参数的配置:

 

 

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,也可以通过配置文件来调整:$minutes

注意细节:

(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里面指定错误页面

$num

$pathToErrorPage

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页面导入标签库

转发标签

page:转发的目标地址

参数

name:参数名

value:参数值

动态包含,包含和被包含文件分开编译,生成两个文件

file:被包含文件位置

(2)JSTL标签:

核心标签库的重点标签:

保存数据:

var:名字

value:值

scope:指定保存的域,默认是pageContext

获取数据:

value:输出值

default:默认值

eacapeXml:是否对value值进行转义

单条件判断

test:判断条件

多条件判断

可存在多个,但是判断条件不要出现交集

循环数据

index:迭代索引值()

conut:迭代次数()

varStatus:当前正在迭代的状态对象

first:是否是第一个

last:是否是最后一个

重定向

(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:

MyFilter

cn.asop.demo.HelloFilter

MyFilter

/*

拦截配置:

(1)根据请求的url拦截:

MyFilter

/*

/*.jsp

/Myservlet

(2)根据请求类型拦截:

REQUEST//如果目标是直接访问时,该过滤器将被调用

FORWARD//如果目标资源是通过RequestDispatcher的forward()方法访问时,该过滤器将被调用

INCLUDE//如果目标资源是通过RequestDispatcher的include()方法访问时,该过滤器将被调用

ERROR//如果在jsp页面page指令中指定了error属性,那么jsp中若出现了异常,在跳转时,该浏览器将被调用。

(3) 根据servlet-name拦截:

/index

注意细节:

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序列化及反序列化的事件

你可能感兴趣的:(javaWeb)