Servlet+JSP(八):Servlet的请求和响应处理

Servlet+JSP(八):Servlet的请求和响应处理

通过前面的学习我们能够创建并运行一个简单的Servlet 程序,完成浏览器和服务器的简单交互,但是我们编写的 Servlet代码是没有对浏览器的请求进行处理的。现在我们开始学习 如何使用Servlet进行浏览器请求的处理。

Request对象:

问题:

浏览器发起请求到服务器,会遵循HTTP协议将请求数据发送给服务器。 那么服务器接受到请求的数据改怎么存储呢?不但要存,而且要保证完成性。

解决:

使用对象进行存储,服务器每接受一个请求,就创建一个对象专门的存 储此次请求的请求数据。

实现:

request对象

解释:

服务器接收到浏览器的请求后,会创建一个Request对象,对象中 存储了此次请求相关的请求数据。服务器在调用Servlet时会将创建的 Request对象作为实参传递给Servlet的方法,比如:service方法。

使用:

获取请求头数据

获取请求行数据

获取用户数据

代码示例:

package com.bjsxt.servlet;

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;

/**
 * Servlet implementation class RequestServlet
 */

/**
 * request对象学习:
 * 		作用:request对象中封存了当前请求的所有请求信息
 * 		使用:
 * 			获取请求头数据
 * 					req.getMethod();//获取请求方式
 * 					req.getRequestURL();//获取请求URL信息
 * 					req.getRequestURI();//获取请求URI信息
 * 					req.getScheme();//获取协议
 * 			获取请求行数据
 * 					req.getHeader("键名");//返回指定的请求头信息
 * 					req.getHeaderNames();//返回请求头的键名的枚举集合
 * 			获取用户数据
 * 					req.getParameter("键名");//返回指定的用户数据
 * 					req.getParameterValues("键名");//返回同键不同值的请求数据(多选),返回的数组。
 * 					req.getParameterNames()//返回所有用户请求数据的枚举集合
 * 			注意:
 * 				如果要获取的请求数据不存在,不会报错,返回null。
 * 
 * 		注意:
 * 			request对象由tomcat服务器创建,并作为实参传递给处理请求的servlet的service方法。
 * @author MyPC
 *
 */
@WebServlet("/RequestServlet")
public class RequestServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//获取请求头数据
			//获取请求方式
				String method = req.getMethod();
				System.out.println(method);
			//获取请求URL
				StringBuffer url=req.getRequestURL();
				System.out.println(url);
				//获取URI(虚拟项目名和别名)
				String uri=req.getRequestURI();
				System.out.println(uri);
			//获取协议
				String h=req.getScheme();
				System.out.println(h);
		//获取请求行数据
			//获取指定的请求行信息
			String value=req.getHeader("aaa");
			System.out.println(value);
			//获取所有的请求行的键的枚举
			Enumeration e = req.getHeaderNames();
			while(e.hasMoreElements()){
				String name=(String) e.nextElement();
				String value2=req.getHeader(name);
				System.out.println(name+":"+value2);
			}
		//获取用户数据
			String name=req.getParameter("uname");
			String pwd=req.getParameter("pwd");
			System.out.println(name+":"+pwd);
			//String fav=req.getParameter("fav");
			String[] favs=req.getParameterValues("fav");
			if(favs!=null){
				for(String fav:favs){
					System.out.println(fav);
				}
			}
			//获取所有的用户请求数据的键的枚举集合---req.getParameterNames()	
	}
}

Response对象:

问题:

在使用Request对象获取了请求数据并进行处理后,处理的结果如何显 示到浏览器中呢?

解决:

使用Response对象

解释:

服务器在调用指定的Servlet进行请求处理的时候,会给Servlet的方 法传递两个实参request和response。其中request中封存了请求相关的 请求数据,而response则是用来进行响应的一个对象。

使用:

设置响应头

设置响应编码格式
设置响应实体

代码示例:

package com.bjsxt.servlet;

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;

/**
 * Servlet implementation class ResponseServlet
 */

/**
 * Respone对象学习:
 * 		作用:
 * 			用来响应数据到浏览器的一个对象
 * 		使用:
 * 			设置响应头
 * 				setHeader(String name,String value);//在响应头中添加响应信息,但是同键会覆盖
 * 				addHeader(String name,String value);//在响应头中添加响应信息,但是不会覆盖。
 * 			设置响应状态
 * 				sendError(int num,String msg);//自定义响应状态码。
 * 			设置响应实体
 * 				resp.getWrite().write(String str);//响应具体的数据给浏览器
 * 		设置响应编码格式:
 * 				resp.setContentType("text/html;charset=utf-8");
 * 		总结:
 * 			service请求处理代码流程:
 * 				设置响应编码格式
 * 				获取请求数据
 * 				处理请求数据
 * 					数据库操作(MVC思想)	
 * 				响应处理结果
 * @author MyPC
 *
 */
@WebServlet("/ResponseServlet")
public class ResponseServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
			//获取请求信息
				//获取请求头
				//获取请求行
				//获取用户数据
			//处理请求
				
			//响应处理结果
				//设置响应头
				resp.setHeader("mouse", "two fly birds");
				resp.setHeader("mouse", "bjsxt");
				resp.addHeader("key", "thinkpad");
				resp.addHeader("key", "wollo");
				//设置响应编码格式
					//resp.setHeader("content-type", "text/html;charset=utf-8");
					//resp.setContentType("text/plain;charset=utf-8");
					//resp.setContentType("text/xml;charset=utf-8");
					resp.setContentType("text/html;charset=utf-8");
				//设置响应状态吗
					//resp.sendError(404, "this Method is not supported");
				//设置响应实体
					resp.getWriter().write("<b>今天天气真好,适合学习</b>");
				
				
	}
}

请求乱码问题解决:

使用String进行重新编码:

uname=new String(uname.getBytes("iso8859-1"),"utf-8");

Get方式请求:

(方式一)在service方法中使用: req.setCharacterEncoding(“utf-8”);

(方式二)在tomcat服务器目录下的conf文件下找到server.xml文件,打开进 行如下配置:

Post方式请求:

在service方法中使用: req.setCharacterEncoding(“utf-8”);

流程总结:

Servlet的使用流程:

设置请求编码格式

设置响应编码格式

获取请求信息

处理请求信息

响应处理结果

数据流转流程:

浏览器------>服务器------->数据库

浏览器<------服务器<-------数据库

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值