javaWeb实战教程2-servlet内置对象和错误处理
来源:互联网 发布:软考网络规划师论文 编辑:程序博客网 时间:2024/05/22 08:20
javaWeb实战教程
2.2 servlet内置对象和cookie
servlet里常用的内置对象:
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常用方法:
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
- javaWeb实战教程2-servlet内置对象和错误处理
- javaWeb实战教程1-servlet
- 【JavaWeb】(2)JSP内置对象
- JavaWeb学习笔记之Servlet九大内置对象
- JavaWeb jsp内置对象与servlet对应关系
- JavaWeb Servlet乱码处理(2)
- javaWeb实战教程6-jsp和jstl
- JavaWeb---Jsp内置对象
- javaweb 常用内置对象
- Servlet和jsp九大内置对象
- javaweb--servlet--servlet的异常处理和线程安全简述
- javaWeb--JSP三大指令和九大内置对象
- Servlet的内置对象
- Servlet的内置对象
- servlet内置对象
- servlet的内置对象
- Servlet的九大内置对象 和 四大对象域
- JavaWeb入门实战—Servlet
- javaWeb实战教程0-环境配置
- 一.玩转图灵机器人
- javaWeb实战教程1-servlet
- win7下jdk环境配置
- 线性布局 相对布局 属性介绍
- javaWeb实战教程2-servlet内置对象和错误处理
- 大牛博客
- 文章标题
- HDU3790 最短路径问题
- javaWeb实战教程3-过滤器filter
- Leetcode 376. Wiggle Subsequence
- javaWeb实战教程4-jdbc连接数据库和junit单元测试
- 记录MySQL遇到的错误
- javaWeb实战教程5-fileupload文件上传