request:用来封装HTTP请求消息
request作用
-
操作请求三部分(行,头,体)
-
请求转发
-
作为域对象存数据
获取客户机信息(操作请求行)
请求方式 请求路径(URI) 协议版本
GET /day17Request/WEB01/register.htm?username=zs&password=123456 HTTP/1.1
-
getMethod();获取请求方式
-
getRemoteAddr() ;获取客户机的IP地址(知道是谁请求的)
-
getContextPath();获得当前应用工程名(部署的路径);
-
getRequestURI();获得请求地址,不带主机名
-
getRequestURL();获得请求地址,带主机名
-
getServerPort();获得服务端的端口
-
getQueryString();获的请求参数(get请求的,URL的?后面的. eg:username=zs&password=12345
-
getHeader(String name);
-
User-Agent: 浏览器信息
-
-
操作请求体:
一、操作请求参数:
描述 | |
---|---|
String getParameter(String name) | 获得指定参数名对应的值。如果没有则返回null,如果有多个获得第一个。 例如:username=jack |
String[] getParameterValues(String name) | 获得指定参数名对应的所有的值。此方法专业为复选框提供的。 例如:hobby=抽烟&hobby=喝酒&hobby=敲代码 |
Map<String,String[]> getParameterMap() |
//解决post方式乱码问题,get方式优化了,不会有乱码问题 request.setCharacterEncoding("utf-8"); //获得一个值的情况(获得用户名和密码) String usname = request.getParameter("username"); String password = request.getParameter("password"); System.out.println(usname + ":" + password); System.out.println("---------------------------"); //获取多个值的情况 String[] hobbyArray = request.getParameterValues("hobby"); String hobbyStr = Arrays.toString(hobbyArray); System.out.println(hobbyStr); //获得所有key和值,得到Map Map<String, String[]> map = request.getParameterMap(); Set<String> keySets = map.keySet(); for (String keySet : keySets) { String[] strings = map.get(keySet); System.out.println(keySet+":"+Arrays.toString(strings)); }
使用java包的方式:
public class User implements Serializable { private String username; private String password; private String gender; private String[] hobby; ..... ----------------------- //获得所有的请求参数 Map<String, String[]> parameterMap = request.getParameterMap(); //将请求参数封装到User对象中 User user = new User(); //使用BeanUtils框架自动将map中的数据封装到对象中 try { BeanUtils.populate(user,parameterMap); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); }
//注意:java包放在WEB-INF中
requet作为域对象存取值:
相比ServletContext:
- ServletContext:的范围是整个应用的,(无论请求多少次,只要在这个应用里就可以)
- requte:只能在同一次请求中进行数据共享
发送 String username = "周杰"; request.setAttribute("name", username); //请求跳转到ServletDemo03 request.getRequestDispatcher("demo22").forward(request,response); ---------------------------------- 取 System.out.println(request.getAttribute("name"));
response:
常用状态码:
-
-
302 重定向
-
304 读缓存
-
404 客户端错误
-
常用的响应头
Refresh: 定时跳转 (eg:服务器告诉浏览器5s之后跳转到百度)
Location:重定向地址(eg: 服务器告诉浏览器跳转到xxx)
Content-Disposition: 告诉浏览器下载
Content-Type:设置响应内容的MIME类型(服务器告诉浏览器内容的类型)
重定向:
response.setStatus(302); response.setHeader("Location", "https://www.baidu.com");
解决字符流输出中文乱码问题
response.setContentType("text/html;charset=utf-8");
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获得客户端要下载的那个文件名 String fileName = request.getParameter("fileName"); //设置下载文件的mime-type String mimeType = getServletContext().getMimeType(fileName); response.setHeader("Content-Type",mimeType); //使用字节输入流读取客户端要下载的那个文件 InputStream resourceAsStream = getServletContext().getResourceAsStream("file/" + fileName); //使用字节输出流,将图片输出到浏览器 ServletOutputStream outputStream = response.getOutputStream(); //输出前,通过响应头的方式,只是客户端下载文件 String encode = URLEncoder.encode(fileName, "UTF-8"); //我们先将fileName进行URL编码: response.setHeader("Content-Disposition","attachment;filename="+encode); IOUtils.copy(resourceAsStream, outputStream); resourceAsStream.close(); outputStream.close(); }