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<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)