HTTP简介
-WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议
-HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议集中的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程以及数据本身的格式。
-HTTP协议的版本有HTTP/1.0,HTTP/1.1,HTTP.NG
HTTP的会话方式
四个步骤:
Get请求/Post请求
-1)使用getd方式传递参数:
-1.1在浏览器地址栏中输入某个URL地址或单击网页上的一个超链接时,浏览器发出的HTTP请求信息的请求方式为GET.
-1.2如果网页中的表单元素的method属性被设置为“GET”,浏览器提交这个FORM表单时生成的HTTP请求消息的请求方式为GET
-1.3使用GET请求方式给WEB服务器传递参数的格式,http://www.xxxx.xxx/xxxx?userName=xxx&password
-1.4使用GET方式传送的数据量一般限制在1KB以下。
-2)使用POST方式传递参数:
-2.1POST请求方式主要用于向WEB服务器端程序提交FORM表单中的数据。
-2.2POST方式将各个表单字段元素及其数据作为HTTP消息的实体内容发送给WEB服务器,传送的数据量要比使用GET方式传送的数据量大。
如何在Servlet中获取请求信息
-1).Servlet的service()方法用于应答请求:因为每次请求都会调用service()方法:
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {}
ServletRequest:封装了请求信息,可以从中获取任何的请求信息。
ServletResponse:封装了响应信息,如果想给用户什么响应。
这两个接口的实现类都是服务器给予实现的,并在服务器调用service方法时传入。
-2)ServletRequest:
-2.1)获取请求参数的几个常用方法:
public java.lang.String getParameter(java.lang.String name):
根据请求参数的名字,返回参数值。若请求参数有多个值(例如checkbox),该方法只能获取到第一个提交的值
public java.util.Enumeration getParameterNames():
返回参数名对应的Enumeration 对象,类似于ServletConfig的getInitParameterNames()方法
public java.lang.String[] getParameterValues(java.lang.String name):
根据请求参数的名字,返回请求参数对应的字符串数组
Map getParameterMap():返回请求参数的键值: key;参数名,value:参数值,Sring数组类型
-2.2)HttpServletRequest:
获取请求的URI:
HttpServletRequest hrequest=(HttpServletRequest)arg0;
String uri=hrequest.getRequestURI();
System.out.println(uri);
获取请求方式:
String method=hrequest.getMethod();
System.out.println(method);
若是一个GET请求,获取请求参数对应的那个字符串,即?后的那个字符串:
String query=hrequest.getQueryString();
System.out.println(query);
获取请求的Servlet的映射路径:
String servletPath=hrequest.getServletPath();
System.out.println(servletPath);
-3)HttpServletRequest:是ServletRequest的子接口,针对于HTTP请求所定义,里边包含了大量获取HTTP请求相关的方法。
-4)ServletReponse:封装了响应的信息,如果想给用户什么响应,具体可以使用该接口的方法实现。
4.1)getWriter():返回PrintWriter对象,调用对象的print()方法,将把printy()里的参数直接打印用户的浏览器上。
4.2)设置响应的内容类型:repond.setContentType(“application/msword”);
4.3)void sendRedirect(String location):请求的重定向(此方法在HttpSevletResponse中定义)
在web.xml文件中设置两个WEB应用的初始化参数,user,password.定义一个login.html,里边定义两个请求字段:user,password.发送请求。再创建一个LoginSevlet,在其中获取请求的user与password,比对其和web.xml文件中定义的请求参数是否一致。若一致打印,响应:Hello.xxx
若不一致的话,响应:Sorry,xxxx.
GenericServlet:
-1)是一个Servlet,是Servlet接口和ServletConfig接口的实现类,但是一个抽象类,其中的service方法为抽象方法
-2)如果新建的Servlet程序直接继承GenericServlet会使开发更简洁。
-3)具体实现:
3.1在GenericServlet中声明了ServletConfig类型的成员变量,在init(ServletConfig)方法中对其进行了初始化
3.2利用ServletConfig成员变量的方法实现了ServletConfig接口的方法。
3.3还定义了一个init()方法,在init(ServletConfig)方法中对其进行调用,子类可以直接覆盖init(),在其中实现对Servlet的初始化
3.4不建议直接覆盖init(ServletConfig),因为如果忘记编写super(ServletConfig),而还是用ServletConfig接口的方法,则会出现空指针异常。
3.5.新建的init(){}并非Servlet的生命周期的方法,而init(ServletConfig)是生命周期相关的方法。
HttpServlet
-1)是一个Servlet,继承自GenericServlet,针对于HTTP协议所定制。
-2)在service()方法中直接把ServletRequest和ServletResponse转为HttpServletRequest和HttpServletResponse,并调用重载的service(HttpServletRequest,HttpServletResponse)
service(HttpServletRequest,HttpServletResponse)获取了请求方式:request.getMethod().根据请求方式创建了doXxxx方法
-3)实际开发中,直接继承HttpServlet,并根据请求方式复写doXxxx(),方法接口
-4)好处:直接由针对性的覆盖doXxxx()方法,直接使用HttpServletRequest和HttpServletResponse,不再需要强转
小练习:
在MySQL数据库中创建一个test_users数据表,添加3个字段:id,user,password,并录入几条记录。
定义一个login.html,里边定义两个请求字段:user,password,发送请求到loginServlet,在创建一个LoginServlet(需要继承自HttpServlet,并重写doPost方法)在其中获取请求的user,和password.
利用JDBC从test_users中查询出有没有和页面输入的user,password 对应的记录。
SELECT count(id) FROM test_users WHERE user=? AND password=?
若有响应:Hello,xxxx 若没有响应:Sorry,xxxx xxxx为user