javaWeb实战教程
2.2 servlet内置对象和cookie
servlet里常用的内置对象:
隐式对象 | 说明 |
---|---|
request | 转译后对应HttpServletRequest/ServletRequest对象 |
response | 转译后对应HttpServletRespons/ServletResponse对象 |
session | 转译后对应HttpSession对象 |
application | 转译后对应ServletContext对象 |
config | 转译后对应ServletConfig对象 |
exception | 转译后对应Throwable对象,代表由其他JSP页面抛出的异常对象,只会出现于JSP错误页面(isErrorPage设置为true的JSP页面) |
2.4.1 ServletConfig
javax.servlet. ServletConfig 的实例,该实例代表该JSP 的配置信息。常用的方法有getInitPararneter(String paramNarne) 及getInitPararneternarnes() 等方法。
在web.xml里配置servlet时可以指定initParam参数:
<servlet>
<servlet-name>lesson1</servlet-name>
<servlet-class>cn.funsoftware.Lesson.servlet.Lesson1</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>xxx</param-value>
</init-param>
<init-param>
<param-name>pwd</param-name>
<param-value>yyy</param-value>
</init-param>
</servlet>
在serlvet里通过getInitPararneter(String paramNarne)来获得单个参数的值,或通过getInitPararneternarnes()来获得所有参数的值:
String name = getServletConfig().getInitParameter("name");
System.out.println(name);
Enumeration<String> keys = getServletConfig().getInitParameterNames();
while (keys.hasMoreElements()) {
String key = (String) keys.nextElement();
String value = getServletConfig().getInitParameter(key);
System.out.println(key + ":" + value);
}
ServletConfig通常用于存放一些初始化参数,比如数据库的用户名、密码等等。
2.4.2 ServletContext
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。
由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。
我们可以在一个servlet的ServletContext里存入一个数据:
getServletContext().setAttribute("name", "zzz");
再在另一个servlet里获取这个数据:
name=(String) getServletContext().getAttribute("name");
2.4.3 Request
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。
Request常用方法:
方法名 | 描述 |
---|---|
getRequestURL | 方法返回客户端发出请求时的完整URL。 |
getRequestURI | 方法返回请求行中的资源名部分。 |
getQueryString | 方法返回请求行中的参数部分。 |
getPathInfo | 方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。 |
getRemoteAddr | 方法返回发出请求的客户机的IP地址 |
getRemoteHost | 方法返回发出请求的客户机的完整主机名 |
getRemotePort | 方法返回客户机所使用的网络端口号 |
getLocalAddr | 方法返回WEB服务器的IP地址。 |
getLocalName | 方法返回WEB服务器的主机名 |
request还封装了浏览器发送过来的表单数据,可以通过getParameter方法来获得数据。
request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。
request.getRequestDispatcher("/Lesson9Jsp.jsp").forward(request, response);
请求转发时可以在request里通过setAttribute插入数据:
request.setAttribute("username", "xiaoming");
转发后的servlet可以通过getAttribute来获得数据:
request.getAttribute("username");
2.4.4 response
response对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。
可以调用getOutputStream来向浏览器发送数据:
response.getOutputStream().write("hello world".getBytes());
还可以通过response实现请求重定向:
response.sendRedirect()
2.4.5 sesson
服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
我们通常在session中存放用户的登录信息、权限信息来标记用户:
request.getSession().setAttribute("username", "xxx");
request.getSession().getAttribute("username");
2.4.6 cookie
Cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息。
- 服务器脚本向浏览器发送一组 Cookie。例如:姓名、年龄或识别号码等。
- 浏览器将这些信息存储在本地计算机上,以备将来使用。
- 当下一次浏览器向 Web 服务器发送任何请求时,浏览器会把这些 Cookie 信息发送到服务器,服务器将使用这些信息来识别用户。
我们可以在servlet中使用request获得浏览器传来的cookie:request.getCookies();
,也可以使用response向浏览器存入cookie:response.addCookie(cookie);
。
保存cookie:
Cookie cookie=new Cookie("username", "xiaoming");
cookie.setPath("/");//cookie作用域
cookie.setMaxAge(7*24*60*60);//超时失效,单位为秒
response.addCookie(cookie);
获取cookie:
Cookie[] cookies=request.getCookies();
for (Cookie cookie : cookies) {
if(cookie.getName().equals("username")){
System.out.println("username="+cookie.getValue());
}
}
如果我们要在cookie中存放中文,需要先对中文进行encode:
URLEncoder.encode("小明", "utf-8");
从cookie中取数据需要对中文进行decode:
URLDecoder.decode(cookie.getValue(), "utf-8")
我们通常将cookie的操作封装到CookieUtil类中:
package fy.test.util;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CookieUtil {
public static void addCookie(HttpServletResponse response,
String name, String value, int maxAge) {
Cookie cookie = new Cookie(name, value);
cookie.setPath("/");
if (maxAge > 0) {
cookie.setMaxAge(maxAge);
}
response.addCookie(cookie);
}
public static void removeCookie(HttpServletResponse response, String name) {
Cookie uid = new Cookie(name, null);
uid.setPath("/");
uid.setMaxAge(0);
response.addCookie(uid);
}
public static String getCookie(HttpServletRequest request, String cookieName) {
Cookie cookies[] = request.getCookies();
if(cookies==null)return null;
for (Cookie cookie : cookies) {
if (cookie.getName().equals(cookieName)) {
return cookie.getValue();
}
}
return null;
}
}
2.3 通用异常处理
当一个 Servlet 抛出一个异常时,Web 容器在使用了 exception-type 元素的 web.xml 中搜索与抛出异常类型相匹配的配置。
您必须在 web.xml 中使用 error-page 元素来指定对特定异常 或 HTTP 状态码 作出相应的 Servlet 调用。
<!-- error-code 相关的错误页面 -->
<error-page>
<error-code>404</error-code>
<location>/Lesson4ErrorHandler</location>
</error-page>
<!-- exception-type 相关的错误页面 -->
<error-page>
<exception-type>java.lang.Throwable</exception-type >
<location>/Lesson4ErrorHandler</location>
</error-page>
我们新建一个serlvet命名为Lesson4ErrorHandler.java,在doGet方法里写上
Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception");
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
if(statusCode==500)
System.out.println(throwable.getMessage());
System.out.println(statusCode);
response.getOutputStream().write("出错啦".getBytes("utf-8"));
其中javax.servlet.error.exception是当servlet抛错时才会存在的,也就是status_code为500时。
现在在浏览器里访问一个服务器里不存在的页面,看是否出现404错误。
我们再新建一个特意报错的servlet,来检查下错误是否被正确处理;新建一个Lesson4.java的servlet,在doGet方法里抛错throw new RuntimeException("特意的错");
:
@WebServlet("/Lesson4")
public class Lesson4 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req,
HttpServletResponse resp) throws ServletException, IOException {
throw new RuntimeException("特意的错");
}
}
访问http://localhost/javaWeb/Lesson4查看控制台:
特意的错
500