HTTP协议_GET&POST请求HttpServlet
GET 请求 和 POST 请求:
使用GET方式传递参数:
-
在浏览器地址栏中输入某个 URL地址或单击网页上的一个超链接 时,浏览器发出的HTTP请求消息的请求方式为GET方式;
-
如果网页中的 <form> 表单元素的 method 属性被设置为“GET”,浏览器提交这个FROM表单时生成的HTTP请求消息的请求方式为GET;
-
使用GET请求方式给服务器传递的参数格式: https://so.csdn.net/so/search/s.do?q=AIM_Long&t=blog&u=long_zhiqi
-
使用GET方式传输的数据量一般限制在1K以下。
使用POST方式传递参数
-
POST 请求方式主要用于向WEB 服务器端程序提交 FROM 表单中的数据:FROM 表单的 method 置为POST;
-
POST 方式将各个表单字段元素及数据作为HTTP消息的实体内容发送给WEB 服务器。传输的数据量要比使用GET方法传送数据的数据量大得多。
如何在Servlet中获取请求信息
-
Servlet 的 service() 方法用于应答请求;因为每次请求都会调用 service() 方法
@Override
public
void
service(
ServletRequest
servletRequest
,
ServletResponse
servletResponse
)
throws
ServletException
,
IOException
{
}
ServletRequest:封装了请求信息,可以从中获取到任何的请求信息
ServletResponse:
封装了响应信息,如果想给用户什么响应,具体可以使用该接口方法实现。
这两个接口的实现类都是服务器给予实现的,并在服务器调用 service() 方法时传入。
-
ServletRequest:获取请求参数
-
String getParameter(String name):根据参数的名字返回参数值;
-
String[] getParameterValues(String name) :根据请求参数的名字,返回请求参数对应的字符串数组;
-
Enumeration getParameterNames():返回参数名对应的 Enumeration对象 ,类似于ServletConfig 或ServletContext 的 getInitParameterNames() 方法;
-
Map getParameterMap():返回请求参数的键值对: key :参数名 ,value :参数值 String[] 类型
-
HttpServletRequest: 是ServletRequest的子接口,针对于HTTP请求所定义包含了大量获取HTTP请求相关的方法。
-
String
user
=
servletRequest
.
getParameter
(
"user"
)
;
String
password
=
servletRequest
.
getParameter
(
"password"
)
;
System
.
out
.
println
(
user
+
"--->"
+
password
)
;
String
interesting
=
servletRequest
.
getParameter
(
"interesting"
)
;
System
.
out
.
println
(
interesting
)
;
String
[]
intterestings
=
servletRequest
.
getParameterValues
(
"interesting"
)
;
for
(
String
interests
:
intterestings
)
{
System
.
out
.
println
(
"---->"
+
interests
)
;
}
Enumeration
<
String
>
names
=
servletRequest
.
getParameterNames
()
;
while
(
names
.
hasMoreElements
())
{
String
name
=
names
.
nextElement
()
;
String
values
=
servletRequest
.
getParameter
(
name
)
;
System
.
out
.
println
(
"^^^"
+
name
+
"-->"
+
values
)
;
}
Map
<
String
,
String
[]
>
map
=
servletRequest
.
getParameterMap
()
;
for
(
Map
.
Entry
<
String
,
String
[]
>
entry
:
map
.
entrySet
())
{
System
.
out
.
println
(
"***"
+
entry
.
getKey
()
+
": "
+
Arrays
.
asList
(
entry
.
getValue
()))
;
}
HttpServletRequest
httpServletRequest
=
(
HttpServletRequest
)
servletRequest
;
String
requestURI
=
httpServletRequest
.
getRequestURI
()
;
System
.
out
.
println
(
requestURI
)
;
String
method
=
httpServletRequest
.
getMethod
()
;
System
.
out
.
println
(
method
)
;
-
ServletResponse: 封装了响应信息,如果想给用户什么响应,具体可以使用该接口方法实现。
-
getWriter (): 返回PrintWriter 对象,调用该对象的print() 方法, 将把print() 中的参数直接打印到客户的浏览器上。
-
设置响应的内容的类型: setContentType ( String )
-
servletResponse.setContentType("application/x-abiword");
PrintWriter
out
=
servletResponse
.
getWriter
()
;
out
.
println
(
"LoginServlet!!!"
)
;
HttpServlet:
-
HttpServlet是一个Servlet ,继承自GenericServlet。针对于HTTP协议;
-
在service() 方法中直接把ServletRequest 和 ServletResponse转为 HttpServletRequest 和 HttpServletResponse,并调用了重载的service(HttpServletRequest ,HttpServletResponse)方法;
-
在service(HttpServletRequest ,HttpServletResponse)获取了请求方式:request.getMethod() 。根据请求方式有创建了doXXX()方法(XXX为具体请求方式eg:doGet())
@Override
public
void
service(
ServletRequest
arg0
,
ServletResponse
arg1
)
throws
ServletException
,
IOException
{
HttpServletRequest
request
;
HttpServletResponse
response
;
try
{
request
=
(
HttpServletRequest
)
arg0
;
response
=
(
HttpServletResponse
)
arg1
;
}
catch
(
ClassCastException
e)
{
throw
new
ServletException
(
"non-HTTP request or response"
)
;
}
service
(
request
,
response
)
;
}
public
void
service(
HttpServletRequest
request
,
HttpServletRequest
response
)
throws
ServletException
,
IOException
{
//获取请求方式
String
method
=
request
.
getMethod
()
;
if
(
"GET"
.
equalsIgnoreCase
(
method
))
{
doGet
(
request
,
response
)
;
}
else
if
(
"POST"
.
equalsIgnoreCase
(
method
))
{
doPost
(
request
,
response
)
;
}
}
public
void
doPost(
HttpServletRequest
request
,
HttpServletRequest
response
)
throws
ServletException
,
IOException
{
}
public
void
doGet(
HttpServletRequest
request
,
HttpServletRequest
response
)
throws
ServletException
,
IOException
{
}
}
GenericServlet:
-
是一个Servlet. 是Servlet 接口和ServletConfig 接口的实现类 ,但是是一个抽象类。其中的 service 方法为抽象方法;
-
如果新建的Servlet 程序直接继承GenericServlet 会使得开发变得更加简洁;
-
具体实现:
-
在GenericServlet 中声明了一个ServletConfig 类型的成员变量 ,在init(ServletConfig) 方法中对其进行了初始化;
-
利用ServletConfig 成员变量的方法实现了ServletConfig 接口方法;
-
还定义了一个init() 方法 , 在init(ServletConfig)方法中进行调用,子类可以直接覆盖init() 在其中实现对Servlet 的初始化;
-
不建议直接覆盖init(ServletConfig),因为如果忘记编写super.init(ServleConfig),而还是用了ServletConfig 接口的方法,否则会出现空指针异常;
-
新建的init(){} 方法并非是Servlet 的生命周期方法,而init(ServletConfig) 是生命周期相关的方法。
-
public
abstract
class
MyGenericServlet
implements
Servlet
,
ServletConfig
{
@Override
public
void
destroy()
{
}
@Override
public
ServletConfig
getServletConfig()
{
return
servletConfig
;
}
@Override
public
String
getServletInfo()
{
return
null
;
}
private
ServletConfig
servletConfig
;
@Override
public
void
init(
ServletConfig
myservletConfig
)
throws
ServletException
{
this
.
servletConfig
=
myservletConfig
;
this
.
init
()
;
}
public
void
init()
throws
ServletException
{
}
@Override
public
abstract
void
service(
ServletRequest
arg0
,
ServletResponse
arg1
)
throws
ServletException
,
IOException
;
@Override
public
String
getInitParameter(
String
arg0
)
{
return
servletConfig
.
getInitParameter
(
arg0
)
;
}
@Override
public
Enumeration
<
String
>
getInitParameterNames()
{
return
servletConfig
.
getInitParameterNames
()
;
}
@Override
public
ServletContext
getServletContext()
{
return
servletConfig
.
getServletContext
()
;
}
@Override
public
String
getServletName()
{
return
servletConfig
.
getServletName
()
;
}
}