java web day5

java web day5,第1张

java web day5 请求和响应 1.请求和响应的概述:
什么请求:在浏览器地址栏输入地址,点击回车请求服务器,这个过程就是一个请求过程。
什么响应:服务器根据浏览器发送的请求,返回数据到浏览器在网页上进行显示,这个过程就称之为响应。
1.2 发送响应消息头相关的方法

响应消息头的数据格式:key-value的形式,有的是一个key,一个value,有的是一个key,多个value
1.设置响应消息头:
* 一个key ,一个value
setHeader(String key,String value);
比如:setHeader(“aa”,“AA”);
如果:setHeader(“aa”,“AA”);
setHeader(“aa”,“BB”);
最终的结果:aa这个头对应的值就是BB
* 一个key,对应多个value
addHeader(String key,String value);
比如:addHeader(“aa”,“AA”);
addHeader(“aa”,“BB”);
最终的结果:aa这个头对应的值AA和BB

2.设置响应数据的长度:setContentLength(int src)方法
3.设置处理乱码的方法:
* setCharacterEncoding(String a);参数就是一个 码表格式,比如:“utf-8”
* setContentType(String a);参数代表响应数据的类型和码表格式,比如: “text/html;charset=utf-8”

1.3 发送响应体相关的方法:

第一个方法:getOutputStream(),通过response向浏览器返回图片、视频等二进制数据的文件,当然也可以向浏览器、
返回文本数据。
比如:
ServletOutputStream out = response.getOutputStream();
String value=“itcast”;
out.write(value.getBytes());
第二个方法:getWriter(),通常response向浏览器返回文本数据,不能向浏览器返回图片、视频等二进制文件。
比如:
//字符流向浏览器输出数据
PrintWriter pw = response.getWriter();
String value=“itcast—”;
//pw.print(value);
pw.write(value)

1.4 解决中文输出的乱码问题

1.在servlet文档中加入这段代码response.setHeader(“Content-Type”, “text/html;charset=utf-8”);
2…让服务器端的中文编码格式是utf-8
out.write(data.getBytes(“utf-8”));

1.5 实现网页的定时跳转并刷新:

定时跳转:从一个空白页面转换到“重庆欢迎了”
代码如下:
// 1.定时跳转:需要用到Refresh响应头
response.setHeader(“Refresh”, “5;URL=/chapter04/login.html”);
定时刷新: 在当前页面的地址不发生变化,但是当前页面自己定时刷新,页面数据会发生变化。
代码如下:
response.setHeader(“Refresh”,“5”);
response.getWriter().print(new Date());

package cn.itcat.chapter04.repsponse;

import java.io.IOException;
import java.util.Date;

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


@WebServlet("/refresh")
public class ResponseServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setHeader("Refresh", "5;URL=/chapter04/login.html");
		
		//response.setHeader("Refresh", "3");
		//response.getWriter().print(new Date());
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}
1.6 实现请求重定向

实现重定向相关的方法:
第一种方式:302和Location配合使用,实现重定向。
response.setStatus(302);
response.setHeader(“Location”,"/chapter04/login.html");
第二种方式:sendRedirect("/chapter04/login.html");

package cn.itcat.chapter04.repsponse;

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


@WebServlet("/loc")
public class Loc extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setStatus(320);
		response.setHeader("Location", "/chapter04/login.html");
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

2.HttpServletRequest请求对象

HttpServletRequest它是一个接口,它的父接口ServletRequest,在开发中,常用的是带协议的请求对象。
请求消息:请求行,请求头,请求参数。

2.1 HttpServletRequest请求对象

1.获取请求行消息的相关方法:
常用的请求行方法:
1.获取请求提交的方式: getMethod();
2.获取请求的协议: getProtocol();
3.获取项目名称:getContextPath();
4.获取servlet路径:getServletPath();
5.获取请求路径: getRequsetURI(),getRequestURL();
uri对应的值:/项目名称/servlet路径
url对应的值:http://localhost:8080/uri

2.获取请求消息头相关的方法

  1. 根据消息头,获取值: String value = getHeader(消息头的名称);
  2. 获取所有的消息头: Enumeration er = getHeaderNames();
    根据Referer请求消息头,做一个防盗链的案例:
    难点:怎么判断这个发起的下载请求是从别的网站上发起的?
    解决方法:根据Referer请求头对应的值,是否包含了服务器的名称
    如果包含,就说明是从本网站下载的,否则就不是。
    3.获取请求参数相关的方法:
    1.根据name属性值,获取用户输入的值:String value = getParameter(name属性对应的值);
    2.根据name属性值,获取用户选择的值:String[] vaules = getParameterValues(name属性对应的值);
    3.没有参数,获取所有值:Map map = getParameterMap();


例子:

package cn.itact.chapter04.request;

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


@WebServlet("/line")
public class RequestLine extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String method = request.getMethod();
		System.out.println("请求方式:"+method);
		String proto = request.getMethod();
		System.out.println("请求方式:"+proto);
		String contextpath = request.getMethod();
		System.out.println("请求方式:"+contextpath);
		String servletpath = request.getMethod();
		System.out.println("请求方式:"+servletpath);
		String pathURI = request.getMethod();
		StringBuffer pathURL =request.getRequestURL();
		System.out.println("RUI:"+pathURI + "RUL"+pathURL);
		
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

2.2.获取请求参数相关的方法:

1.根据name属性值,获取用户输入的值:String value = getParameter(name属性对应的值);
2.根据name属性值,获取用户选择的值:String[] vaules = getParameterValues(name属性对应的值);
3.没有参数,获取所有值:Map map = getParameterMap();

package cn.itact.chapter04.request;

import java.io.IOException;
import java.util.Enumeration;

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


@WebServlet("/head")
public class RequestHead extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html; charset=utf-8");
		Enumeration er=request.getHeaderNames();
		while(er.hasMoreElements()) {
			String name = er.nextElement();
			String value=request.getHeader(name);
			System.out.println("消息头:" +name+":" + value);
		}
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}
2. 3.解决请求参数的中文乱码问题:

中文乱码处理分两种情况:
第一种情况:处理get方式提交的中文乱码
使用的String的构造方法解决中文乱码:new String(字节数组,编码格式);
代码:String newvalue = new String(value.getBytes(“ISO8859-1”),“utf-8”);
第二种情况:处理post请求的中文乱码问题:
post提交,会把参数首先提交到request对象的缓冲区中,缓冲区默认编码是ISO8859-1,不支持中文
处理方法:把request缓冲区的编码给设置成支持中文的码表格式。
代码:request.setCharacterEncoding(“utf-8”);

package cn.itact.chapter04.request;

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


@WebServlet("/result")
public class RequestResultServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html; charset=utf-8");
		Object obj=request.getAttribute("company");
		String name=(String)obj;
		response.getWriter().print("公司名称"+name);
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

2.4.通过Requset对象传递数据

什么域对象:在一定的范围内,可以存值和取值。
request域对象:在一次请求中,可以存值和取值。

  • 存值: setAttribute(String key,Object obj);
    取值:Object obj = getAttribute(String key);
    移除: removeAttribute(String key);
3.RequestDispatcher接口

在开发中访问到一个web资源后,需要服务器跳转到另一个资源去处理请求,可以通过sendRedirect重定向
方法来实现,也可以RequestDispatcher转发对象的forward方法来实现。
得到转发对象:RequestDispatcher forwardObj = request.getRequestDispatcher(“另一个资源的路径”);
常用方法:
1.实现请求转发:forwardObj.forward(request,response);
2.实现请求包含:forwardObj.include(request,response);
1. 请求转发:
特点:发送了一次请求,响应一次,和request域对象配合使用,可以实现值的传递。
转发路径:转发动作是在服务器内部实现的,所以转发路径不要携带项目名称。
请求重定向:
特点:发送了两次请求,响应了两次,不能和request域对象配合使用。
重定向路径:重定向动作在浏览器端执行的,所以路径需要携带项目名称。
2.请求包含:
请求包含:在服务器内部完成的,路径不需要携带项目名称。

package cn.itact.chapter04.request;

import java.io.IOException;

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


@WebServlet("/forward")
public class RequestForwardServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		RequestDispatcher rd =request.getRequestDispatcher("/result");
		request.setAttribute("company", "huagong");
		rd.forward(request, response);
		
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

2020080605013

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5575994.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存