public void init() throws ServletException {
//获取对应名称的初始化参数值,如果没有配置则返回为null
//这个获取初始化参数的方法也可以在其它方法中进行调用,从而获取配置参数
String rows = this.getServletConfig().getInitParameter("rows");
System.out.println(rows);
//获取当前servlet的配置名称,对应web.xml中的<servletname>hello3servlet-name>
this.getServletConfig().getServletName()
//获取所有当前servlet的初始化配置参数名称的迭代器,类似Iterator
Enumeration<String> initParameterNames =
this.getServletConfig().getInitParameterNames();
while(initParameterNames.hasMoreElements()){
String name=initParameterNames.nextElement(); //获取每个初始化配置
String value=this.getServletConfig().getInitParameter(name);//根
System.out.println(name+"-->"+value);
final ServletContext context =
this.getServletConfig().getServletContext();
其它配置
接收客户端请求
request
对象中封装的有客户端的请求参数信息
getParamter("
参数名称
"):String
getParameterValues("
参数名称
"):String[]
getParameterMap():Map
request
对象是
HttpServletRequest
接口类型,由服务器提供的实现,服务器在调用
service
方法时
传入
request
中的数据有
3
个不同的部分,请求头信息
header
【浏览器发送的请求信息】、请求参数
parameter
【用户发送的相关参数信息】、属性信息
attribute
【一般用于编程中的数据传递】,前
两个只是用于读取,并没有提供修改方法,属性信息提供了读写操作方法
特殊方法
getReader()
或者
getInputStream()
获取输入流,直接操作流
请求头
一般数据是传送给服务器使用的,不是给应用直接使用的。只有在特殊需求时使用,例如收集客户端所
使用的浏览器信息【
User-Agent
】
@Override
public
void
init
()
throws
ServletException
{
//
获取对应名称的初始化参数值,如果没有配置则返回为
null
//
这个获取初始化参数的方法也可以在其它方法中进行调用,从而获取配置参数
String
rows
=
this
.
getServletConfig
().
getInitParameter
(
"rows"
);
System
.
out
.
println
(
rows
);
//
获取当前
servlet
的配置名称,对应
web.xml
中的
name>hello3
System
.
out
.
println
(
this
.
getServletConfig
().
getServletName
()
):
//
获取所有当前
servlet
的初始化配置参数名称的迭代器,类似
Iterator
Enumeration
<
String
>
initParameterNames
=
this
.
getServletConfig
().
getInitParameterNames
();
while
(
initParameterNames
.
hasMoreElements
()){
String
name
=
initParameterNames
.
nextElement
();
//
获取每个初始化配置
参数名称
String
value
=
this
.
getServletConfig
().
getInitParameter
(
name
);
//
根
据配置参数名称读取对应的参数配置值
System
.
out
.
println
(
name
+
"-->"
+
value
);
}
//
可以通过
config
对象获取当前应用的上下文
final
ServletContext context
=
this
.
getServletConfig
().
getServletContext
();
}
public class
AddServlet
extends
HttpServlet
{
@Override
protected
void
doGet
(
HttpServletRequest request
,
HttpServletResponse
response
)
throws
ServletException
,
IOException
{
请求参数
无论是
get
请求还是
post
请求,获取请求参数的方法一致,只是编程时需要注意对应的
doXxx
方法
如果针对请求没有对应的
doXxx
方法,则会从父类中继承得到默认实现。实现是报错
405
如果
get
请求和
post
请求处理逻辑一致,则需要自行编码实现
获取请求参数数据的方法
//
操作请求头参数
final
String
host
=
request
.
getHeader
(
"Host"
);
//
根据名称获取请求头中指
定的参数值
System
.
out
.
println
(
host
);
//localhost:8080
//
另外根据发送数据的类型
request.getIntHeader("
名称
"):Int
request.getDateHeader():long
//
获取所有的请求头参数名称的枚举对象
final
Enumeration
<
String
>
headerNames
=
request
.
getHeaderNames
();
while
(
headerNames
.
hasMoreElements
()){
String
headerName
=
headerNames
.
nextElement
();
String
headerValue
=
request
.
getHeader
(
headerName
);
System
.
out
.
println
(
headerName
+
"-->"
+
headerValue
);
}
String
name
=
"Accept-Encoding"
;
//
遍历一个名称对应的多个配置值的情形
final
Enumeration
<
String
>
enumeration
=
request
.
getHeaders
(
"Accept
Encoding"
);
//
请求头中一个名称对应多个参数值
while
(
enumeration
.
hasMoreElements
()){
String
tmp
=
enumeration
.
nextElement
();
System
.
out
.
println
(
name
+
"<-->"
+
tmp
);
}
}
}
public class
AddServlet
extends
HttpServlet
{
@Override
protected
void
doGet
(
HttpServletRequest request
,
HttpServletResponse
response
)
throws
ServletException
,
IOException
{
this
.
doPost
(
request
,
response
);
//
将
get
请求转发给
doPost
进行处理
}
@Override
protected
void
doPost
(
HttpServletRequest req
,
HttpServletResponse
resp
)
throws
ServletException
,
IOException
{
}
}
@Override
protected
void
doPost
(
HttpServletRequest request
,
HttpServletResponse
resp
)
throws
ServletException
,
IOException
{
//
根据参数名称获取对应的参数值
String
username
=
request
.
getParameter
(
"username"
);
//
在网络数据传输中只有
String
类型
,
其它类型需要自行编码实现数据类型转换
//
因为
DateFormat
不是线程安全的,所以
DateFormat
不能定义为属性
System
.
out
.
println
(
username
);
//
获取用于遍历所有请求参数名称的迭代器对象
针对一个名称传递多个数据的情形
针对
checkbox
使用一个名称传递多个数据则必须使用
getParameterValues
获取数据,如果使用
getParameter
则会有数据丢失
常见问题
1
:类型转换
数据传输都是
String
类型获取数据后需要进行类型转换,但是转换会有异常
实际处理中有
2
种不同的处理方案:方案
1
记录日志并继续向上抛出;方案
2
采用默认值
final
Enumeration
<
String
>
parameterNames
=
request
.
getParameterNames
();
while
(
parameterNames
.
hasMoreElements
()){
String
parameterName
=
parameterNames
.
nextElement
();
String
parameterValue
=
request
.
getParameter
(
parameterName
);
System
.
out
.
println
(
parameterName
+
"-->"
+
parameterValue
);
}
//
获取所有请求参数
final
Map
<
String
,
String
[]
>
parameterMap
=
request
.
getParameterMap
();
for
(
String
tmpName
:
parameterMap
.
keySet
()){
String
[]
params
=
parameterMap
.
get
(
tmpName
);
System
.
out
.
println
(
tmpName
+
"<===>"
+
Arrays
.
toString
(
params
));
}
//
针对
checkbox
获取数据的方法
final
String
[]
hobbies
=
request
.
getParameterValues
(
"hobby"
);
for
(
String
tmp
:
hobbies
)
System
.
out
.
println
(
tmp
);
}
用户名称:
name
=
"username"
/>
用户爱好:
type
=
"checkbox"
name
=
"hobby"
value
=
"
篮球
"
>
篮球
type
=
"checkbox"
name
=
"hobby"
value
=
"111"
>
足球
type
=
"checkbox"
name
=
"hobby"
value
=
"222"
checked
>
乒乓球
type
=
"checkbox"
name
=
"hobby"
value
=
"333"
>
其它
type
=
"submit"
value
=
"
提交数据
"
/>
//
针对
checkbox
获取数据的方法
final String[] hobbies = request.getParameterValues("hobby");
for(String tmp:hobbies)
System.out.println(tmp);
4
常见问题
2
:一个名字对应多个数据的存储和显示
MySQL
中并不建议使用
enum
枚举类型和
set
集合类型
多个选项的存储方案:
具体入库数据
一种直接存储选项的显示值,优势在于方便显示
另外的存储方式存储的时字典表中对应的
id
值,优势在于方便修改,最大的缺陷在于额外查询
请求参数的中文问题
为了重现问题使用
tomcat7
插件
<groupId>org.apache.tomcat.mavengroupId>
<artifactId>tomcat7-maven-pluginartifactId>
<path>/pppath> 上下文路径名称,也就是访问应用的路径为/pp
<port>9090port> 端口号的配置,localhost:9090/pp/
<uriEncoding>UTF-8uriEncoding> 默认的编码字符集
因为在整个数据提交过程中会涉及多处编码字符集问题,
1
、提交所采用的编码字符集。
charset="UTF
-
8">
2
、在互联网上传输数据默认编码字符集为
ISO-8859-1
。
3
、服务器接收数据后
的编码处理
请求参数的中文乱码问题有
3
种解决方案
针对
get
请求,在具体应用中基本不可用
针对
post
请求
通用解决方案
String username=request.getParameter("username");//在网络数据传输中只有
String类型,其它类型需要自行编码实现数据类型转换
//使用ISO8859-1进行解码转换,转换为原始的字节数组
byte[] arr=username.getBytes(StandardCharsets.ISO_8859_1);
username=new String(arr, Charset.forName("UTF-8"));
System.out.println(username);
理论上来说采用通用解决方案可以处理
get
和
post
的中文乱码问题,但是一般不采用这种方式,因为处理 比较繁琐。具体开发实践中注意一些小细节即可,不用通用解决方案
一般不采用
get
提供中文,如果需要传递数据有限考虑采用代码值之类的方式。例如查询教学部的
所有雇员,并不传递中文的【教学部】参数,而是传递教学部对应的编号值
提交数据的
html
页面编码字符集统一为
UTF-8
如果需要传递中文信息,可以采用
提交数据, 在所有接收数据
request.getPamrameter
之前先进行编码转换
request.setCharacterEncoding("UTF
-
8")
;