JavaWeb世界(三):Servlet的请求和相应

一、HttpServletRequest常用方法

ServletRequest接口:请求对象,封装了所有请求信息(请求头,请求行,请求实体)的方法

HttpServletRequest接口:是ServletRequest的子接口,初拉力Http协议请求的方法

http://localhost:8080/day3/req?username=bob&age=17&hobby=basketball&hobby=Java
@WebServlet("/req")
public class HttpServletRequestDemo extends HttpServlet{

	private static final long serialVersionUID = -4261808368601543202L;
	protected void service(HttpServletRequest req, HttpServletResponse resp) 
			throws ServletException, IOException {
		System.out.println(req.getMethod());
		System.out.println(req.getRequestURI());
		System.out.println(req.getRequestURL());
		System.out.println(req.getContextPath());
		System.out.println(req.getRemoteAddr());
		String userAgent = req.getHeader("user-Agent");
		System.out.println(userAgent.contains("MSIE"));
		System.out.println(userAgent);
	}

}

(谷歌浏览器)输出结果为:

		System.out.println("-------------------------");
		System.out.println(req.getParameter("username"));
		String[] hobby = req.getParameterValues("hobby");
		System.out.println(Arrays.toString(hobby));
		Enumeration<String> names = req.getParameterNames();
		Map<String,String[]> paramMap = req.getParameterMap();
		while(names.hasMoreElements()) {
			String str = names.nextElement();
			System.out.println("--->" + str);
			System.out.println(Arrays.toString(paramMap.get(str)));
		}

输出为:

注意:

String getInitParameter(String name):获取初始化参数,初始化参数是开发人员设定的

String getParameter(String name):获取用户输入的参数,参数是不同用户通过表单输入的

二者是不同的。

二、注册案例

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h3>注册页面</h3>
	
	<form action="/day3/register" method="post">
		Account : <input type="text" name="username"/><br/>
		Password:<input type="password" name="password"/><br/>
		Gender:
			<input type="radio" name="gender" value="boy"/>Male
			<input type="radio" name="gender" value="girl"/>Female<br/>
		Hobby :
			<input type="checkbox" name="hobby" value="Java"/>Java
			<input type="checkbox" name="hobby" value="Basketball"/>Basketball
			<input type="checkbox" name="hobby" value="Coding"/>Coding<br/>
		
		City:<select>
				<option value="beijing">北京</option>
				<option value="Singapore">新加坡</option>
				<option value="qhd">秦皇岛</option>
			</select><br/>
		Introduction:<textarea rows="5" cols="15" name="intro"></textarea><br/>
		<input type="submit" value="SUBMIT">						
	</form>
</body>
</html>

相应的Servlet类:

@WebServlet("/register")
public class RegisterServlet extends HttpServlet{

	private static final long serialVersionUID = 3991857357459563658L;
	
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String username = req.getParameter("username");
		String password = req.getParameter("password");
		String gender = req.getParameter("gender");
		String city = req.getParameter("city");
		String intro = req.getParameter("intro");
		String[] hobby = req.getParameterValues("hobby");
		System.out.println("username:" + username);
		System.out.println("password:" + password);
		System.out.println("gender:" + gender);
		System.out.println("city:" + city);
		System.out.println("intro:" + intro);
		System.out.println("hobby:" + Arrays.toString(hobby));
	}

}

在表单输入后,POST请求的参数:                                                                    输出为:

             

三、处理请求中文乱码

出现这样的中文乱码。

在Tomcat中,对于GET和POST请求,都默认使用ISO-8859-1编码方式,该编码方式不支持中文。

解决方案:

1.按照 ISO-8859-1 编码把乱码恢复成二进制形式

2.再把二进制形式的数据使用UTF-8重新编码

protected void service(HttpServletRequest req, HttpServletResponse resp) 
			throws ServletException, IOException {
		String username = req.getParameter("username");
		String password = req.getParameter("password");
		byte[] datausername = username.getBytes("ISO-8859-1");
		byte[] datapassword = password.getBytes("ISO-8859-1");
		username = new String(datausername,"UTF-8");
		password = new String(datapassword,"UTF-8");
		System.out.println("username:" + username);
		System.out.println("password:" + password);
	}

         Bingo!

但是每一个参数都要写两行代码进行转码,如果有很多参数的时候,会非常麻烦。

解决方法:

1.对于POST请求,可以设置请求编码,需要在获取参数之前设置(只对POST有效);

req.setCharacterEncoding("UTF-8");

2.针对GET请求方式,可以修改Tomcat中server.xml(Line 70左右),对GET方法的默认编码

四、HttpServletResponse常用方法

ServletResponse接口:响应对象,封装了所有响应信息(请求头,请求行,请求实体)的方法

HttpServletResponse接口:是ServletResponse的子接口,初拉力Http协议响应的方法

protected void service(HttpServletRequest req, HttpServletResponse resp) 
			throws ServletException, IOException {
		OutputStream out = resp.getOutputStream();
		out.write("JavaWeb is interesting...".getBytes());
	}

但是用PrintWriter输出后,会有中文乱码问题:

	protected void service(HttpServletRequest req, HttpServletResponse resp) 
			throws ServletException, IOException {
		PrintWriter out = resp.getWriter();
		out.println("JavaWeb太有趣了");
	}

修改MIME类型和编码方式即可:

    resp.setContentType("text/html");
    resp.setCharacterEncoding("UTF-8");
    //或者直接用这一行表示:
    resp.setContentType("text/html;charset=UTF-8");
发布了40 篇原创文章 · 获赞 17 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42650988/article/details/95744448