ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# Servlet ## HTTP简介 WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议。 HTTP是 hypertext transfer protocol(超文本传输协议)的简写,它是 TCP/IP 协议集中的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程以及数据本身的格式。 ## HTTP 的会话方式 四个步骤: ![](https://box.kancloud.cn/4a448c710d4e266debc91469fff706a4_396x128.png) 浏览器与WEB服务器的连接过程是短暂的,每次连接只处理一个请求和响应。对每一个页面的访问,浏览器与WEB服务器都要建立一次单独的连接。 浏览器到WEB服务器之间的所有通讯都是完全独立分开的请求和响应对。 ![](https://box.kancloud.cn/143ffdd88ae8916c3c650342445b24b1_523x395.png) ## HTTP请求消息(了解即可) 请求消息的结构: 一个请求行、若干消息头、以及实体内容,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开。 ![](https://box.kancloud.cn/6b6433c3afd55e2dcabef20e41fb4f3c_771x314.png) ## HTTP响应消息(了解即可) 响应消息的结构: 一个状态行、若干消息头、以及实体内容 ,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开。 ![](https://box.kancloud.cn/351b82b2d42ca6ccd7949b700e415196_771x319.png) *** 这里举个小实例: ~~~ <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="loginServlet" method="post"> user:<input type="text" name="user"> password:<input type="password" name="password"> <input type="submit" value="Submit"> </form> </body> </html> ~~~ 运行服务器,在浏览器中打开这个网页,开发者工具,提交表单,提示404(申请资源不存在),在network中查看请求及响应消息。其中我们可以发现有表单信息(Form data),里面有我们表单提交的数据,我们应该获取它,然后到后台数据库查询,如果存在该信息,允许登录,其中获取信息这件事现在loginServlet就可以帮我们完成。 ## POST和GET请求 post请求方式我们可以看到请求参数在请求体里面 将请求方式改为get后再运行观察 ~~~ <form action="loginServlet" method="get"> user:<input type="text" name="user"> password:<input type="password" name="password"> <input type="submit" value="Submit"> </form> ~~~ 可以观察到地址栏是这样的:[http://localhost:8080/ykbbs/loginServlet?user=123&password=123](http://localhost:8080/ykbbs/loginServlet?user=123&password=123) **get请求把请求参数附着在url后面**,中间以"?”分割。 #### 使用GET方式传递参数 ①在浏览器地址栏中输入某个URL地址或单击网页上的一个超链接时,浏览器发出的HTTP请求消息的请求方式为GET。 ②如果网页中的表单元素的method属性被设置为了“GET”,浏览器提交这个FORM表单时生成的HTTP请求消息的请求方式也为GET。 ③使用GET请求方式给WEB服务器传递参数的格式: http://www.neusoft.net/counter.jsp?name=yzn&password=123 ④使用GET方式传送的数据量一般限制在1KB以下。 #### 使用POST方式传递参数 ①POST请求方式主要用于向WEB服务器端程序提交FORM表单中的数据。 ②POST方式将各个表单字段元素及其数据作为HTTP消息的实体内容发送给WEB服务器,传送的数据量要比使用GET方式传送的数据量大得多。 *** ## 如何在Servlet中获取信息 这里我们可以新建一个Servlet(eclipse中直接有Servlet选项)。 ~~~ @WebServlet("/loginServlet") public class LoginServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("get"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("post"); } } ~~~ 在之前我们自己写的Servlet当中,处理请求的service()方法,在这里其实也是,之所以能没有出现service()方法,是因为HttpServlet这个类已经对原来不完整且代码冗余的Servlet接口进行了实现和封装。这里doGet和doPost分别对应接受get和post请求,方便、简单。 这里可以对之前的表单进行验证,看请求是否能够发到对应的方法中。其中,方法的参数**HttpServletRequest request**和**HttpServletResponse response**封装了**请求和响应**信息 #### 一.如何获取请求信息 **HttpServletRequest**常用的方法: ①**String getParameter(String name)** --根据请求参数的名字,返回参数值,特别常用 ~~~ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String user = request.getParameter("user"); String password = request.getParameter("password"); System.out.println(user+" "+password); } ~~~ ![](https://box.kancloud.cn/7025a37a514a3926e9ba5d0e9807d86e_753x538.png) ②**String[] getParameterValues(String name)** --根据请求参数的名字,返回请求参数对应的字符串数组(例如:一组复选框-->名字是一样的) ~~~ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String intrests[] = request.getParameterValues("hobby"); for(String str:intrests) { System.out.println(str); } } ~~~ ③Map getParameterMap() --返回请求参数的键值对:key:参数名,value:参数值(String数组) ④Enumeration getParameterNames() --返回参数名对应的Enumeration对象(集合对象),类似于getInitParameterNames()方法 ⑤获取请求的URI ⑥获取请求方式 ⑦获取请求字符串 ⑧获取Servlet名 ~~~ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String requestURI = request.getRequestURI().toString(); System.out.println(requestURI); String method = request.getMethod(); System.out.println(method); String queryString = request.getQueryString(); System.out.println(queryString); String servletPath = request.getServletPath(); System.out.println(servletPath); } ~~~ #### 二.如何获取响应信息 **HttpServletResponse**常用的方法: ①getWriter()方法 --返回PrintWriter对象,调用这个对象的println()方法可以将信息直接打印在客户的浏览器上 ~~~ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("hello..."); } ~~~ ②setContentType()方法 --设置响应的类型 ~~~ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("application/msword"); PrintWriter out = response.getWriter(); out.println("hello..."); } ~~~ ③getOutputStream()方法,文件下载时讲解使用。