JavaWeb-04 请求和响应1

1.HttpServletResponse 对象

1.1发送状态码的相关方法

setStatus(int status):该方法用于设置HTTP响应消息的状态码。并生成响应状态行。

sendError(int sc):该方法用于发送表示错误信息的状态码。例如,404状态码表示找不到客户端请求的资源。

1.2发送响应消息体相关的方法

1.getOutputStream()方法
该方法所获取的字节输出流对象为 ServletOutputStream 类型。用于输出二进制格式的响应正文。
2.getWriter()方法
该方法所获取的字符输出流对象为PrintWriter类型。用于输出内容全为字符文本的网页文档。

在Eclipse中创建Web项目chapter04,在项目的src目录下,新建一个名称为pidan.response的包,在包中编写一个名为PrintServlet的Servlet类

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String data = "pidan";
		OutputStream out = response.getOutputStream();
		out.write(data.getBytes());
	}

在 web.xml中配置完PrintServlet的映射后,启动Tomcat 服务器,访问PrintServlet

2.HttpServletResponse 应用 

 解决输出乱码问题

1.创建Servlet
在chapter04项目的pidan.chapter04.response包中编写一个名为PidanServlet的类,在该类中定义一个中文字符串,然后使用字符输出流输出

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String data = "皮蛋";
        <!---->
		PrintWriter out = response.getWriter();
		out.println(data);
	}

在 web.xml中配置完PidanServlet的映射后,启动Tomcat 服务器,访问PidanServlet

 发生了乱码问题。原因是response对象的字符输出流在编码时,采用的是ISO-8859-1的字符码表,该码表并不兼容中文。为了解决上述编码错误,在上面代码备注处增加一行代码,设置字符编码使用的码表为UTF-8

response.setCharacterEncoding("utf-8");

 再次访问PidanServlet,这是由于浏览器解码错误导致的。

使用HttpServletResponse对象来解决乱码问题

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		String data = "皮蛋";
		PrintWriter out = response.getWriter();
		out.println(data);
	}

启动Tomcat 服务器,  访问PrintServlet

实现网页定时刷新并跳转

在chapter04项目的pidan.response包中编写一个名为RefreshServlet的类,该类使用response对象的setHeader()方法实现网页的定时刷新并跳转的功能

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setHeader("Refresh","2;URL=https://blog.csdn.net/PiDan_6");
	}

 在 web.xml中配置完RefreshServlet 映射后,启动Tomcat 服务器,在浏览器访问RefreshServlet,发现浏览器2 秒后自动跳转到了本人博客的首页

 对文件进行修改,使当前页面每隔3秒自动刷新一次

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setHeader("Refresh","3");
		response.getWriter().println(new java.util.Date());//输出当前时间
	}

启动Tomcat 服务器,在浏览器访问RefreshServlet,可以看到浏览器每隔3秒刷新一次,并且输出了当前的时间。

实现请求重定向

为了实现请求重定向,在HttpServletResponse 接口中,定义了一个sendRedirect()方法,该方法用于生成302响应码和Location响应头,从而通知客户端重新访问Location响应头中指定的URL。

(1)在chapter04项目的WebContent目录下编写用户登录的页面login.html和登录成功的页面welcome.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action=" /chapter04/LoginServlet" method="post">
		用户名:<input type="text" name="username" /><br>
		密&nbsp;&nbsp;&nbsp;码:<input type="password" name="password" /><br>
		<input type="submit" value="登录" />
	</form>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	登陆成功!
</body>
</html>

(2)在pidan.response包中编写一个名为LoginServlet 的类,用于处理用户登录请求

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		//设用户名和密码分别为:pidan  123456
		if (("pidan").equals(username) &&("123456").equals(password)) {
				//如果用户名和密码正确,重定向到welcome.html
				response.sendRedirect("/chapter04/welcome.html");
				}else {
				//如果用户名和密码错误,重定向到login.html
				response.sendRedirect("/chapter04/login.html");
				}
	}

在 web.xml中配置完LoginServlet 映射后,启动Tomcat 服务器

 用户名“pidan”。

 密码“123456”,

单击登录按钮

3.HttpServletRequest对象

获取请求行信息的相关方法

在chapter04项目的src目录下,新建一个名称为pidan.request的包,在包中编写一个名为RequestLineServlet的类,该类中编写了用于获取请求行中相关信息的方法,如文件4-10所示。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter ();
		//获取请求行的相关信息
		out.println("getMethod : " + request.getMethod() + "<br />");
		out.println("getRequestURI : " + request.getRequestURI () + "<br />");
		out.println("getQuerystring:"+request.getQueryString() + "<br />");
		out.println("getProtocol : " + request.getProtocol() + "<br />");
		out.println("getContextPath:"+request.getContextPath() + "<br />");
		out.println("getPathInfo :" + request.getPathInfo() + "<br />");
		out.println("getPathTranslated :" + request.getPathTranslated() +"<br>");
		out.println("getServletPath:"+request.getServletPath() + "<br />");
		out.println("getRemoteAddr : " + request.getRemoteAddr () + "<br />");
		out.println("getRemoteHost : " + request.getRemoteHost() + "<br />");
		out.println("getRemotePort : " + request.getRemotePort() + "<br />");
		out.println("getLocalAddr : " + request.getLocalAddr () + "<br />");
		out.println ("getLocalName : " + request.getLocalName () + "<br />");
		out.println("getLocalPort : " + request.getLocalPort () + "<br />");
		out.println("getServerName : " + request.getServerName () + "<br />");
		out.println("getServerPort : " + request.getServerPort () + "<br />");
		out.println("getScheme : " + request.getScheme() + "<br />");
		out.println("getRequestURL : " + request.getRequestURL() + "<br />");
		}

 在 web.xml中配置完RequestLineServlet 映射后,启动Tomcat 服务器

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

 在pidan.request包中编写一个名为RequestHeadersServlet的类,使用getHeaderNames()方法来获取请求消息头信息

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		Enumeration headerNames = request.getHeaderNames();
		while (headerNames.hasMoreElements()) {
			String headerName = (String) headerNames.nextElement();
			out.print(headerName + " : "+ request.getHeader(headerName)+"<br />");
		}
	}

 在 web.xml中配置完 RequestHeadersServlet 映射后,启动Tomcat服务器

 4.HttpServletRequest 应用

在HttoServletReauest 接口的父类ServletRequest中,定义了一系列获取请求参数的方法

(1)在chapter04项目的WebContent根目录下编写一个表单文件form.html

<body>
	<form action="/chapter04/RequestParamsServlet" method="POST">
		用户名:	<inputtype ="text"name="username"><br />
		密&nbsp;&nbsp;&nbsp;码:<input type="password" name="password"><br />
		爱好:
		<input type="checkbox" name="hobby" value="sing">唱歌
		<input type="checkbox" name="hobby" value="dance">跳舞
		<input type="checkbox" name="hobby" value="football">足球<br />
		<inputtype ="submit" value="提交">
	</form>
</body>

(2)在pidan.request包中编写一个名称为RequestParamsServlet的Servlet类,使用该Servlet获取请求参数

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String name =request.getParameter("username");
		String password = request.getParameter("password");
		System.out.println("用户名:" + name);
		System.out.println("密  码:"+ password);
		String[] hobbys = request.getParameterValues("hobby");
		System.out.print("爱好:");
		for (int i = 0; i<hobbys.length; i++) {
			System.out.print(hobbys[i]+", ");
		}
	}

在 web.xml中配置完 RequestParamsServlet 映射后,访问form.html页面并填写表单相关信息

 单击【提交】按钮,在Eclipse的控制台打印出了每个参数的信息

解决请求参数的中文乱码问题

在HttpServletRequest接口中,提供了一个setCharacterEncoding()方法,该方法用于设置request对象的解码方式。对RequestParamsServlet.java进行修改

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");<!--添加这一行-->
......

启动Tomcat服务器,再次访问 form.html页面,输入中文用户名“皮蛋”以及相关表单信息

 RequestDispatcher 对象的应用

在chapter04项目的pidan.request包中编写一个名为RequestForwardServlet的Servlet类,该类使用forword()方法将请求转发到一个新的Servlet页面

public class RequestForwardServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		request.setAttribute("company", "重庆化工职业学院");
		RequestDispatcher dispatcher =request.getRequestDispatcher("/ResultServlet");
		dispatcher.forward(request, response);
	}

 在 pidan.request包中编写一个名为ResultServlet的Servlet类,该类用于获取RequestForwardServlet 类中保存在request对象中的数据并输出

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		String company = (String) request.getAttribute("company");
		if (company != null) {
			out.println("学校名称:" + company + "<br>");
		}
	}

 在web.xml中,添加完两个Servlet的映射信息后,启动Tomcat 服务器,在浏览器中访问RequestForwardServlet

可以看出,地址栏中显示的仍然是RequestForwardServlet的请求路径,但是浏览器中却显示出了ResultServlet中要输出的内容。这是因为请求转发是发生在服务器内部的行为,从RequestForwardServlet到ResultServlet属于一次请求,在一次请求中是可以使用request属性来进行数据共享的。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值