- getMethod();获取请求方式
- getRemoteAddr() ;获取客户机的IP地址(知道是谁请求的)
- getContextPath(); 获得当前应用工程名(部署的路径);
- getRequestURI();获得请求地址,不带主机名
- getRequestURL();获得请求地址,带主机名
- getHeader(String name);
- User-Agent: 浏览器信息
- Referer:来自哪个网站(防盗链)
-
getParameter(name):获取指定单个参数
-
getParameterValues(name):同时指定多个参数
-
getParameterMap():获取所有参数
-
setCharacterEncoding(“UTF-8”):解决请求乱码问题
@WebServlet("/request_01") public class HttpRequest extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); //获取一个请求参数 String username = request.getParameter("username"); System.out.println(username); //获取多个请求参数 String[] hobbies = request.getParameterValues("hobby"); System.out.println(Arrays.toString(hobbies)); //获取所有请求参数 Map3.2 使用BeanUtils封装parameterMap = request.getParameterMap(); for (Map.Entry entry : parameterMap.entrySet()) { System.out.println(entry.getKey()); System.out.println(Arrays.toString(entry.getValue())); } } }
将获取的参数封装成一个类的成员属性
参数类
public class User implements Serializable { private String username; private String password; private String[] hobby; private String age; getter(); setter(); @Override public String toString() { return "User{" + "username='" + username + ''' + ", password='" + password + ''' + ", hobby=" + Arrays.toString(hobby) + ", age='" + age + ''' + '}'; } }
Servlet
@WebServlet("/beanutils") public class UtilsServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Map4. 请求转发 4.1 跳转parameterMap = request.getParameterMap(); User user = new User(); try { //调用接口进行封装 BeanUtils.populate(user, parameterMap); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } System.out.println(user); } }
在当前页面显示要跳转页面的内容,但只访问了当前Servlet一次
getRequestDispatcher("/路径").forward(request, response);4.2 作为域对象
设置和获取属性,但只能访问一次。因此若再一个Servlet1中使用了设置,再访问另一个Servlet1中是无法获得值的,因为相当于Servlet1和Servlet各访问了一次共访问了两次
因此当request作为域对象时,需要与跳转相结合
void setAttribute(String name, Object o); Object getAttribute(String name);
设置值
@WebServlet("/dispatcher") public class DispatcherServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setAttribute("name", "jay"); request.getRequestDispatcher("/getattr").forward(request, response); } }
获取值
@WebServlet("/getattr") public class GetAttrServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = (String) request.getAttribute("name"); System.out.println(name); } }二、Response 1. 响应行
响应行代表客户端访问的结果状态,常见的响应状态码
- 200 成功
- 302 重定向
- 304 读缓存
- 404 客户端错误
- 500 服务器错误
相关API:public void setStatus(int sc);:设置响应状态码
response.setStatus(403);2. 响应头 2.1 常见响应头
响应头是服务器指示浏览器去做什么
public void setHeader(String name, String value);:设置响应头
-
一个Key对应一个Value
-
一个Key对应多个Value
常用的响应头
- Refresh: 定时跳转 (eg:服务器告诉浏览器5s之后跳转到百度)
- Location:重定向地址(eg: 服务器告诉浏览器跳转到xxx)
- Content-Disposition: 告诉浏览器下载
- Content-Type:设置响应内容的MIME类型(服务器告诉浏览器内容的类型)
**response.setHeader(“refresh”,“秒数;url=跳转的路径”); **:几秒之后跳转到指定的路径上
response.setHeader("Refresh","3;url=https://www.baidu.com"); //3s后跳转到百度2.2 重定向
response.setHeader(“Location”, 重定向地址)
//1.设置状态码 response.setStatus(302); //2.设置重定向的路径(绝对路径,带域名/ip地址的,如果是同一个项目里面的,域名/ip地址可以省略) response.setHeader("Location","http://localhost:8080/day28/demo08"); response.setHeader("Location","/day28/demo08"); response.setHeader("Location","http://www.baidu.com");
response.sendRedirect(“重定向地址”);:封装了设置状态码和重定向两个功能
response.sendRedirect("http://localhost:8080/day28/demo08");2.3 重定向与请求转发
- 重定向的跳转是由浏览器发起的,且会发起两次请求,因此浏览器地址栏会变;请求转发是由服务器发起的,浏览器只请求了一次,因此浏览器地址栏不会变。
- 重定向时浏览器可以跳转到任意服务器资源,但不能访问服务器的WEB-INF中的资源;请求转发时浏览器可以访问包括web-INF中的任意资源,但无法跳转到别的服务器
- 重定向是response行为,无法使用request的域对象;请求转发是request行为,可以直接使用域对象。
相应 *** 作体的API,页面输出只能使用其中的一个流实现,两个流是互斥的.
3.1 字符输出流public PrintWriter getWriter() throws IOException;
- getWriter().write()输出字符串
- getWriter().print()既能输出字符串也能输出非字符串
@WebServlet("/demo04") public class ServletDemo04 extends HttpServlet { ... @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置服务器的响应字符集,避免乱码 response.setContentType("text/html;charset=UTF-8"); //要向浏览器输出响应体的信息,需要通过流来进行 *** 作 //第一种:字符串,输出文本内容 PrintWriter writer = response.getWriter(); //使用字符流往浏览器输出文本 //1. writer()方法,只能输出字符串,如果输出int、float等等类型的话,则会有问题 writer.write("你好世界"); //2. print()方法,可以输出数字、字符串 writer.print(8); } }3.2 字节输出流
字节输出流可以向浏览器输出任意类型资源
public ServletOutputStream getOutputStream() throws IOException;
@WebServlet("/demo05") public class ServletDemo05 extends HttpServlet { ... @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1. 读取b.jpg图片,将其转换成字节输入流,使用ServletContext ServletContext servletContext = getServletContext(); InputStream is = servletContext.getResourceAsStream("b.jpg"); //2. 使用字节输出流,将is中的字节都输出到浏览器 ServletOutputStream os = response.getOutputStream(); //注意:需要引入commons-io的jar包 IOUtils.copy(is,os); os.close(); is.close(); } }三、路径问题 1. URL
URL组成部分
- 协议 http://
- 服务器主机地址 localhost
- 服务器端口号 :8080
- 项目的虚拟路径(部署路径) responseDemo
- 项目上的具体资源路径 /pages/hello.html或/demo02(servlet映射路径)
使用完整URL场景
- 浏览器地址栏直接访问
- 当前项目访问另一个项目的资源
绝对路径:
- 请求转发只能访问项目内资源,因此即便写绝对路径也可以省略项目路径,如"/hello.html"
- 非请求转发的绝对路径写法"/项目部署路径/资源路径" 例如"/responseDemo/hello.html"
相对路径:
不以"/"开头的路径写法,它是以目标路径相对当前文件的路径,如
四、文件下载实例通过超链接方式下载(不推荐)
即将要下载的文件路径写到href属性中,如果浏览器不支持该格式文件,那么就会提示进行下载, 如果浏览器支持这个格式(eg: png, jpg…)的文件,那么直接打开,不再下载了
通过响应头指定浏览器下载
Content-Disposition: 告诉浏览器下载
@WebServlet("/download") public class DownloadServlet extends HttpServlet { ... @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.获取要下载的文件名 String filename = request.getParamter("filename"); //2.获取下载文件的流信息 InputStream is = request.getServletContext().getResourceAsStream("file/"+filename); //2.设置mimetype文件头 String mimetype = request.getServletContext().getMimeType(file); response.setHeader("Content-Type",mimeType); //4.设置下载的响应头 //对文件名进行utf8编码避免乱码 String ecodeFIlename = URLEcoder.encode(filename, "UTF-8"); response.setHeader("Content-Disposition","attachment;filename="+encodeFileName); //5.输出流数据 ServletOutputStream os = response.getOutputStream(); IOUtils.copu(is, os); //6.关闭资源 is.close(); os.close(); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)