【JavaWeb阶段学习】HttpServletRequest和HttpServletResponse

(❁´◡`❁)您的点赞➕评论➕收藏⭐是作者创作的最大动力

支持我:点赞+收藏⭐️+留言

目录

1】HttpServletRequest对象

常用方法

1.1】域对象

1.2】RequestDispatcher接口★★★★★

1.2.1】常用方法

1.2.2】常用方法其他方法

1.3】重定向和转发的区别★★★★★

1.4】其他重点方法

1.5】请求乱码问题★★★★★

2】HttpServletResponse

2.1】JavaWeb核心阶段最常用的方法★★★★★

2.1.1】 response.sendRedirect(String url)重定向

2.1.2】 response.setContentType("text/html;charset=utf-8")

2.1.3】response.getWriter()

2.1.4】response.addCookie(cookie)

2.1.5】response.setHeader("key","value")

2.1.6】response.setCharacterEncoding("utf-8")


 

1】HttpServletRequest对象

常用方法

  • String request.getParameter(String name)

    • 该方法用于获取某个指定名称的参数值,如果请求消息中没有包含指定名称的参数,getPrameter()方法返回null;如果指定名称的参数存在但没有设置值,则返回一个空串;如果请求消息中包含有多个该指定名称的参数,getPrameter()方法返回第一个出现的参数值。

  • String getMethod()

    • 该方法用于获取HTTP请求消息汇总的请求方式(如GET,POST等)。

  • String getContextPath()

    • 该方法用于获取请求URL中属于WEB应用程序的路径,这个路径以"/"开头,表示相对于整个WEB站点的根目录,路径结尾不含"/"。如果请求URL属于WEB站点的根目录,那么返回结果为空字符串("")

  • String setCharacterEncoding()

    • 该方法用于设置request对象的解码方式。默认情况下只对POST请求乱码有效。

  • HttpSession getSession()

    • 返回与这个请求对象联系的当前session对象,如果这个请求没有一个session,就创建一个。

  • Cookie[] getCookies()

    • 返回一个客户端通过当前request请求携带来的包含所有cookie对象的数组。

1.1】域对象

request作为域对象时,其域对象范围为一次请求中有效

思考:这是接触的第二个域对象,那么你还记得第一个域对象是谁吗?你能说出两个域对象的区别吗?若我在request域中存储了数据之后接着来了一个重定向,那么重定向后的页面还能获取到request域中的数据吗?ServletContext域呢?好好想一想~~

常用方法

  • setAttribute()方法

    • 该方法用于将一个对象与一个名词关联后存储进ServletRequest对象中

  • getAttribute()方法

    • 该方法用于从ServletRequest对象中返回指定名称的属性对象。

其他方法

  • removeAttribute()

    • 该方法用于从ServletRequest对象中删除指定名称的属性

  • getAttributeNames()

    • 该方法用于返回一个包含ServletRequest对象中所有属性名的Enumeration对象,在此基础上,可以对ServletRequest对象中的所有属性进行遍历处理。

1.2】RequestDispatcher接口★★★★★

1.2.1】常用方法

  • getRequestDispatcher(String path)

    • 返回封装了某个路径所指定资源的RequestDispatcher对象。其中,参数path以"/"开头时,用于表示当前Web应用的根目录(即:localhost:8080/项目名/)。需要注意的是,WEB-INF目录中的内容对RequestDispatcher对象也是可见的,因此,传递给getRequestDispatcher(String path) 方法的资源可以是WEB-INF目录中的文件。若不加"/",代表相对路径,相对于当前Servlet所在路径进行拼接。当为相对路径时,reqeust.getRequestDispatcher("jsp/index.jsp"),当前Servlet的层级路径为localhost:8080/项目名/ttt/test 那么转发的路径就为localhost:8080/项目名/ttt/jsp/index.jsp

  • forward(ServletRequest request,ServletResponse response)

    • 该方法用于将请求从一个Servlet传递给另外的一个Web资源。在Servlet中,可以对请求做一个初步处理,然后通过调用这个方法,将请求传递给其他资源进行响应。需要注意的是,该方法必须在响应提交给客户端之前被调用,否则将抛出IllegalStateException异常

1.2.2】常用方法其他方法

  • include(ServletReqeust reqeust,ServletResponse response)

    • 该方法用于将其他资源作为当前响应内容包含进来。

1.3】重定向和转发的区别★★★★★

  • 转发如下图:

【JavaWeb阶段学习】HttpServletRequest和HttpServletResponse_第1张图片

  • 重定向如下图:

【JavaWeb阶段学习】HttpServletRequest和HttpServletResponse_第2张图片

  • 区别:请求转发 客户端只发出了一次请求,到了Servlet1产生过request对象与response对象后即便请求转发到了下一个Servlet2(或者jsp)request及response对象还是没变 重定向 首先客户端发出一个请求到达Servlet1,这时候产生了request对象及response对象,当重定向后浏览器再次向服务器发出一次新的请求,这时候又会产生一个新的request对象和一个新的response对象

    • 重定向的地址栏会发生变化,转发的地址栏不变

    • 重定向两次请求两次响应,转发一次请求一次响应

    • 重定向路径需要加工程名,转发的路径不需要加工程名

    • 重定向可以跳转到任意网站,转发只能在服务器内部进行转发

  • 看完重定向与转发的区别后不知道你有没有对上面那个思考题能够自己做出来,而且有一个清晰的解释,若是先把数据存在request域,然后进行重定向,因为重定向时会再次发出一次新的请求,当重定向会目标页面后,此时的request及response对象就不再是原来那两个了,因此将数据存储到request域再进行重定向的话,会造成数据遗失,存储无效的结果。但是,若是将数据存储到ServletContext域,因为ServletContext域范围为整个应用,只要当前web应用正常运行,数据就不会自动遗失,就可以从中取出数据。

1.4】其他重点方法

  • String[] getPrameterValues(String name)

    • HTTP请求消息中可以有多个形同名称的参数(通常由一个包含有多个同名的字段元素的FROM表单生成),如果要获得HTTP请求消息中的同一个参数名所对应的所有参数值,那么就应该使用getPrarmeterValues()方法,该方法用于返回一个String类型的数组。

  • Enumeration getPrameterNames()

    • getPrarmeterNames()方法用于返回一个包含请求消息汇总所有参数名的Enumeration对象,在此基础上,可以对请求消息汇总的所有参数进行遍历处理。

  • Map getPrameterMap()

    • getPrameterMap() 方法用于将请求消息中的所有参数名和值装入进一个Map对象中返回。

1.5】请求乱码问题★★★★★

请求乱码问题 即由浏览器向服务器发送数据(request中携带的数据)后,服务器端出现的乱码问题

  • GET乱码:new String(request.getParameter("username").getBytes("iso8859-1"),"utf-8");

  • POST乱码:在通过request.getParameter("username")之前设置request.setCharacterEncoding("UTF-8");

  • 终极解决方案:在tomcat的conf文件夹下server.xml中64行左右

    添加useBodyEncodingForURI="true"之后无论GET或者POST请求只需要在获取参数之前添加request.setCharacterEncoding("UTF-8");即可统一解决乱码问题!

2】HttpServletResponse

  • Response响应对象是JAVA用于处理HTTP响应信息的一个最重要的对象,它与Servlet、Request、Session、Cookie等技术组成JavaWeb核心阶段最最重要的一环,初学者必须在这些技术上下功夫,知道这些技术的核心API及其核心工作原理,以便为之后框架的学习打下扎实的基础。

在Servet API中,定义了一个HttpServletResponse接口,它继承自ServletResponse接口,专门用来封装HTTP响应消息。由于HTTP响应消息分为状态行、响应消息头、消息体三部分,因此,在HttpServletResponse接口中定义了向客户端发送响应状态吗、响应消息头、响应消息体的方法。该对象将HTTP响应消息在服务器端全部封装好后,当需要往浏览器端进行响应时就会解析该响应对象,将响应数据从中全部输出到浏览器端。

2.1】JavaWeb核心阶段最常用的方法★★★★★

在这里我将与Response相关的最常用的方法总结到一处,对这些方法进行详细的讲解,初学者必须要掌握并理解这些方法。

2.1.1】 response.sendRedirect(String url)重定向

  • 作用:当请求从客户端到达服务器后,服务器设置了重定向程序,那么服务器就会先响应回浏览器,然后更改浏览器的地址栏为sendRedirect(url)中设置的url,再次由服务器发出请求。

  • String url 的理解:设置重定向的路径,当路径为相对路径时,比如jsp/index.jsp,注意"相对"指的是相对于谁,相对指的是相对于当前Servlet所处的层级路径,假如说当前Servlet的层级路径为localhost:8080/项目名/ttt/test 那么重定向后浏览器再次发送的请求就为localhost:8080/项目名/ttt/jsp/index.jsp ; 当路径设置为绝对路径时(以"/"开头的路径就叫绝对路径),比如/jsp/index.jsp, 注意"绝对"的概念,绝对是以当前服务器为根本进行路径拼接的,当前服务器就为localhost:8080 ,那么重定向后浏览器再次发送的请求路径就为localhost:8080/jsp/index.jsp 。这时候就会造成项目名的丢失,因此进行绝对路径拼接时,不要忘记从项目名开始拼接。

2.1.2】 response.setContentType("text/html;charset=utf-8")

  • 该方法主要用于设置Servlet输出内容的MIME类型,即"text/html"这一块,若响应内容为文本,可以在这里面追加字符编码,即"text/html;charset=utf-8",通常用此方法指定服务器输出内容时使用的字符编码及浏览器解析输出内容时使用的字符编码,这句话就可以指定服务器以"UTF-8"的方式对输出内容进行编码,再指定浏览器以"UTF-8"的方式进行解码。以此保证编解码一致,杜绝响应回数据的乱码问题。

2.1.3】response.getWriter()

  • 该方法所获取的字符输出流对象为PrintWriter类型。由于PrinWriter类型对象可以直接输出字符文本内容,因此,要想输出内容全为字符文本的网页文档,需要使用getWriter()方法。

  • getWriter().write() :当写出类型为字符串时,程序会报空指针异常

  • getWriter().print() : 当写出类型为字符串时,程序会先检查是否为null,若为null,则将其转为"null"字符串,接着调用write()方法。(推荐使用此方法)

  • getWriter().println() :在输出指定内容后,会自动在内容后添加"\r\n",比如输出内容为"hello world" 那么在输出到前台就会变为"hello world\r\n"。

2.1.4】response.addCookie(cookie)

  • 该方法可以将在服务器端设置好的cookie对象添加到response对象中,然后带回浏览器对浏览器进行cookie的存入,若是只是在服务器端创建cookie对象,但是不将其添加到response对象带回浏览器的话,那么cookie对象就不会又任何的用处,毕竟cookie是存在于浏览器端的。

其他地方还有涉及的方法★★★

这些方法属于不经常用到,但是需要熟悉的方法。

2.1.5】response.setHeader("key","value")

  • 这个方法用于设置响应回浏览器的响应头,例如,在进行文件下载时,可以通过设置response.setHeader("Content-Disposition","attachment;filename=aaa.txt") 来设置响应头Content-Dispostion的值为attachment(附件)实现将文本文档通过附件的方式下载下来。

2.1.6】response.setCharacterEncoding("utf-8")

  • 这个方法只能对于服务器输出内容编码进行指定,但是无法对浏览器接收到数据后进行解码的方式进行指定。

你可能感兴趣的:(java基础,学习,前端,javascript)