JavaWeb(一)-Servlet

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a592381841/article/details/85176732

一、涉及的包

Servlet API涉及4个java包 :

             javax.servlet   Servlet容器

             javax.servlet.http  Servlet容器和http协议的关系

             javax.servlet.annotation        Servlet,filter,Listener 进行标注的注解 

            javax.servlet.descriptor        包含为web应用程序的配置信息提供编程式访问的类型。

二、Servlet的生命周期

2-0:HttpServlet和Servlet

  HTTPServlet是关于于Http协议的;而Servlet是与具体的协议无关。

2-1:Servlet的创建

      在一个应用中,每一个Servlet类型只能有一个实例,因此不要在Servlet的实现类中定义成员变量,类变量

    Servlet创建有两种情况:

               1. 在Servlet第一次接受请求的时候创建。(默认)

               2.在服务器开启的时候创建。

                      在web.xml文件的<servlet>标签下加一个<load-on-startup>正数序号</load-on-startup>;服务器会根据序号决定创建顺序。

2-2:Servlet处理请求

    当客户端发送请求到服务器。Tomcat会根据Servlet的URL,接入对应的Servlet对象的service()方法;

     (在HttpServlet中,service会根据请求的类型,决定调用doGet()或者......)

2-3:Servlet销毁

当服务器关闭的前夕,会对Servlet进行销毁;Servlet销毁前,会调用destory()方法

2-4:Servlet其他方法

getServletInfo 返回Servlet的描述

getServletConfig 返回init()传入的ServletConfig

三、关于JAVA WEB的文件结构

  1. 项目根目录下放置的资源可以被URL直接访问。
  2. WEB-INF下的classes存放着java类编译的字节码文件
  3. WEB-INF下的lib下存放着WEB应用程序所要的jar包
  4. 注意:若要资源不直接被URL访问到,将资源放在WEB-INF即可。
  5. web.xml是java WEB的描述文件。

四、关于ServletRequest和ServletResponse

此处讨论HTTPServletRequest和HttpServletResponse。

4-1:HttpServletRequest

request是应用于封装客户端的所有请求数据

获取常用信息:

  1.   获取客户端IP:request.getRemotoAddr()
  2. 请求方式 request.getMethod()
  3. 获取请求头  String getHeader(String name);int getIntHeader(String name);long getDateHeader(String Date);..............
  4. 获取URL信息

获取请求参数

  1. String getParameter(String name)   指定参数名,获取单值参数值
  2. String[] getParametervalues(String name) 指定参数名,获取多值参数值
  3. Map<String,String[]> getParameterMap() 获取所有请求参数;返回键值对(key参数名,value 参数值)
  4. Enumeration<String> getParameterNames();获取所有请求参数名

关于请求转发和请求包含,请求重定向

  1. 请求转发:由下一个Servlet完成响应头,当前Servlet只可设置响应头。(留头不留体)
  2. 请求包含:由两个及以上的Servlet共同完成响应头(都有)
  3. 实现代码
//在
RequestDispatcher d=request.getRequestDispatcher("/BServlet");
		//转发:
		d.forward(request, response);
		//包含
		d.include(request, response);

重定向和转发的区别

转发是一个请求。重定向是两个请求。

转发:是服务器跳转,浏览器的地址栏不发生改变;request域不会被保留。

重定向:是客户端跳转;request域不会被保留。

关于防盗链

通过Referer响应头判断该url的跳转来源。

4-2HttpServletResponse

关于重定向实现

//方法1:设置响应码302,设置location响应头
response.setStatus(302);
response.setHeader("location", "....");
//方法2直接调用 sendRedirect		
		response.sendRedirect(".......");

//重定向填写url需要写/的。(http://localhost:8080/)

设置状态码

  1. sendError(int sc)             发送错误状态码
  2. sendError(int sc,String mgs)  发送错误状态码,还带一个错误信息
  3. sendStatus(int sc)   发送一个成功的状态码。可用于302

设置响应头

  1.  response.setHeader(String name, String value);  适合单值的响应头
  2. response.addHeader(String name, String value);适合多值的响应头
  3. response.setIntHeader(String name, int value);适合单值的int响应头
  4. response.addIntHeader(String name, int value);适合多值的int响应头
  5. response.setDateHeader(String name, long value);适合单值的毫秒类型的响应头
  6. response.addDateHeader(String name, long value);适合多值的毫秒类型的响应头。

设置响应体

通常是html和图片

response有两个流:ServletOutputStream和printWriter

ServletOutputStream: 用于向客户端发送字节数据

printWriter:用于向客户端发送字符数据。

注意:两个流是不能同时使用的。(若同时用会抛出异常)

4-3:编码问题

注意:服务器和客户端使用的编码必须一致

编码问题分为 请求编码,响应编码

请求编码

Tomcat默认使用ISO-8859-1来处理请求参数。

  1. 关于POST请求
    1. 在获取参数之前,调用request.setCharacterEncoding("UTF-8");然后再获取参数。
  2. 关于GET请求
    1. 方法1: 设置服务器处理请求参数的默认编码。
      1. 例如Tomcat。在/conf/server.xml中配置 <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
    2. 方法2:如下操作
      1. String name =request.getParemeter("name");
        byte[] b=name.getBytes("ISO-8859-1");
        name=new String(b,"UTF-8")

响应编码

若不设置,默认是ISO-8859-1

在使用响应流前使用如下操作

        //设置字符流的编码
        response.setCharacterEncoding("UTF-8");
        //通知浏览器以UTF-8的形式解析 等价于   response.setHeader("content-Type", "text/html;chatset=utf-8");
        response.setContentType("text/html;chatset=utf-8");


五、本章例子      

    例子: 包括 编码,重定向,转发,包含

例子

六、注意

6-1:request中参数和属性的区别

  1. 参数是由客户端到服务器
  2. 属性是服务器到服务器的域

猜你喜欢

转载自blog.csdn.net/a592381841/article/details/85176732