欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Request & Reponse学习

程序员文章站 2024-02-03 11:25:52
...

1. 复习http&sevlet

  • http协议

    • 客户端和服务端的一种通讯规则
    • request:
      • 请求头
      • 请求行
      • 请求体
    • response
      • 响应行
      • 响应头
      • 响应体
    • Get
      • 带上的数据,在url上拼接的
      • www.url.com
      • name=zhangsan
      • age=18
      • url:www.url.com?name=zhangsan&age=18
      • 安全隐患
    • Post
      • 以流的方式写过去,数据无限制
      • Conten-Type:带过来数据类型
      • Conten-Length:数据长度
  • Servlet入门

    • 新建类实现servlet接口

    • web.xml注册

    • <servlet>
      	<servelt-name> 自定义名字</servelt-name>
          <servlet-class>类的地址 </servlet-class>
          <init-params>不是必须的</init-params>
      </servlet>
      
      <servelt-mapping>
      	<servlet-name></servlet-name>
          <url-patter>以正斜杠打头</url-patter>
      </servelt-mapping>
      
    • servlet生命周期

      • init

        • 默认情况下,初始化的时候执行

        • 提前:服务器启动的时候

        • <serclet>
          	<load-on-startuo> 2 </load-on-startuo>
          </serclet>
          
      • service

        • 只要又请求过来,就会执行
      • destory

        • 从服务器移除托管
        • 正常关闭服务器
      • 通用servelt的写法

        • 协议给类继承HttpServlet类
          • doGet()
          • doPost()
        • 在service方法内,会对来访的请求进行判断,是get则给doGet方法,,是post则给doPost()
        • HttpServlet是抽象类,但是没有抽象方法

2. Request & Reponse

2.1 Servelt配置方式一

  1. 新建动态web项目
    1. 新建一个servelt
    2. 直接发布

  • 全路径匹配
    • /开头
  • 路径匹配(前半段匹配)
    • /开头,但是以*结束
  • 以扩展名匹配
    • *.aa

2.2 ServletContext(接口)

servlet 上下文

每一个web工程都只有一个ServletContext对象,不管在同一个工程里哪里servlet里面,获取到的这个类的对象都是同一个,指向用一块内存地址。

  1. 新建动态web工程

  2. 新建servlet

  3. 得到对象,在doGet方法里写上

    1. ServletContext context = new ServletContext();
    2. `String address = context.getServletParameter(“address”);
    3. print(address);
  4. 然后在web.xml里注册

  5. 新建一个类复制上面代码,同时注册。

  6. 在web.xml

    1. <context-param>
          <param-name>address</param-name>
          <param-value>地址</param-value>
      </context-param>
      
  7. 访问第一个servlet,在访问第二个servlet。控制台发现数据一样。从而证明:

    1. 每一个web工程都只有一个ServletContext对象,不管在同一个工程里哪里servlet里面,获取到的这个类的对象都是同一个,指向用一块内存地址。

2.3 ServletContext有什么用

  1. 获取全局参数

  2. 获取web工程中资源

    1. 新建servlet

    2. 在src下新建一个config.propertites并初始化

      1. name=“zhangsan”
    3. 在doGet方法下

      1. //1.创建属性对象
        Properties propertites = new Properties();
        //2.指定载入的数据流
        /*
        * 如果此处想获取web工程下的资源,用普通的FileInputStream写访问不到
        * 因为路径不对了。这里相对路径是根据jre来确定的,但我们这里是一个web工程
        * jre后面会被tomcat管理,所以这里真正的相对路径是tomcat里卖弄的bin目录
        */
        InputSteam is = new FileInputStream("classes/config.propertites");
        properties.load(is);
        //3.获取name的属性值
            String name = properties.getProperty("name");
            printf(name);
        
    4. 这个实验视频中没有做出来,他说这样配置后在web中能访问。回头试一下

    5. 这里目的是想引出来使用ServletContext来进行配置


方法1:获取web工程中的参数

  1. 新建一个动态web工程

  2. 在WebContent路径下新建文件夹file,然后在里面新建config.propertites并初始化

    1. [外链图片转存失败(img-6CbSuo3n-1565624176754)(C:\Users\cds\AppData\Roaming\Typora\typora-user-images\1558539584533.png)]
  3. 新建一个servlet,在doGet方法下

    1. getRealPath():拿去绝对路径

    2. //1. 获取ServletContext对象
      ServletContext context = getServletContext();
      	// 获取给定的文件,在服务器上的绝对路径
      	//如果在context.getRealPath("")中什么都不写
      		//返回的是wtpwebapps\工程名 的路径下
      	// context.getRealPath("file/config.propertiers");
      		//返回的是config.propertiers绝对路径
      String path = context.getRealPath("file/config.propertiers");
      printf(path);
      //2.创建属性对象
      Properties propertites = new Properties();
      //3.指定载入的数据流
      
      InputSteam is = ;
      properties.load(is);
      //4.获取name的属性值
      String name = properties.getProperty("name");
      printf(name);
      
  4. 发布,web中访问。


方法二::getResourceAsStream 获取资源的流对象

//1. 获取ServletContext对象
ServletContext context = getServletContext();	
//2.创建属性对象
Properties propertites = new Properties();
//3.获取web工程下的资源,转化为流对象,前面隐藏当前工程的根目录
InputSteam is =context.getResourceAsSteam("file/config.propreties") ;
properties.load(is);
//4.获取name的属性值
String name = properties.getProperty("name");
//5.关闭流
is.close();
printf(name);

**方法三:**根据classloader去获取工程下的资源 类加载器(JDBC)

3. 存取数据,servlet之间共享数据,域对象

需求:

​ 1. 获取网站的登陆总人数

[外链图片转存失败(img-zIo8o3vy-1565624176757)(C:\Users\cds\AppData\Roaming\Typora\typora-user-images\1558833256549.png)]

  1. 新建一个动态工程Demo4

  2. webCotent下新建login.html

    1. <h2>
          请输入以下内容,完成登陆
      </h2>
      
      <form action="LonginServlet" method="get">
          账号:<input type = "text" name = "username" /> <br>
          密码:<input type = "text" name = "password" /> <br>
          <input tyoe = "submit" value = "登陆">
      </form>
      在这里action下的名字是servelt再web.xml中注册的url-partter的名字
      
      
      
  3. 新建一个servlet,命名为LonginServlet.java

  4. 发布,访问Demo04/longin.html

  5. 在servlet的doGet方法下

    1. /**
      		* request:包含请求信息
      		*
      		*response:响应数据给浏览器
      		*/
      		//1. 获取数据
      		String userName = request.getParameter("username");
      		String passWord = request.getParameter("password");
      		
      
      		//2. 校验数据
      		// 向浏览器输出内容
      		PrintWriter pw = response.getWriter();
      		if("admin".equals(userName) && "123".equals(passWord)) {
      			System.out.println("登陆成功");
      			System.out.println(userName + ":" + passWord);
      			System.out.println(userName + ":" + passWord);
      			pw.write("log in ");
                  
                  //1.成功次数累加
                  //取以前的值。然后再旧的基础上+1
                  //int toalCount = (int)getServletContext().getAttribute("count ");
                  Objetc obj = getServeltContext().getAttribute("count");
                  int totalCount =0;
                  if(obj != null){
                      totalCount = (int) obj;
                  }
                  
                  //给合格count赋新值
                  getServletContext().setAttribute("count",totalcount+1);
                  
                  
                  
                  //设置状态码,重新定位状态码
                  response.setStatus(302);
                  //定位跳转的位置是哪一个页面
                  response.setHeader("Location","login_success.html");
      		}else {
      			System.out.println("登陆失败");
      			pw.write("faild");
      		}
      
      
    2. 浏览器在访问此html并填写信息

  6. 新建login_success.html

    1.   			//设置状态码,重新定位状态码
                  response.setStatus(302);
                  //定位跳转的位置是哪一个页面
                  response.setHeader("Location","login_success.html");
      
    2. <h2>
          登陆成功
      </h2>
      <a hreg = "CountServelt" > 网站登陆的总成功数</a>
      
    3. 再次访问,发现跳转

    4. [外链图片转存失败(img-06OM8f9S-1565624176760)(C:\Users\cds\AppData\Roaming\Typora\typora-user-images\1558854203480.png)]

  7. 新建一个CountServlet的servlet

    1.  int count = (int)getServletContext().getAttbute("count");
         
      response.getWriter("当前网站成功登陆总次数为:" + count)
      
    2. <h2>
          登陆成功
      </h2>
      <a hreg = "CountServelt" > 网站登陆的总成功数</a>
      
      

2.4 servletContext生命周期

  • 服务器启动的时候,会为托管的每一个web应用程序,创建一个servletContext对象
  • 从服务器移除托管,或者关闭处理服务器时销毁对象
  • ServletContext作用范围
    • 只要再这个项目里面,都可以取

3. HttpServletRequest

这个对象封装了客户端提交功过来了的一切数据

  • 新建动态web工程

  • 新建servlet

  • doGet方法下

    • 
      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          //去除请求里面的所有信息
      		//枚举集合	
          Enumeration<String> headerNames =  request.getHeaderNames();
      		while (headerNames.hasMoreElements()) {
      			String name = (String) headerNames.nextElement();
      			String value = request.getHeader(name);
      			System.out.println(name + " = " + value);
      		}
      	}	
      
    • http://localhost:8080/Requeest_Response01/Request01?name=name

    • //1. 获取请求头
      		Enumeration<String> headerNames =  request.getHeaderNames();
      		while (headerNames.hasMoreElements()) {
      			String name = (String) headerNames.nextElement();
      			String value = request.getHeader(name);
      			System.out.println(name + " = " + value);
      		}
      		//2.获取客户端提交上来的数据
      		String name = request.getParameter("name");
      		System.out.println("name = " + name );
      		
      
  • 获取客户端提交过来的数据

//2. 获取到的是客户端提交上来的数据
		String name = request.getParameter("name");
		String address = request.getParameter("address");
		System.out.println("name="+name);
		System.out.println("address="+address);
		
		System.out.println("-----------------------");
		
//		获取所有的参数,得到一个枚举集合
//		Enumeration<String> parameterNames = request.getParameterNames();
		
//		name=zhangsan&address=beijing
		
		//name=zhangsan&name=lisi&name=wangwu
		
		Map<String, String[]> map = request.getParameterMap();
		
		Set<String> keySet = map.keySet();
		Iterator<String> iterator = keySet.iterator();
		while (iterator.hasNext()) {
			String key = (String) iterator.next();
			System.out.println("key="+key + "--的值总数有:"+map.get(key).length);
			String value = map.get(key)[0];
			String value1 = map.get(key)[1];
			String value2 = map.get(key)[2];
			
			System.out.println(key+" ======= "+ value + "=" + value1 + "="+ value2);
		}

4. 下载

  • 新建一个html和servlet

HTML,命名为index.html代码

<body>

	<h3>让默认的servlet下载(tomcat)</h3><br>

	<a href = "download/a.txt">a.txt</a><br>
	<a href = "download/a.txt">b.txt</a><br>


	<h3>手动编码形式</h3><br>

	<a href = "demo1_dowmload?fileName=a.txt">a.txt</a><br>
	<a href = "demo1_dowmload?fileName=b.txt">b.txt</a><br>
</body>
</html>

servlet代码,命名为:demo1_download.java

package com.cds.download;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.tomcat.jni.FileInfo;

import com.sun.corba.se.spi.activation.Repository;

/**
 * Servlet implementation class demo1_dowmload
 */
@WebServlet("/demo1_dowmload")
public class demo1_dowmload extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		//1.获取要下载文件的名字
		String fileName = request.getParameter("fileName");
		//2.获取绝对路径
		String path = getServletContext().getRealPath("download/" + fileName);
		//3.设置浏览器展示方式
		response.setHeader("Content-Disposition", "attachment;filename="+fileName);
		//4.转化为输出流
		InputStream in = new FileInputStream(path);
		OutputStream out = response.getOutputStream();
		
		int len = 0;
		byte[] b = new byte[1024];
		while((len = in.read(b)) != -1) {
			out.write(b,0,len);
		}
		out.close();
		in.close();
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

浏览器访问地址:http://localhost:8080/RequestDemo02/index.html

相关标签: request