1、处理系统异常的两种方式
1)方式一转发到一个异常处理页面
比如:
step1,写一个异常处理页面 error.jsp
step2,捕获到系统异常之后,转发到该页面。
request.setAttribute("error_msg","异常描述");
request.getRequestDispatcher("error.jsp").
forward(request,response);
2)方式二
让容器来处理
比如:
step1,写一个异常处理页面 error.jsp
step2,捕获到系统异常之后,抛出给容器。
throw new ServletException(e);
step3,配置错误处理页面
<error-page>
<exception-type>javax.servlet.ServletException</exception-type>
<location>/error.jsp</location>
</error-page>
2、路径(地址)问题
(1)什么是路径问题链接、表单提交、重定向、转发
<a href="addEmp.jsp">
<form action="add.do">
response.sendRedirect("list.do");
request.getRequestDispatcher("empList.jsp")
(2)什么是相对路径
不以"/"开头的路径
(3)什么是绝对路径
以"/"开头的路径
(4)如何写绝对路径
链接、表单提交、重定向从应用名开始写,转发从应用名之后开始写。
在写绝对路径时,一定不要将应用名直接写在路径里面,要使用request.getContextPath()方法来获得实际部署时的应用名。
3、线程安全问题
(1)为什么说servlet会有线程安全问题?
a,容器收到一个请求之后,会启动一个线程来处理该请求。
b,默认情况下,servlet只有一个实例。
c,如果有多个请求同时要访问某个servlet,则会有多个线程同时调用servlet对象的方法,就有可能产生线程安全问题,比如,多个线程同时去修改servlet的某个属性。
(2)如何解决?
1)方式一
使用synchronized关键字对有线程安全问题的代码加锁。
加锁后对性能有一些影响。
2)方式二(了解,该方式不建议使用,因为如果请求过多,会产生过多对象)
让servlet实现SingleThreadModel接口。
容器会为实现了该接口的servlet创建多个实例(一个线程一个实例)。