## servlet核心
目录:
# 1.如何读取请求参数值
# 2.表单包含中文参数值,如何处理
# 3.servlet输出包含中文,如何处理
# 4.容器如何处理请求资源路径
# 5.如何让一个servlet处理多种请求
# 6.转发与重定向
---------
**1.如何读取请求参数值**
使用请求对象的方法:
(1)String getParameter(String paramName)
a.请求参数名(paramName)要与实际传递过来的请求参数名一致
(就是表单页面某个标签的name属性值),否则会获得null值。
b.提交表单时,如果不填写任何数据,会获得""。
(2)String[] getParamterValues(String paramName)
a.当有多个请求参数名相同时,使用此方法。
b.对于多选框,如果不选择任何选项,会获得null值。
**2.表单包含中文参数值,如何处理**
(1)为什么会产生乱码?
提交表单时,浏览器会对表单中的中文参数值进行编码,比如使用utf-8来编码,服务器端默认会使用iso-8859-1来解码,所以会产生乱码。
注:浏览器会按照打开该表单所在页面时的字符集来编码。
(2)如何解决?
1)post请求
request.setCharacterEncoding("utf-8");
注:此行代码要添加到所有的getParameter方法的最前面,并且只针对post请求有效。
2)get请求
修改tomcat的配置文件(server.xml) <Connector URIEncoding="utf-8"/>
注:只针对get请求有效。
**3.servlet输出包含中文,如何处理**
(1)为什么会产生乱码?
因为out.println方法默认会使用"iso-8859-1"来编码。
(2)如何解决?
response.setContentType("text/html;charset=utf-8");
**4.容器如何处理请求资源路径**
比如,在浏览器地址栏输入http://ip:port/test/abc.html,
浏览器会将"/test/abc.html"作为请求资源路径发送给服务器(容器)。
step1.默认认为访问的是一个servlet,容器会去查找对应的servlet。
注:看web.xml文件中<url-pattern>的配置,有没有对应的servlet。
<url-pattern>有三种配置方式:
第一种:精确匹配
比如 <url-pattern>/abc.html</url-pattern>
第二种:通配符匹配
使用 "*"号匹配任意的零个或者多个字符,比如
<url-pattern>/*</url-pattern> <url-pattern>/demo/*</url-pattern>
第三种:后缀匹配
使用"*."开头,后接一个后缀,比如<url-pattern>*.do</url-pattern>
会匹配所有以.do结尾的请求。
step2 如果没有找到对应的servlet,容器会查找对应位置的文件。
**5.如何让一个servlet处理多种请求**
step1.采用后缀匹配,比如
<servlet-mapping>
<servlet-name>SomeServlet</servlet-name>
<url-pattern>*.com</url-pattern>
</servlet-mapping>
step2.分析请求资源路径,进行相应的处理。//先获得请求资源路径
举例如下:
``` Java
String uri = request.getRequestURI();
//为了方便比较,截取请求资源路径的一部分
String path = uri.substring(uri.lastIndexOf("/"),uri.lastIndexOf("."));
if("/login".equals(path)) {
System.out.println("处理登录请求...");
}else if("/list".equals(path)) {
System.out.println("处理用户列表请求...");
}
```
**6.转发与重定向**
6.1什么是重定向
服务器通知浏览器向某个地址发送请求。
补充:服务器可以发送302状态码和Location消息头(该消息头的值是一个地址,一般称之为重定向地址)给浏览器,浏览器收到之后,会立即向重定向地址发送请求。
![图片描述](//img.mukewang.com/5d39788b000113fe08900520.png)
6.2如何重定向
通过相应对象response.sendRedirect(String url);
注:url是重定向地址。容器在重定向之前,会清空response对象上存放的所有数据。
6.3重定向的特点
a.重定向之后,浏览器地址栏的地址会发生改变。
b.重定向的地址是任意的。
6.4什么是转发
一个web组件将未完成的处理交给另外一个web组件继续做。
补充:web组件: jsp或者servlet的统称。通常是一个servlet获得数据,然后转发给一个jsp来展现
6.5如何转发
step1.绑订数据到request对象上。
request.setAttribute(String name,Object obj);
注:
a. name通常称之为绑订名,obj称之为绑订值。
b. 该方法内部的实现:就是以name作为key,以obj作为value,调用Map.put方法。
c. Object request.getAttribute(String name);(目标页面获取的方法)
step2.获得转发器。
RequestDispatcher rd = request.getRequestDispatcher(Sting uri);
注:
a.uri:转发的目的地,通常是一个jsp。
b.RequestDispatcher是一个接口,该方法会返回
一个符合该接口的对象,这个对象一般我们称之为转发器。
c.转发的本质是一个web组件通知容器去调用另外一个web组件,
可以将转发器理解为web组件通知容器的媒介。
step3.转发
rd.forward(request,response);
6.7转发的特点
a.转发之后,浏览器地址栏的地址不变。
b.转发的目的地有限制,要求属于同一个web应用。
6.8比较转发与重定向
(1)地址栏地址有无变化
转发之后,浏览器地址栏地址不变;重定向之后,浏览器地址栏地址会发生改变。
(2)目的地有无限制
转发有限制,重定向没有任何限制。
(3)能否共享request对象和response对象。
转发可以,重定向不行。
注:
容器收到请求之后,会立即创建request对象和response对象。当响应发送完毕,
容器会立即销毁这两个对象。也就是说,
request对象和response对象的生存时间是一次请求与响应期间存在。
重定向是两次请求。
(4)一件事是否完成
转发是一件事未做完,让另外一个web组件继续做;而重定向是一件事已经完成,
再做另外一件独立的事件。