javaee中request与response分不清以及请求转发
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class demo5 extends HttpServlet {
- /**
- *路劲问题:
- * 首先给每个需要写路径的地方带上一个/,然后区分
- * 1)服务器行为 :则斜杠就代表是在项目下的地方,需要访问什么路劲便可以直接填写
- * 2)浏览器行为 :则斜杠就代表是在webapps下,但是不确定是在什么项目,所以路径需要先填写一个项目名
- */
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- //请求转发,属于服务器行为
- request.getRequestDispatcher("/index.jsp").forward(request, response);
- //响应重定向,属于浏览器行为
- response.sendRedirect("/Myitcast_day05/index.jsp");
- //读取web应用的文件,属于服务器行为
- this.getServletContext().getRealPath("/index.jsp");
- this.getServletContext().getResourceAsStream("/index.jsp");
- //超链接,属于在浏览器发送请求,是浏览器行为
- //<a href="/Myitcast_day05/index.jsp">点击</a>
- //表单提交,也是在浏览器发送请求,是浏览器行为
- //<form action="/Myitcast_day05/index.jsp"></form>
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request, response);
- }
- }
二、根据在视图层显示字符数据
- import java.io.IOException;
- import java.io.OutputStream;
- import java.io.PrintWriter;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class demo6 extends HttpServlet {
- /**
- *显示数据字符给视图
- */
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- //告诉浏览器以utf-8的形式输出内容,但是浏览器的码表却没有改
- //所以一般是设置setContentType这个方法,这个方法便可以省略了
- response.setCharacterEncoding("UTF-8");
- //输出的内容以html形式,text/html也是浏览器默认设置的形式
- response.setContentType("text/html;charset=utf-8");
- //输出响应头信息content-type为text/html;charset=utf-8,这个方法是总的方法
- //当输出了setContentTy这个方法便不用输出这个
- response.setHeader("content-type","text/html;charset=utf-8");
- //把输出的内容换成xml的形式输出
- response.setContentType("text/xml;charset=utf-8");
- //在浏览器输出内容的时候查询的码表是ISO-8859-1,不支持中文,所以需要转码表
- //PrintWriter out = response.getWriter();
- //out.write("暴龙");
- OutputStream out = response.getOutputStream();
- out.write("暴龙".getBytes()); //这个字节码的形式输出参照的码表是GBK,所以需要转换为utf-8来输出
- out.write("暴龙".getBytes("UTF-8"));
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request,response);
- }
- }
三、在视图层下载数据给用户
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.OutputStream;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class demo7 extends HttpServlet {
- /**
- * 在浏览器下载给用户
- */
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- //读取服务器发布的内容,创建成一个文件
- String path = this.getServletContext().getRealPath("/attach/hibernate.zip");
- File file = new File(path);
- //设置响应头content-disposition来设置下载的形式
- response.setHeader("content-disposition", "attachment; filename="+file.getName());
- //读文件并按照流的方式输出
- FileInputStream in = new FileInputStream(file);
- OutputStream out = response.getOutputStream();
- byte[] b = new byte[512];
- int length = 0;
- while((length=in.read())!=1){
- out.write(b, 0, length);
- }
- out.close();
- in.close();
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request, response);
- }
- }
四、关于request和response的刷新转发重定向的问题
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class demo8 extends HttpServlet {
- /**
- * The doGet method of the servlet. <br>
- *
- * This method is called when a form has its tag value method equals to get.
- *
- * @param request the request send by the client to the server
- * @param response the response send by the server to the client
- * @throws ServletException if an error occurred
- * @throws IOException if an error occurred
- */
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- //设置响应头为refresh,当值为整数时候,表示当多少秒时该网页会自动刷新
- response.setHeader("refresh", "3");
- //当值为整数;url=xxxx,表示当多少秒后会刷新到url指定的页面
- response.setHeader("refresh", "3;url=/Myitcast_day05/index.jsp");
- //设置响应头location,表示会转发到后面指定的url页面,常常配合状态码302
- response.setHeader("location", "/Myitcast_day05/index.jsp");
- response.setStatus(302);
- //整个web应用只有一个servletContext对象,
- //放入ServletContet的数据常驻内存的,一般是不用这个属性的
- this.getServletContext().setAttribute("p", "9");
- //另一个域对象:HttpServletRequest对象
- //注意:只需要使用1次的数据,可以用request对象共享出去
- request.setAttribute("p", "9");
- //request的请求转发是可以得到共享数据的,但是response的重定向是不可以的
- request.getRequestDispatcher("/demo4").forward(request, response);
- response.sendRedirect("/Myitcast_day05/demo4");
- //request能够得到在request域中存放的共享数据
- request.getAttribute("p");
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request, response);
- }
- }
最后的总结:
responset的重定向和request的转发的区别:
请求重定向:
1)浏览器一共发出了2次请求
2)浏览器行为
3)地址栏会改变,变成了去到的地址
4)请求重定向不能通过request共享数据
请求转发:
1)浏览器只发出1次请求
2)服务器行为
3)地址栏不会改变的!
4)请求转发可以通过request共享数据