一、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");