servlet总结1

servlet 总结ServletC/S--->Client/Server(客户机/服务器)优点:1)运行效率较高2)交互性强适合局域网,缺点:升级维护困难B /S -->Browser/Server

servlet 总结

Servlet

C/S--->Client/Server(客户机/服务器)

优点:

1)运行效率较高

2)交互性强适合局域网,

缺点:升级维护困难

B /S -->Browser/Server(浏览器/服务器)

优点:无需关心客户端, 升级维护, 只需操作服务器即可. 比较方便.

缺点:

1) 交互性是请求/响应式, 需要通过网络进行交互, 效率相对c/s架构的软件来说较低.

2) 要开发交互性较强的界面比较困难.

CGI:最早开发b/s架构的一门技术

从CGI 分出 1) 微软的ASP--->ASP.NET

2)JAVA 的Servlet--->jsp

开发技术:

静态网页技术:

HTML,JS,CSS

动态网页技术:(动态说的是数据动态)

CGI,ASP,ASP.net,servlet,php,jsp 等

url:

协议://地址(ip-->域名):端口(如果是80, 可以省略)/web应用名/资源名

web 服务器: (微软的)IIS:

(apache的)tomcat(开源的):等..

servlet:

1) 属于j2ee 的其中一个技术, 是一个规范

2)servlet 是一个web 组件(包含servlet 类和他的描述信息) 组件如java bean 可复用的

3)servlet 运行的时候就是一个java 对象(创建. 调用. 管理由web 服务器(web容器) 完成).web 容器是web 服务器的线程 tomcat 的web 容器是CATALINA

web 容器调用servlet 对象的方法

首先由web 容器创建两个对象:

,

1.HttpServletRequest:

包含了客户端提交的所以信息, 在servlet 中 , 可以通过这个对象获得客户端传递过来的数据.

2.HttpServletResponse:

通过这个对象可以向客户端返回数据

public void service(ServletRequest req,ServletResponse res){

}

web 应用的目录结构:

应用名:(web应用的根目录的名字)

WEB-INF(必须):浏览器不能直接访问

classes(存放.class 文件)

lib(存放第三方的.jar 文件)

web.xml(描述servlet, 包括类名和访问标识)

html/first.html

js/my.js

css/my.css

jsp/first.jsp

META-INF

tomcat 服务器的目录结构:

bin:存放一些可执行文件:比如startup.sh,shutdown.sh

common:存放tomcat 服务器和所以web 应用都可以使用的类和jar 包

conf:存放tomcat 服务器使用的一些配置文件. 比如 service.xml 中可改端口号

logs:存放tomcat 服务器和web 应用输出的日志信息的文件

server:存放一些只能由tomcat 服务器使用的类和jar 包, 以及tomcat 自带的web 应用 shared:存放一些只能由web 应用使用的类和jar 包

temp:存放一些临时文件

*webapps:用来部署web 应用

work:存放jsp 文件被翻译和编译以后的.java 和.class 文件.

web 工程(IDE):通过工程可创建web 应用

web 应用:(成品软件)

javax.servlet.Servlet(接口)

javax.servlet.GenericServlet(抽象类)

javax.servlet.http.HttpServlet(抽象类)(建议使用)

Service-->doGet/doPost(根据客户端请求方式调用, 不是非要同时调用)

,

tomcat 由于已经启动无法启动 用命令 ps -ef|grep tomcat 在kill -9 进程号

form 表单处理:

1. 提供表单

a) 提供一个html 页面包含一个form 表单

b) 提供一个servlet 返回一个form 表单

form 表单action 属性指定的路径

a) 相对路径

register

b) 绝对路径

/servlet/form/register

2. 中文乱码问题

a )get 方式提交

解决办法,在服务器中设置客户端提交请求的URI 的编码类型

在server.xml 中

b )post 方式提交

在server 中获得客户端提交的参数之前,调用req 对象的setCharacterEncoding 方法设定编码类型。 c )响应

在server 中获得输出流之前,调用response 对象的的setCharacterEncoding 方法设定编码类型。

3.method="get"和method="post" (form表单的两种提交方式比较)

get 请求:

a) 直接在浏览器地址栏输入请求的URL 发起的请求:

b) 点击一个超连接发起的请求

c) 提交一个form 表单但form 表单的method 不指定或指定get 的时候

特点:

提交的数据放在请求的头部, 一般在查询数据的时候我们会选择get 方法发起请求

post 请求:

a) 提交一个method 属性指定为post 的表单发起的请求.

特点:

提交的数据放在请求体部, 在向客户端提交数据的时候我们会选择使用post 方式发起请求.

4.request/response对象中的方法

,

request.getContextPath();返回web 的应用的根路径

request.getMethod();返回请求方式,get 或post

request.getParameterMap();获得客户端提交的所有参数, 包括参数名字和值 request.getParameterNames();获得客户端参数名字

request.getQueryString();返回URI 后面所跟着的参数 如果是post 方式提交返回null request.setCharacterEncoding("UTF-8");设定客户端提交的内容的编码类型

5.servlet 的url-pattern 的写法(补充)

a) 以"/"开始, 后面跟着具体的内容

b) 前通配(*) :如 *.do,*.action

c) 后通配 如: /form/*,/basic/*

Servlet 的生命周期(四个阶段)

1) 装载和实例化阶段

创建者:web容器

创建情况:

(1)第一次访问的时候创建

num(num默认为-1)

当num<0时, 第一次访问时创建servlet 实例

(2)web应用被安装的时候创建(启动服务器)

当num >=0时,servlet 在web 应用被安装的时候创建

创建顺序:

num=0,最晚被创建

num>0,值越小越早被创建

2) 初始化阶段

调用者:web容器

public void init(ServletConfig config){}

在GenericServlet 中已经对有参的init 方法作了实现

public abstract class GenericServlet implement Servlet{

private ServletConfig config;

public void init(ServletConfig config){

this.config=config;

this.init();

}

public void init(){

,

}

}

3) 服务阶段

调用者:web容器

public void service(ServletRequest req,ServletResponse res){

}

在HttpServlet 中已经对service 方法作了实现

public abstract class HttpServlet extends GenericServlet{

public void service(ServletRequest req,ServletResponse res){

HttpServletRequest hReq=(HttpServletRequest)req;

HttpServletResponse hRes=(HttpServletResponse)res;

service(hReq,hRes);

}

public void service(HttpServletRequest hReq, HttpServletResponse hRes){ String method=hReq.getMethod();

if(method.equals("GET")){

doGet(hReq,hRes);

}else if(method.equals("POST")){

doPost(hReq,hRes);

}

}

//被子类覆盖

public void doGet(HttpServletRequest request, HttpServletResponse response) {

}

//被子类覆盖

public void doPost(HttpServletRequest request, HttpServletResponse response){

}

}

4) 销毁阶段

调用者:web容器

public void destory{

}

注:init(),service(),destroy()称为servlet 对象的生命周期回掉方法.

web 应用的逻辑分层:

model(模型):

javabean,ejb..

view(显示):

servlet,jsp 等

,

control(控制):

servlet,jsp....

请求的转发:

1) 服务器内部跳转

请求转发器:RequestDispather

创建:

1. 调用request 对象的方法

指定的转发路径可以相对也可以是绝对的

相对路径:根据当前servlet 的路径和转发的路径进行计算

绝对路径:就是转发的servlet 的url-pattern

2. 调用servletContext 对象的方法

指定的路径必须是绝对路径

forward:

在转发请求之前首先调用response 对象的resetBuffer 方法, 清空缓存.

include(包含):

将请求转发到其他servlet 之前不会清空缓存

2) 服务器外部重定向

RedirectServlet

通过服务器外部重顶向进行请求的转发 里面的路径可以相对可以绝对

绝对路径写法: 应用根路径 servlet的url-pattern

例:response.sendRedirect(request.getContextPath() "/resource/view");

相对路径写法:例:response.sendRedirect("view");

服务器内部跳转和服务器外部重定向的比较

1) 服务器内部跳转所有的servlet 共享同一个请求, 而服务器外部重定向, 每个Servlet 接受的请求都不相同

2) 服务器内部跳转是在服务器实现的, 而服务器外部重定向是由浏览器实现的

3) 服务器内部跳转是通过request 对象来完成的, 而服务器外部重定向是通过response 对象来完成的. 作业:

1.findUser.html

2.FindUserServlet:

1. 负责接收客户端查找用户的请求

2. 调用UserMange 的findUser(String name)

3. 将找到的User 对象交给ViewUserServlet 显示

ViewUserServlet

,

1. 首先判段有没有需要显示的user, 如果没有 提示

2. 如果有, 则将用户的详细信息进行显示

3. 在UserManager 中提供查询用户的方法.

Context ctx=new InitialContext();

DataSource ds=(DataSource)ctx.lookup(jndiName);

通过jndi 从目录服务器上查找DataSource 对象

DataSource( 连接池);

06 02 2008 JNDI:java name directory interface

创建DataSource 对象

1. 通过new 的方式创建.

2. 通过web 服务器提供的配置的方式, 来创建DataSource(这种方式创建的DataSource 已经存放在目录服务器上).

1) 将oracle 的驱动包放入到tomcat 的common/lib目录下

2)JNDI Name:jdbc/ds

数据库的URL Data Source URL:jdbc:oracle:thin:@192.168.1.220:1521:briupdb

数据库驱动名:JDBC Driver Class:oracle.jdbc.driver.OracleDriver

数据库用户名:User Name:jd0804

数据库用户密码:Password:jd0804

最大活动的连接数:Max. Active Connections:

Max. Idle Connections:(当连接池没有连接的时候, 再创建的连接数)

使用DataSource

1. 如果是通过new 的方式创建的DataSource, 可以直接调用他的getConnection 方法来获得连接

2. 通过jndi 访问目录服务器, 查找DataSource, 调用方法获得连接.

ch05 状态持久。

为什么需要状态持久?

因为http 协议是无状态的, 客户端发起一个请求的时候, 会跟服务器建立socket 连接, 一旦响应, 就会关闭socket 连接, 所以为了让服务器端知道某个客户端的状态信息, 我们需要将状态进行持久化

cookie

创建: name value

,

Cookie cookie = new Cookie("isLogin", "true");

cookie.setMaxAge(time);

response.addCookie(cookie);

当time<0,表示cookie 保存在浏览器进程中, 一旦浏览器进程结束,cookie 就消失

当time=0,表示删除客户端同名的cookie

当time>0,表示cookie 将在浏览器端保存起来, 超过time 后才会消失

获取:

Cookie[] cookies=request.getCookies();

session(结合cookie 使用):创建和保存都在服务器端

由web 服务器维护

HttpSession session = request.getSession();

或者

HttpSession session = request.getSession(boolean create);

当create==true时, 这个方法的作用跟无参的getSession()方法作用一样

当create==false时, 这个方法的作用是:根据客户端传递过来的session 的id, 寻找服务器端的session, 如果找到返回, 如果没有找到, 返回null;

String ID=session.getId();

session.setAttribute("isLogin", true);

当对客户端作出响应的时候,会将session 的ID 包装成一个cookie 对象(名字为JSESSIONID ,值为session 的id ),返回给客户端

HttpSession 消失的情况:

1)web 应用停止

2) 超时(上一次访问开始的时间到当前时间, 如果这个时间超过了指定的超时时间, 那么就认为是超时了) 可在web.xml 中可配置session 的超时时间:

3) 调用session 对象的invalidate 方法

通过URL 重写解决cookie 禁用sesion 不能访问的问题:

当客户端禁用cookie 之后,无法通过cookie 保存session 的id 我们可以通过URL 重写来保存session 的id url ;jsessionid=HJGKJWBDRUWRGW

String oldUrl = "sessionCheck";

String newUrl = response.encodeURL(oldUrl);// encodeUrl已不建议使用

三个范围(scope )

requestScope(ServletRequest):在多个servlet 之间进行服务器内部跳转的时候,我们可以通过将数据放在request 对象中进行数据的传递。

,

request.setAttribute(key,value);

Object value=request.getAttribute(key);

request.removeAttribute(key);

sessionScope(HttpSession):session中一般存放一些状态信息,或者在整个会话中经常要使用的数据(不建议存放过多数据(影响服务器效率))

session.setAttribute(key,value);

Object value=session.getAttribute(key);

session.removeAttribute(key);

applicationScope(ServletContext):ServletContext一般存放整个系统运行过程中,经常要使用的数据 ctx.setAttribute(key,value);

Object value=ctx.getAttribute(key);

ctx.removeAttribute(key);

过滤器:Filter

web 应用的事件的处理机制

1. 事件源

web 容器

2. 事件对象:由web 容器创建

在web 应用启动和停止的时候产生:ServletContextEvent 在javax.servlet 包中

会话开始和结束的时候产生:HttpSessionEvent 在javax.servlet.http 包中

请求开始和结束的时候:ServletRequestEvent

对application 范围中的数据操作的时候产生:ServletContextAttributeEvent

对session 范围内的数据进行操作的时候产生: HttpSessionBindingEvent

对requset 范围中的数据操作进行操作的时候产生: ServletRequestAttributeEvent

3. 监听器

处理ServletContextEvent 事件对应ServletContextListener 接口(执行时间:web应用启动和停止) 处理HttpSessionEvent 事件 HttpSessionListener 执行时间:session(会话) 开始和结束

处理ServletRequestEvent 事件 ServletRequestListener 执行时间:请求的开始和结束

处理ServletContextAttributeEvent 事件 ServletContextAttributeListener

执行时间:加入数据, 删除数据, 替换数据

HttpSessionBindingEvent HttpSessionAttributeListener 执行时间:加入数据, 删除数据, 替换数据 ServletRequestAttributeEvent ServletRequestAttributeListener

执行时间:加入数据, 删除数据, 替换数据

注册监听器:在web.xml 中描述就可以完成监听器的工作.

,

一、 过滤器 Filter

1. why Filter?

针对通用WEB 服务、功能,透明的处理

2. 什么是 Servlet Filter?

过滤是 Servlet 2.3 版才引入的新特性。过滤器可以认为是实现 Http 请求、响应以及头信息等内容的传送的代码片断。

过滤器并不能创建响应,但它可以“过滤”传给 servlet 的请求,还可以“过滤”从 servlet 发送到客户端的响应;

它不仅能处理静态内容,还可以处理动态内容。换而言之,filter 其实是一个“servlet chaining”(servlet 链) 。 一个 filter 包括:

1) 在 servlet 被调用之前截获;

2) 在 servlet 被调用之前检查 servlet request;

3) 根据需要修改 request 头和 request 数据;

4) 根据需要修改 response 头和 response 数据;

5) 在 servlet 被调用之后截获.

3. 过滤器的生命周期

Filter 组件的生命周期与 Servlet 的类似。

过滤器有四个阶段(与servlet 类似) :

1) 实例化;

2) 初始化(调用init()方法);

3) 过滤(调用doFilter()方法);

4) 销毁(调用destroy()方法);

4. Filter编程

1) 定义Filter(implements Filter)

2) 配置Filter

配置对哪些资源进行过滤(url)

Logger //过滤器名

com.LoggerFilter //具体过滤器类

//初始化参数

xsltfile

/xsl/stockquotes.xsl

标签: