Servlet学习之请求处理,乱码问题

Servlet的请求处理

如何使用Servlet对浏览器发来的请求进行处理呢?

  • request对象
  • response对象
  • Servlet的使用流程

request对象

问题:

  浏览器发送请求到服务器,会遵循Http协议将请求数据发送给服务器,服务器用什么方法去存储呢,在存储过程中必然要保证请求数据的完整性,如何实现呢?

解决:

  在java编程中,想到存储数据我们能够想到的就是使用变量,或常量或使用对象来存储数据,在servlet中采取的就是使用对象来存储数据,对于请求数据使用request来存储数据,对于回应数据使用response来存储.服务器在没接收到一个请求后,就会创建一个对象专门存储此次的请求数据.

解释:

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

 

request对象的常见使用:

  1.获取请求方式

  2.获取协议

  3.获取请求URL

  4.获取请求URI

  5.获取指定的请求行信息

  5.获取所有的请求行的键值

  6.获取用户数据

package cn.csuft.poorguy;

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("/MyServletText")
public class MyServletText extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) 
			throws ServletException, IOException {
		
	//获取请求头数据
		//获取请求方式
		String method = req.getMethod();
		System.out.println("请求方式为: "+method);
		
		//获取协议
		String scheme = req.getScheme();
		System.out.println("协议为: "+scheme);
		
		//获取请求URL
		StringBuffer url = req.getRequestURL();
		System.out.println("请求URL: "+url);
		
		//获取URI
		String uri = req.getRequestURI();
		System.out.println("请求URI: "+uri);
		
	//获取请求行数据
		//获取指定的请求行信息
		String value =  req.getHeader("connection");
		System.out.println("connection:"+value);
		
		//获取所有请求行的键的枚举
		Enumeration e = req.getHeaderNames();
		while (e.hasMoreElements()) {
			System.out.println(e.nextElement());
		}
		
		//获取用户数据
		String name = req.getParameter("name");
	}
}

  

运行结果:

请求方式为: GET
协议为: http
请求URL: http://localhost:8080/MyServletText/MyServletText
请求URI: /MyServletText/MyServletText
connection:Keep-Alive
accept
accept-language
cache-control
ua-cpu
accept-encoding
user-agent
host
connection

  

使用:

  1.获取请求头数据

  2.获取请求行数据

  3.获取用户数据

response对象

问题:

  再servlet处理完请求数据后,如何响应到浏览器上呢?

解决:

  使用response对象

解释:

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

response对象的常用方法:

  1.设置编码方式

  2.设置请求头

  3.设置错误信息

  4.设置输出信息到浏览器

package cn.csuft.poorguy;

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("/MyServletText")
public class MyServletText extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) 
			throws ServletException, IOException {
		
		//设置编码方式
		resp.setCharacterEncoding("utf-8");
		
		//设置请求头(同一个键名会替换)
		resp.setHeader("mouse", "two fly birds");
		resp.setHeader("mouse", "asus");
		
		//设置请求头(同一个键名,不替换)
		resp.addHeader("key", "thinkpad");
		resp.addHeader("key", "wollow");
		
		//设置错误信息
		//resp.sendError(404, "this method is not supported");
		
		//设置输出打印到浏览器
		resp.getWriter().write("<h1>今天天气很好,适合学习</h1>");
	}
}

  

运行结果:

 

 注意:

    由上面的浏览器请求头可以看出,使用setHeader会使相同键的值进行替换,使用addHeader会使相同键的值不替换.

乱码问题解决

  1. 使用String进行重新编码
  2. Get方式的请求
  3. Post方式的请求
  4. 设置响应编码格式

使用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”); 

设置响应编码格式

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

 Servlet的使用流程

流程:

  1.设置请求编码格式

  2.设置响应编码格式

  3.获取请求信息

  4.处理请求信息

  5.响应处理结果

数据流转流程:

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

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

解释:

  浏览器与服务器之间的数据传输会用到Http协议

  再服务器处理请求时会用到数据库

 

 

 

 

posted @ 2019-02-11 14:19  Bug研发工程师  阅读(264)  评论(0编辑  收藏  举报