Servlet、request、response

Servlet:

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

    servlet 是sun公司提供的一个动态的网页开发技术

   servlet 的作用

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

在使用servlet 时,需要编写一个类实现 Servlet 的接口,将编写的这个类配置到服务器中

public class ServletDemo1 implements Servlet{

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

配置servlet文件在web.xml中进行配置 ,当浏览器访问指定路径时,会执行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>

其中有一些方法可以 获取请求的路径,参数,数据

     getMethod():获取请求方式  是get还是post方式

    String getParameter(String name)  :用于接受一个名称对应一个值的数据

    String[] getParameterValues(String name):用于接受一个名称对应多个值的数据

     Map getParameterMap();用于接受表单中的所有的数据,Map集合的key是表单提交的参数名称,Map的value是提交参数的值(该值可能是一个数组,所有在接受的时候Map泛型的值是一个数组)

小知识点;

   如果当前项目使用的是tomcat 容器,在页面表单提交数据时,其实数据默认提交到tomcat 的webapps的路径下的项目中

   原因是:在将项目配置到tomcat 上的时候,tomcat会将项目拷贝到webapps路径下,在方法访问的时,开始的/ 表示的是webapps目录

Servlet访问的流程: 

     1,客户端浏览器发送请求

     2,服务器接收请求后,查找web.xml 中是否存在对应的访问地址

     3,根据映射路径找到对应的Servlet处理类

     4,调用servlet 方法

     5,通过ServletRequest 获取页面传递过来的参数

     6,通过ServletResponse 向浏览器输出内容

    7,浏览器接收内容后进行显示

在web开发中,通常继承HttpServlet  类

Servlet 的生命周期,所以的周期就是一个对象从创建到销毁的过程

   当用户第一次访问Servlet的时候,就会创建Servlet 的实例(访问其构造方法) 然后init方法执行

   任何一次的请求都糊去创建一个新的线程,访问servlet中的service 方法

    在Servie方法内部 会根据请求的方式进行不同的调用,doget还是dopost方法

    当服务器关闭或者项目从服务器中移除,Servlet就会被销毁,destroy()方法就会执行

Servlet 的相关配置

   <load-on-startup> 用于表示优先级,如果设置,该Servlet 在程序启动是就会调用init方法,数字越小优先级越高,但是1不能使用,是Servlet默认的,所以在使用的时候从2开始使用

Response

   进行响应到浏览器端

  设置响应头配置

     addHeander(String name,String value) 将给定的名字和数值添加到响应头部

     如果由多个value 则是在后面继续添加

    addDateHeader(String name,long date)  将给定的名字和日期添加到响应的头部,

    addIntHeader(String name,int value) 将给定的名字和整数值添加到响应的头部  

    setHeader (String name,String value ) 针对一个key 有一个value指的,将在原有的值上进行修改,而不是在后面继添加

    setHeader(String name,String value)

   setDateHeader(String name,long date)

   setIntheader(String name,int value)

页面刷新

   Response.setHeader("refresh" ,"5;url=' ' ")

重定向 ,跟状态码配合使用 302 

   Response.Status(302) 设置状态码

   Response.setHeader('location"," /Demo/index.html ")  在html 中进行页面的跳转

 在html 中进行页面的跳转

   在html中进行网页的跳转

  

<head><meta charset="UTF-8">

<meta http-equiv="Refresh" content="5;url='/Demo01_Servlet/Count'" >

<title>Insert title here</title>

响应体:使用文件流读,用下面的方法进行写出 ,这两种方法 不能同时使用,一个是字符流一个是字节流

    getOutputStream()

    getWriter()

解决响页面输出中文乱码的问题 设置浏览器默认的打开编码格式(post)

  response.setContentType(“text/html;charsert=utf-8”)

text/html;charsert=utf-8中的utf-8不需要加引号,会报错

get解决方案(有三种,说最常用的一种)

   使用String 的构造方法  ---  推荐使用

根据不同浏览器解决乱码问题

  

// 根据浏览器的类型处理中文文件的乱码问题:
		String agent = request.getHeader("User-Agent");
		System.out.println(agent);
		if(agent.contains("Firefox")){
			filename = base64EncodeFileName(filename);
		}else{
			filename = URLEncoder.encode(filename,"UTF-8");
		}

public static String base64EncodeFileName(String fileName) {
		BASE64Encoder base64Encoder = new BASE64Encoder();
		try {
			return "=?UTF-8?B?"
					+ new String(base64Encoder.encode(fileName
							.getBytes("UTF-8"))) + "?=";
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

ServletContext对象(域对象) 作用于整个Web项目

所以在this.getServletContext() 的时候,其实路径就到了当前的项目下了

什么是域对象,

   域对象 就是在其内部维护了一个Map<String .object>

 域对象可以用来存储数据

   每个域对象都有自己的作用范围

ServletContext 对象的特点

   ServletConetext 对象是一个域对象 ,最用范围是整个web的应用 每个wen项目都有一个唯一的ServletContext 对象

在web应用被服务器加载的时候就会创建该对象,当服务器关闭,或者服务器中的项目移除的时候,就会销毁该对象

servletContext对象的获取

    通过ServletConfig对象获取,或者在继承httpServlet之后,使用this.getServetContext 进行获取

ServletConetext对象常用的方法

  1. setAttribute(String name ,object object);用于保存数据
  2. getAttribute(String name);获取数据
  3. removeAttribute(String name);删除数据
  4. getInitParameter(String anme); 获得全局的参数
  5. getRealPath(String name); 为给定虚拟路径返回包含实际路径的 String
  6. getMimeType(String file) 返回指定文件的 MIME 类型,如果 MIME 类型未知,则返回 null, 常见 MIME 类型是 "text/html" 和 "image/gif"

ServletContext对象的作用域

     1,用来获取 全局的初始化参数

例:
例:在web.xml的根元素下配置一下信息:
<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
这些参数就属于整个应用的全局参数,使用ServletContext来读取。
this.getServletContext().getInitParameter("name");

    2,用来获取文件的mime类型 参数值是文件的路径

           this.getServletContext.getMimeType("/dome.html")

    3,作为域对象存取数据

this.getServletContext().setAttribute("count", 0); setAttribute:设置初始值,在init中进行初始化
this.getServletContext().getAttribute("count"); getAttribute:获取里面的count键的值

  常用的方法:

  1. String  getServletName();获得Servlet在web.xml中配置的name的值.
  2. getServletContext(); 获取ServletContext对象
  3. getInitParameter(String name);获得servlet初始化数据

1、在web.xml中增加如下配置

<servlet>

     <servlet-name>

ServletDemo7

</servlet-name>

     <servlet-class>

com.itheima.a_servlet.ServletDemo7

</servlet-class>

     <!-- 配置初始化参数 -->

     <init-param>

     <param-name>username</param-name>

     <param-value>root</param-value>

     </init-param>

     <init-param>

     <param-name>password</param-name>

     <param-value>123</param-value>

     </init-param>

   </servlet>

<servlet-mapping>

   <servlet-name>ServletDemo7</servlet-name>

     <url-pattern>/ServletDemo7</url-pattern>

</servlet-mapping>

注意:只在当前servlet中有效  

getInitParameterNames();获得所有Servlet的初始化参数的名称

可以获取的servlet配置文件中的信息的原理

servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servletinit方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息

Request和Response 的不同

 HTTP   请求部分

   请求行,请求方式,请求路径,协议版本

    请求方式,POST 和  get

    请求方式很多,但是最常用的就是get和post 

   区别:

          get有大小限制,参数在地址栏中显示

          post 没有大小限制,参数存放在参数体中

       请求路径要访问那个路径中的内容

       协议版本,使用 版本 1.1

               1.0 :连接一次 就会断开连接

                1.1: 连接一次不会接着断开,而是过一段时间之后么有请求的时候会断开

     请求头,键值对的存在

          Referrer : 网页的来源,用于防盗链

         User-Agent 浏览器的类型和一些基本的额信息

       if-modified-Since 跟响应头的Last-modifide一起使用,用于查询本地的缓存

请求体:post 的提交参数在请求体中,get提交的参数在地址啦中

Request 作为域对象存储数据

   Request 的作用范围

    作用的返回是一次请求

     创建:客户端想服务器发送一次请求之后,服务器就会创建一个Request 对象

    销毁 : 当服务器对这次请求做出了响应之后,就会被销毁

重定向和转发的区别:(redirect和forward)

重定向的地址会发生改变,转发的地址不会发生改变

重定向需要两次请求和两次响应,转发一次,请求一次

重定向可以访问任意网站,转发只能访问服务器内自己的网站

重定向需要加工程名,而转发不需要加工程名(自己访问自己)

 

           

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值