javaWeb实战教程2-servlet内置对象和错误处理

来源:互联网 发布:软考网络规划师论文 编辑:程序博客网 时间:2024/05/22 08:20

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");

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