Cheug's Blog

当前位置:网站首页 / JAVA / 正文

Request&Response

2019-05-16 / JAVA / 968 次围观 / 0 次吐槽 /

HttpServletResponse

Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象

    响应正文(主体)

                    getWrite(); 字符输出流

                    getOutputStream(); 字节输出流

    响应编码

            案例:向客户端输出中文

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
        throws ServletException, IOException {
            // 设置响应类型和字符编码为UTF-8, 这样支持汉字显示
            //  resp.setContentType("text/html");
            //  resp.setCharacterEncoding("UTF-8");
            
            //设置客户编码类型
            resp.setHeader("Content-Type", "text/html;charset=utf-8");
            //不设置编译类型,默认编码发送数据 ISO-8859-1(没有中国二字编码),此时会发生乱码
            resp.getWriter().write("hello你好");
}

    响应状态码

                常见的状态码参照:http://tool.oschina.net/commons?type=5

                404 请求失败,请求所希望得到的资源未被在服务器上发现

                200 请求已成功,请求所希望的响应头或数据体将随此响应返回。

                302 重定向

                500 服务抛出异常

    Ø 掌握如何设置状态响应码


        image.png

 设置客户端不需要缓存

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse response) 
    throws ServletException, IOException {
        //浏览器刷新时就不会有缓存
        response.addHeader("Pragma", "no-cache"); 
        response.setHeader("Cache-Control", "no-cache"); 
        response.setHeader("Expires", "0");
        ValidateCode code = new ValidateCode(WIDTH, HEIGHT, 4, 6);
        
        code.write(response.getOutputStream());
}

  自动刷新功能

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {
            // TODO Auto-generated method stub
            response.setContentType("text/html;charset=UTF-8");
            //response.setHeader("Refresh", "1");//每隔一秒刷新一次
            
            response.setHeader("Refresh", "5;URL=index.html");//3秒后转到另一页面
            response.getWriter().write("注册成功!3秒后会自动跳转,苦没有中转点击<a href='index.html'>这里</a>");
}

  请求重定向

            请求重定向指:一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向。

            重定向特点:地址栏会变并发送2次请求,增加服务器负担

            实现方式

            response.sendRedirect()

            实现原理:

            302/307状态码和location头即可实现重定向

             

            转发特点:地址栏不会变,客户端发送一次请求

  response细节

            getOutputStreamgetWriter方法分别用于得到输出二进制数据、输出文本数据

             

            getOutputStreamgetWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。  会抛异常。

             

            Servlet程序向ServletOutputStreamPrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。

             

            Serlvetservice方法结束后,Servlet引擎将检查getWritergetOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。 

HttpServletRequest

    HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。

    request常用方法

    获得客户端信息

    Ø getRequestURL方法返回客户端发出请求时的完整URL

    Ø getRequestURI方法返回请求行中的资源名部分。

    Ø getQueryString 方法返回请求行中的参数部分。

    Ø getRemoteAddr方法返回发出请求的客户机的IP地址

    Ø getRemoteHost方法返回发出请求的客户机的完整主机名

    Ø getRemotePort方法返回客户机所使用的网络端口号

    Ø getLocalAddr方法返回WEB服务器的IP地址。

    Ø getLocalName方法返回WEB服务器的主机名

    Ø getMethod得到客户机请求方式

    获得客户端请求头

    Ø getHeader(name)方法

    Ø getHeaders(String name)方法

    Ø getHeaderNames方法 

    获得客户端请求参数(客户端提交的数据)

    Ø getParameter(name) //获取参数的值 

    Ø getParameterValuesString name)//获取一个参数的多个值

    Ø getParameterNames //获取所有参数的名字 

    Ø getParameterMap  //获取所有参数和值,并且存入map中

                Map<String,String[]> map = request.getParameterMap();

    Ø getInputStream //以字节读取数据 post

Request的应用

  获取表单数据一

                       通过getParametergetParameterValues获取请求参数

                     掌握POSTGET请求解决乱码的方案

                     掌握表单提交通过都用POST方法


protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
				String username = req.getParameter("username");
				String password = req.getParameter("password");
				String gender = req.getParameter("gender");
				String remarks = req.getParameter("remarks");
				String[] hobby = req.getParameterValues("hobby");
				

		}
		@Override
		protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//			String username = req.getParameter("username");
//			String password = req.getParameter("password");
//			String gender = req.getParameter("gender");
//			String remarks = req.getParameter("remarks");
//			String[] hobby = req.getParameterValues("hobby");
//			
			
			ServletInputStream servlet = req.getInputStream();
			byte[] buf = new byte[1024];
			int len = 0;
			while((len = servlet.read(buf)) != -1) {
				//buf转字符串
				String s = new String(buf,0,len);
				//url解码
				s = URLDecoder.decode(s,"utf-8");
				System.out.println(s);
			}
		}

                GET请求中,tomcat8不会有乱码,tomcat7会有乱码

                因为tomcat7的接收参数时采用了IOS-8859-1编码

   获取表单数据二

            image.png

            image.png

            获取表单数据三

                        通过beanutils来封装请求参数,首先需要导入下面两个包

                            commons-logging-1.1.1.jar

                                commons-beanutils-1.8.3.jar

                image.png

  获取原始表单数据

        通过InputStream来获取最原始的表单数据


        image.png


实现请求转发

请求转发指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。

request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。

request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。

        setAttribute方法

        getAttribute方法  

        removeAttribute方法

            getAttributeNames方法

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//跳转到web2
		request.getRequestDispatcher("/web2").forward(request, response);
		
	}

实现请求重定向

            重定向机制的运作流程

            1、用户在浏览器端输入特定URL,请求访问服务器端的某个组件

            2、服务器端的组件返回一个状态码为302的响应结果。

            3、当浏览器端接收到这种响应结果后,再立即自动请求访问另一个web组件

            4、浏览器端接收到来自另一个web组件的响应结果。

    HttpServeltResponsesendRedirect(String location)用于重定向

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//重定向
		String path = request.getContextPath();//上下文路径
		response.sendRedirect(path + "/web");//跳转需要加上全部路径
	}

转发和重定向的区别

            域对象:session,request,page。。。

            :区间、范围

            Ø 重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。

            Ø 转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。


Powered By Cheug's Blog

Copyright Cheug Rights Reserved.