servlet知识详解

来源:互联网 发布:怀化学院教育网络系统 编辑:程序博客网 时间:2024/05/29 03:10

基础概念  sun提供的用于开发动态web资源的技术

动态web资源的运用:

1.编写一个java类,实现servlet 接口 ,这个实现了servlet接口的程序我们就称其为 servlet
2.将开发好的java类部署至web服务器


servlet的运行过程,周期:

我们可以用如下 图示来描绘servlet从接受请求到销毁的过程

  

servlet生命周期:从创建到死亡

servlet生命周期方法
  准备条件:servlet创建   构造方法
  1.servlet创建出来之后,需要调用init方法
  2.servlet用于处理客户端请求,处理请求调用service方法
  3.servlet死亡的时候需要调用destroy方法
     servlet死亡:服务器关闭  该servlet所在的web应用被服务器移除掉

这些方法何时调用
  init()方法:第一次发送请求时,创建servlet对象并调用init方法  只调用一次
  service()方法:每发送一次请求都调用一次   调用多次
  destory()方法:服务器关闭  该servlet所在的web应用被服务器移除掉   只调用一次


HttpServlet类的方法比较
  service()不管发送的是什么请求(get/post)都会调用该方法。在该方法内默认会去判断你请求的类型,然后去调用对应的方法。
  doGet()处理get请求。 
  doPost()处理post请求 

servlet和jsp:

  1.首先,jsp是servlet的一种特殊形式,jsp中的<% %> 相当于servlet代码

  2.  简单地说 servlet是直接执行的文件,jsp是要被通过编译形成servlet后才执行。

   jsp是servlet技术的扩展,servlet的应用逻辑在java文件中,并且完全从表示层的html中分类里分离出来

 jsp是servlet和html组成的jsp文件,侧重于视图。serlvt侧重于控制逻辑。
结合实例具体介绍

第一个servlet程序:
  第一步:创建web应用,并且写好结构  WEB-INF   classes   
  第二步:写一个servlet  java程序
 
    package com.qiyue.servlet;import javax.servlet.http.*;import javax.servlet.*;import java.io.*;public class FirstServlet extends HttpServlet{  protected void service(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{      resp.getOutputStream().write("helloworld".getBytes());       }}


  将servlet-api.jar包添加到classpath环境变量中  set classpath=xxx 
编译生成.class文件 javac -d . FirstServlet.java

   第三步:写web.xml配置文件(参考conf/web.xml)

       【由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,

    必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。
       】

  
   <?xml version="1.0" encoding="ISO-8859-1"?><web-app xmlns="http://java.sun.com/xml/ns/javaee"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  version="3.0">     <servlet>        <servlet-name>f</servlet-name>        <servlet-class>com.qiyue.servlet.FirstServlet</servlet-class>    </servlet>    <servlet-mapping>        <servlet-name>f</servlet-name>        <url-pattern>/First</url-pattern>    </servlet-mapping></web-app>


  第四部:启动运行
     http://localhost:8080/web应用名字/请求名    
    http://localhost:8080/first/First
   


http://localhost:8080/second/a.html:伪静态资源   实际上是某个servlet的url配置成了/a.html
http://localhost:8080/second/demo/a.html
一个servlet可以映射到多个url地址上去

注意:
同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名。 
在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:一种格式是“*.扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾。这两种格式不能混用


Servlet映射关系
 当地址栏中的地址能够匹配多个url地址时规则如下:
  1.长得像的优先匹配
  2.*开头的优先级低


标记接口:接口中没有方法
   SingleThreadModel,Cloneable,Serializable

    SingleThreadModel 标记接口:产生多个servlet对象,调用不同的对象,即一次请求创建一个servlet实例

    规则:servlet尽量减少共享资源 session cookie

反思:Iterator :hasNext方法调用一次,next方法也只能调用一次


dopost 与doget方法的复写: dopost方法中写入信息,doGet方法调用doPost(req,resp)即可。


servlet的几大对象及方法:

servlet是服务端的组件,servlet运行在servlet容器中,比如tomcat,在收到客户端请求的时候,容器把请求信息封装为Request对象,并创建Response对象,传给servlet的service()方法,真正要实现的功能可以在service()调用java代码。 
  说到这些,就不能不提一下几个内建对象的作用范围。

 Request和Response对象:

       时间上再一次请求中,在这次请求中把Request中的信息传给别的资源,空间上只能是发送请求的客户端有效  

ServletConfig

       有效范围: 只作用于该servlet  servlet配置信息中附带了一些初始化信息,通过该对象的得到 getServletConfig()

servletContex

       作用域:作用于该web应用  web附带的一些初始化信息 通过该对象得到

如何得到 ServletContext对象:servlet.getServletContext()getServletConfig().getServletContext()

如何实现servlet之间的通信:servletContext.setAttribute() /getAttribute()/removeAttribute(
ServletConfig:对象只在当前Servlet中有效
ServletContext:对象在web应用有效

   在同一个web应用中传递信息

    servlet得到资源文件:getRealPath()     getResourceAsStream()
   普通的java类得到资源文件:类名.class.getClassLoader().getResourceAsStream().....
   

实现web应用之间的通信:getContext("/xxx");    有问题


Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。

Response:

  主要方法:

         getStatus  返回执行状态         addHeader(String header,null) 添加响应头

               encodeUrl()   转发时遇到         sendRedirect 重定向               setStatus  设置状态码

**** add 与set区别: add永远是添加一个头,set如果没有则添加 如果有则替换

****导入超链接      :resp.getOutPutStream().write("<a href ='#'>click</a>".getBytes);

                        写入中文:resp.setHeader("content-type","text/html;charset=utf-8"); //告诉浏览器以utf-8打开页面

                                          c.write("<a href ='#'>点击</a>".getBytes("utf-8")); //以utf-8对文字编码

       解决乱码问题 :

                1.输入时将码转换为浏览器默认的编码

                           

String message = new String ("你好".getBytes("gbk"),"iso-8859-1");resp.getWrter().write(message);

                2.前页形成 两头全部设置为指定的编码格式

resp.setCharacterEncording("utf-8");resp.setHeader("content-type","text/html;charSet = utf-8");resp.getWriter().writer("你好");
         

          resp.getOutPutStream()和 resp.getWriter()只能选一种使用

 

Request:

  主要方法:

                      getParameter     name = a&password = 5

                      getParameterNames  names              name =a&name=b

                       getParameterValue  返回相同名的值的集合      

     信息想要在后台获得需要的条件

           1.要提交的数据必须包含在form表单中

            2.指定name属性,有的还要指定value属性(单选、复选、下啦、hidden)    

     request域对象:作用范围在当前请求中有效 ,在转发时遇到

     getAttribute()  域有关,getAttribute 方法之前必须要先setAttribute

      getParameter()读取form表单中的内容

注意:请求转发和使用流输送数据只能使用一个

      resp.getwriter().write("adasd");resp.flushBuffer;    req.getRequestDispatcher(”/index.jsp“)forward(req,resp);            X

乱码问题

默认浏览器是以gb2312的编码方式解析数据。网络上传输数据默认是iso-8859-1(latin)的方式发送数据。

下面列举 几种主要的编码方式

iso-8859-1   gb2312   gbk   utf-8   utf-16   ascii   gb2312   gbk

解决方法

response.getOutputStream()解决中文乱码问题:

  告诉浏览器以什么编码解析数据

response.setHeader("content-type","text/html;charset=utf-8");

response.getWriter()解决中文乱码问题:
 方式一:
 控制response以什么编码方式发送数据

response.setCharacterEncoding("utf-8");


 告诉浏览器以什么编码解析数据
response.setHeader("content-type","text/html;charset=utf-8");


 方式二:
  resp.setContentType("text/html;charset=utf-8");



 重定向和转发的区别

 重定向:1.客户端发送了两次请求   2.地址栏发生变换   3.产生两个request和response对象
 转发:1.客户端只发送一次请求   2.地址栏不发生变化   3.产生一个request和response对象
用户登录成功,跳转到首页:重定向


  尽量能用重定向就不要用转发


刷新


Service(){

Resp.setHeader(“refresh”,”3;url=http://www.baidu.com”);//3秒刷新一次 每次刷新都是重新发送一次请求 ,若要跳到其他网站,其后要接url网站地址

}


get、post

 默认所有方式都是get

       1.地址栏中直接输入
       2.form表单提交
       3.超链接
 post

       form表单提交并且指定method=‘post’


form表单体检基本上都是用post


http请求格式

    请求行
    多个请求头
    空行
    请求内容

get和post区别:
get:1.提交的数据信息显示在地址栏里面  2.数据内容是在请求行,提交的数据比较少
post:1.提交的数据信息不显示在地址栏里面 2.数据内容是在请求内容,提交的数据可以比较多

get和post乱码:
解决中文乱码问题:
 post方式:req.setCharacterEncoding("utf-8");
 get方式:String userName = new String(req.getParameter("userName").getBytes("iso-8859-1"),"utf-8");


MVC设计模式:Model  View Controll
   Model:模型  实体类  User类   javabean
   view:视图   html    jsp
   controll:  控制层  用来连接视图和模型   


  控制层和视图层通信,控制层和模型层通信,但是视图层和模型层互不通信


域对象比较:


ServletContext域对象:作用范围:在web应用中有效
request域对象:作用范围: 在当前请求中有效
  

转发:
区分:
getAttribute():域有关   getAttribute方法之前必须要先setAttribute
getParameter():读取form表单中的内容


请求转发和使用流输送数据只能使用一个。


提交表单时,在servlet:

String username = req.getParmeter("username")//姓名
String []like = req.getParameterValues("like")//爱好


java.lang.IllegalStateException: Cannot forward after response has been committed
  原因:在调用forward方法之前,在Servlet程序中写入的部分内容已经被真正地传送到了客户端,forward方法将抛出IllegalStateException异常。 

路径问题:

  首先路径/ 绝对路径 
   如果请求要发送给服务器,/   相当于是WebRoot    /a/d.html     /index.jsp
   如果发送给客户端: /相当于是web站点   /myrequest/a/d.html   /mysquest/index.jsp

用路径的地方
    转发   路径不用包含web应用的名字
    重定向:路径需要包含web应用的名字
    form  路径需要包含web应用的名字
    a  路径需要包含web应用的名字
    servletcontext   路径不用包含web应用的名字


  另一种方法:相对路径  相对于当前目录  (相对于webRoot)   不以/开头
    难点:当前路径是什么


cookie技术:


Session存于服务器

每个sesssion都有一个固定的id,存于浏览器,结帐时通过id到服务器查找



由Cookie API 我们知道  javax.servlet.http.Cookie 类用于创建一个Cookie,

response接口中

定义了一个addCookie方法    在其响应头中增加一个相应的Set-Cookie头字段,

request接口中也定义了一个getCookies方法, 用于获取客户端提交的Cookie

具体实例:如图


代码详解 见下章   servlet【cookie】


Response:

  主要方法: