博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

servlet总结

Posted on 2009-03-02 10:14  kalllx  阅读(476)  评论(0)    收藏  举报


Servlets
C/S--->client/service
优点:
1)运行效率较高
2)交互性强适合局域网,
缺点:升级维护困难
B/S-->WEB应用 browser浏览器 Service
优点:无需关心客户端,升级维护,只需操作服务器即可.比较方便.
缺点:
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:
http://192.168.1.250:8888/poll/login.jsp
协议://地址(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中 <Connector 加 URIEncoding="UTF-8"
 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)第一次访问的时候创建
 <load-on-startup>num</load-on-startup>(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中描述就可以完成监听器的工作.