动态网页技术-Servlet(2)

1.Tomcat、Servlet与Http协议

最终tomcat将http请求进行对应的响应,动态资源部分由servlet来实现,servlet在底层维护hashmap数组<k,v>键值对的形式,需要web.xml文件中的内容,最终结果也需要tomcat来响应,这个过程中,http协议的请求包与响应包十分重要,详见专题:Http协议-WEB开发通信协议(贴链接,暂时还没有整理出来)

2.ServletConfig

config:配置

ServletConfig就是为Servlet配置信息的类,由tomcat在创建Servlet程序时候创建一个ServletConfig对象

作用:得到Servlet的配置信息如name;初始化参数(init-param);获取ServletContext对象

3.ServletContext对象-域对象

web 工程启动的时候创建ServletContext对象,可以被一个web工程中的多个Servlet程序共享,(域的概念)可以实现多个Servlet之间的数据交流,该对象唯一,相关数据存放在内存中,自然的在 web 工程停止时销毁。

获取:ServletConfig.getServletContext()     或者是     this.getServletContext()

作用:获取 web.xml 中配置的上下文参数 (context-param ),参数信息和整个 web 应用相关,而非属于某一个Servlet;  获取当前web的工程路径;    获取工程部署后在服务器硬盘上的绝对路径;实现多个Servlet之间数据交流等。

servletContext.getInitParameter("xxx");xxx指的是key值

getContextPath()获取当前web的工程路径

4.HttpServletRequest

客户端请求信息http请求所对应的对象,通过具体的API方法实现对信息的处理

常用方法:

1. getRequestURI() 获取请求的资源路径 http://localhost:8080

2. getRequestURL() 获 取 请 求 的 统 一 资 源 定 位 符  绝 对 路 径 http://localhost:8080/工程名字/请求 的资源名

3. getRemoteHost() 获取客户端的主机(ip:prot)

4. getHeader() 获取请求头

5. getParameter() 获取请求的参数        ps:遇到中文乱码:setCharacterEncoding("utf-8") 

6. getParameterValues() 获取请求的参数(多个值的时候使用,例如返回一个数组)

7. getMethod() 获取请求的方式 GET 或 POST

8. setAttribute(key, value); 设置域数据

9. getAttribute(key); 获取域数据

10. getRequestDispatcher() 获取请求转发对象

5.请求转发

一个web一次请求,由多个资源(Servlet/静态)来处理,比如:aaaServlet将http请求内容转发到其他资源,tomcat(服务器)去找,这个过程中与浏览器无关,始终只有一次请求,在一个web工程中进行转发,所以不可以访问当前web工程之外的资源

getRequestDispatcher(“/转发的资源”) .forward(request,response);

 

 此时“/资源”中的/由tomcat,也就是服务器解析,解析成localhost:8080//-->具有分析见后续的工程路径专题(链接,暂时还没有梳理出来)

一个问题:支付界面我们使用请求转发会出问题。因为浏览器地址栏会停止在第一个 servlet ,如果你刷新页面,会再次发出请求(并且会 带数据), 所以在支付页面情况下,不要使用请求转发,否则会造成重复支付

怎么解决:请求重定向方法

6.HttpServletResponse

   HttpServletRequest 表示请求过来的信息,而HttpServletResponse 表示所有响应的信息, 如果需要设置返回给客户端的信息,通过 HttpServletResponse 对象掉用对应的方法即可(字节字符二选一)

1. 字节流 getOutputStream(); 往往用来处理二进制数据

OutputStream outputStream = socket.getOutputStream();
//复习 如何读取文件内容io+网络编程
// 得到文件输入流(字符输入流), 和 src/hello.html
BufferedReader bufferedReader =
new BufferedReader(new FileReader("src/hello.html"));
String buf = "";
// 循环读取 hello.html
while ((buf = bufferedReader.readLine())!=null) {
outputStream.write(buf.getBytes());
}
outputStream.close();
socket.close();

  

2. 字符流 getWriter(); 用于回传字符串

response.setContentType("text/html;charset=utf-8");//解决响应的中文乱码问题,注意要在getWriter之前设置

PrintWriter writer = response.getWriter();

writer.println("xxxxxxx");

7.请求重定向

一个 web 资源收到客户端请求后,通知客户端去访问另外一个 web 资源

请求重定向本质是两次 http 请求. 所以不能共享 Request 域中的数据,本质是两次 http 请求,会生成两个 HttpServletRequest 对象  ,同时可以重定向到 Web 工程以外的资源。

多次http请求与响应,第一次返回302状态码与新的location用于下一次的http请求。

 

posted @ 2023-01-06 23:57  ZitWang  阅读(18)  评论(0编辑  收藏  举报