# 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()方法,文件下载时讲解使用。
- 第一章 配置和安装Tomcat
- 第二章 Servlet(一)
- 第三章 Servlet(二)
- 练习 一 . Servlet配置级获取初始化参数
- 第四章 JSP(一)
- 第五章 JSP(二)
- 第六章 MVC设计模式
- 第七章 Cookie
- 第八章 Session
- 练习 二 . 简易版购物车
- 第九章 EL表达式
- 第十章 JSTL
- 第十一章 过滤器
- 第十二章 监听器
- 第十三章 文件的上传与下载
- 复习总结
- 如何手动启动Tomcat
- 如何修改Tomcat端口号
- 如何在web.xml中配置Servlet
- Servlet生命周期
- load-on-startup参数
- Servlet映射路径
- POST和GET的区别
- JSP中9个隐式对象及功能
- 请求转发及请求重定向的区别
- JSP指令有哪些
- 简述对MVC设计模式的理解
- 简述Cookie机制
- 简述Session机制
- HttpSession的生命周期
- Cookie和Session有什么区别
- 简述创建过滤器步骤
- 过滤器经典案例--统一编码字符集
- getParameter与getAttribute的区别
- JSP页面中可以包含哪些元素
- web应用中,是如何跟踪用户的
- InteliJ创建web项目