A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小刀葛小伦 黑马粉丝团   /  2018-5-31 22:24  /  1233 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 小刀葛小伦 于 2018-5-31 22:29 编辑

Servlet
JavaWeb对咋们大家来说,是一个非常重要的阶段,这是大家第一次从eclipse控制台解放思想,回归网页的一个入门地方。
这也是很多小伙伴们学习这么久以来,能够深深认识到自己做的原来是这个东西,学的原来就是这个东西了。
有没有很兴奋,很激动啊,当从页面输入数据后,再在页面显示出自己所要的结果的时候,是不是觉得非常有成就感了!
~对,就是要这样!


HTTP协议
标记: 优先级 1

定义:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法

作用:规定浏览器和服务器的数据交互的格式.

HTTP协议的特点:

基于请求和响应的模型

    * 必须先有请求后有响应.
    * 请求和响应必须成对出现.

默认的端口号是80.

HTTP协议的请求部分

请求行

请求方式:GET和POST的区别

            * GET的提交的参数会显示到地址栏上,而POST不显示.
            * GET往往是有大小限制的,而POST没有大小的限制.
            * GET没有请求体,而POST有请求体.

    * 提交路径:

    * 协议版本:

请求头:都是键值对的形式显示的.一般一个key对应一个value,也有个别的是一个key对应多个value.

User-Agent:代表浏览器的类型. --- 文件下载:下载中文文件:IE使用URLEncodor进行编码,而Firefox使用Base64编码.

  Referer:代表的是网页的来源. --- 防盗链.

If-Modified-Since:通常与响应中的头Last-Modified一起使用查找本地缓存

请求体

就是POST提交方式的提交的参数

HTTP协议的响应部分

响应行

    * 协议版本

    * 状态码                :

        * 200        :成功

        * 302        :重定向

        * 304        :查找本地缓存

        * 404        :资源不存在

        * 500        :服务器内部错误

    * 状态码描述

响应头:键值对,一般一个key对应一个value,也有一个key对应多个value

* Last-Modified:与请求中的If-Modified-Since一起使用查找本地缓存.

* Content-Dispostion        :文件下载的使用使用的一个头信息.

* Location        :重定向的跳转的路径.

* Refresh:定时刷新/定时跳转.

响应体

显示浏览器的页面的内容

Servlet

Servlet的概述

什么是Servlet:

* 就是一个运行在WEB服务器上的小的Java程序,用来接收和响应从客户端发送过来的请求,通常使用HTTP协议.

* Servlet就是SUN公司提供的一个动态网页开发技术.

Servlet的作用:

* 用来处理从客户端浏览器发送的请求,并且可以对请求作出响应

独立编写一个Servlet:

* 编写一个类 implements  Servlet接口.

public class ServletDemo1 implements Servlet{

        @Override
        /**
         * 为用户处理请求和响应的方法.
         */
        public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
                res.getWriter().println("Hello Servlet...");
        }
...
}

* 将编写的这个类配置到服务器中.

  <!-- 配置Servlet -->
  <servlet>
          <!-- Servlet的名称 -->
          <servlet-name>test1</servlet-name>
          <!-- SErvlet的全路径 -->
          <servlet-class>com.itheima.a_servlet.ServletDemo1</servlet-class>
  </servlet>
  
  <!-- Servlet的映射 -->
  <servlet-mapping>
          <!-- Servlet的名称 -->
          <servlet-name>test1</servlet-name>
          <!-- Servlet的访问路径 -->
          <url-pattern>/ServletDemo1</url-pattern>
  </servlet-mapping>

Servlet的关系

Servlet        :接口(Implementing Classes:
FacesServlet, GenericServlet, HttpServlet

        |
        |
GenericServlet:通用的Servlet(Implemented Interfaces:
java.io.Serializable, Servlet, ServletConfig

        |
        |
HttpServlet(Implemented Interfaces:
java.io.Serializable, Servlet, ServletConfig

* 编写一个类继承HttpServlet,重写doGet和doPost方法.
* 配置

Servlet的生命周期(面试常用的问题)

生命周期:就是一个对象从创建到销毁的过程.
Servlet生命周期:Servlet从创建到销毁的过程.
* 何时创建:用户第一次访问Servlet创建Servlet的实例
* 何时销毁:当项目从服务器中移除的时候,或者关闭服务器的时候.

描述概述:用户第一次访问Servlet的时候,服务器会创建一个Servlet的实例,那么Servlet中init方法就会执行.任何一次请求服务器都会创建一个新的线程访问Servlet中的service的方法.在service方法内部根据请求的方式的不同调用doXXX的方法.(get请求调用doGet,post请求调用doPost).当Servlet中服务器中移除掉,或者关闭服务器,Servlet的实例就会被销毁,那么destroy方法就会执行.

Servlet相关配置

启动时加载

Servlet默认是在第一次访问的时候创建的.现在让Servlet在服务器启动的时候创建好.进行对Servlet的配置:
在web.xml中在<servlet></servlet>标签中配置:
* <load-on-startup>2</load-on-startup>  --- 传入正整数,整数越小,被创建的优先级就越高.

url-pattern的配置

1.完全路径匹配        :以 / 开始
例如:        /ServletDemo4 , /aaa/ServletDemo5 , /aaa/bbb/ServletDemo6

2.目录匹配        :以 / 开始 需要以 * 结束.        例如: /* ,/aaa/* ,/aaa/bbb/*

3.扩展名匹配:不能以 / 开始 以 * 开始的. 例如: *.do , *.action

***** 错误的写法: /*.do

***** 完全路径匹配 > 目录匹配 > 扩展名匹配

开发中路径的问题

API

Servlet

javax.servlet Interface Servlet



所有已知实现类

HttpServlet

所有实现的接口

java.io.Serializable
Servlet
ServletConfig

在Java中,通常所说的servlet是指HttpServlet对象,在声明一个对象为servlet时,需要继承HttpServlet类。
HttpServlet类是Servlet接口的一个实现类,继承该类后,可以重写HttpServlet类中的方法对HTTP请求进行处理。

protected  void doDelete(HttpServletRequest req, HttpServletResponse resp)

protected  void doGet(HttpServletRequest req, HttpServletResponse resp)

protected  void doPost(HttpServletRequest req, HttpServletResponse resp)

protected  long getLastModified(HttpServletRequest req)

protected  void service(HttpServletRequest req, HttpServletResponse resp)

void service(ServletRequest req, ServletResponse res)

GenericServlet

该类是一个抽象类,分别实现了servlet 接口与servletConfig接口。该类实现了除service()之外的其他方法,在创建Servlet对象时,可以继承该类来简化程序代码,但是要实现service()方法。

FacesServlet

void destroy()

当Servlet对象从servlet容器中移除时,容器调用该方法,以便释放资源

ServletConfig getServletConfig()

用于获取servlet对象的配置信息,返回servletconfig对象

java.lang.String getServletInfo()

返回有关Servlet的信息,它是纯文本格式的字符串,如作者,版本等

void init(ServletConfig config)

servlet实例化后,servlet容器调用该方法来完成初始化工作

void service(ServletRequest req, ServletResponse res)

用于处理客户端的请求

Response

Interface HttpServletResponse
extends ServletResponse

HttpServletResponse接口位于javax.servlet.http包中,继续了ServletResponse接口,是servlet中的重要对象。



void addCookie(Cookie cookie)

向客户端写入cookie信息

void addDateHeader(java.lang.String name, long date)

void addHeader(java.lang.String name, java.lang.String value)

针对一个key对应多个value的响应头.

void addIntHeader(java.lang.String name, int value)

void sendRedirect(String location)

使用客户端重定向到新的URL,参数location为新的地址

void setDateHeader(java.lang.String name, long date)

void setHeader(java.lang.String name, java.lang.String value)

针对一个key对应一个value的响应头.

void setIntHeader(java.lang.String name, int value)

Interface ServletResponse



void setContentType(java.lang.String type)

void setCharacterEncoding(java.lang.String charset)

java.lang.String getCharacterEncoding()

java.lang.String getContentType()

java.io.PrintWriter getWriter()

request

interface HttpServletRequest extends ServletRequest

HttpServletRequest接口位于javax.servlet.http包中,继续了ServletRquest接口,是servlet中的重要对象。(域对象)



public String getMethod();---获得请求所使用的HTTP类型,如get,post

public String getQueryString();---返回请求中参数的字符串形式。如请求MyServlet?username=a,则返回username=a.

public String getContextPath();---返回请求的上下文路径,此路径以“/”开头

public Cookie[ ] getCookies()

返回请求中发送的所有cookies对象,返回值为cookie数组

public HttpSession getSession()

返回与请求关联的HttpSession对象

public String getServletPath()

返回请求URL中的Servlet路径的字符串,不包含请求中的参数信息



interface ServletRequest



* String getParameter(String name);---用于接收一个名称对应一个值的数据.

* String[] getParameterValues(String name);---用于接收一个名称对应多个值的数据.

* Map getParameterMap();---用于接收表单中的所有的数据,Map的key是表单提交的参数名称,Map的value是提交参数的值.

* Enumeration getParameterNames();---用于获取表单中提交的所有的参数的名称.



ServletContext(域对象)
标记: 优先级 1

ServletContext的作用:
标记: 优先级 1

* 1.用来获得全局初始化参数.

java.lang.String getInitParameter(java.lang.String name)

java.util.Enumeration<java.lang.String> getInitParameterNames()

* 2.用来获得文件的MIME的类型.

java.lang.String getMimeType(java.lang.String file)

* 3.作为域对象存取数据.

ServletContext是一个域对象.
    * 作用范围:整个web工程.
    * 创建:服务器启动的时候,tomcat服务器为每个web项目创建一个单独ServletContext对象.
    * 销毁:服务器关闭的时候,或者项目从服务器中移除的时候.

* 4.用来读取web项目下的文件.

void setAttribute(java.lang.String name, java.lang.Object object)

用来向ServletContext中存入数据

java.lang.Object getAttribute(java.lang.String name)

用来从ServletContext中获取数据

void removeAttribute(java.lang.String name)

用来从ServletContext中移除数据.

InputStream getResourceAsStream(String path); --- 根据提供路径读取文件返回一个文件的输入流.

String getRealPath(String path); --- 返回一个路径的磁盘绝对路径.

ServletConfig(只是了解)

获得Servlet的相关配置信息

public String getInitParameter(String name)

---获得Servlet的初始化参数的.

public Enumeration getInitParameterNames()

---获得所有Servlet的初始化参数的名称.

public ServletContext getServletContext()

用于获取servlet上下文对象

public String getServletName()

---获得Servlet在web.xml中配置的name的值.

转发和重定向的区别
标记: 优先级 1

【重定向】

response.sendRedirect(String path); -- 完成重定向

【转发】

request.getRequestDispatcher(String path).forward(request,response);

【区别】

1.转发的地址栏不变的.重定向的地址栏发生变化的.

2.转发是一次请求一次响应,重定向是两次请求两次响应.

3.request域对象存取的值在转发中是有效的,在重定向无效的.

4.转发的路径不需要加工程名.重定向的路径需要加工程名.

类加载器读取文件(了解)

        public static void readFile() throws IOException{
                // 使用类的加载器来读取文件.
                // 类的加载器用来加载class文件,将class文件加载到内存.
                InputStream is = ReadFileUtils.class.getClassLoader().getResourceAsStream("db.properties");
                Properties properties = new Properties();
                properties.load(is);
               
                String driverClass = properties.getProperty("driverClass");
                String url = properties.getProperty("url");
                String username = properties.getProperty("username");
                String password = properties.getProperty("password");
               
                System.out.println(driverClass);
                System.out.println(url);
                System.out.println(username);
                System.out.println(password);
        }

输出中文乱码的处理

* 字节流:

        * 设置浏览器默认打开的编码:
            * resposne.setHeader(“Content-Type”,”text/html;charset=UTF-8”);
        * 设置中文字节取出的时候编码.
            * “中文”.getBytes(“UTF-8”);

* 字符流:

        * 设置浏览器打开的时候的编码
            * resposne.setHeader(“Content-Type”,”text/html;charset=UTF-8”);
        * 设置response的缓冲区的编码
            * response.setCharacterEncoding(“UTF-8”);

***** 简化的写法:response.setContentType(“text/html;charset=UTF-8”);

1 个回复

倒序浏览
我来占层楼啊   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马