Request & Reponse学习

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

早睡的叶子

你的鼓励就是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值