天天看点

servlet知识详解

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

动态web资源的运用:

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

servlet知识详解

servlet的运行过程,周期:

我们可以用如下 图示来描绘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()

servletContext 

       作用域:作用于该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技术:

servlet知识详解

Session存于服务器

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

servlet知识详解

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

response接口中

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

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

具体实例:如图

servlet知识详解

代码详解 见下章   servlet【cookie】

Response:

  主要方法: