关于面向对象中的异常处理、XML文档、Servlet使用
异常处理
我们在写程序的时候难免会出现各种错误,其中有些是我们可以预见的,有些确实我们无法预见的,而不同的异常情况处理方式也有所不同,这里我要说的就是利用Exception来处理一些我们在写程序时可以处理的异常。
我们可以了解到常见的异常原因有:
- 用户的非法输入
- 请求的流不存在
- 内存溢出等
相应的就会产生一些:
- 检查时异常
- 运行时异常
- 错误
我们就会使用Exception
类、try
、catch
、finally
、throw
、throws
来处理这些异常。
在JAVA中有一些内置的异常处理方法,比如IOException
、ClassNotFoundException
等,我们只需要在合适的时候调用它们,至于具体都有哪些,我们可以在需要的时候查阅。当然,我们也可以通过继承Exception
类来实现你想要的异常处理。
所有的异常类是从 java.lang.Exception 类继承的子类。
Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。
Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。
Error 用来指示运行时环境发生的错误。
另外,在敲代码的时候,我们要注意几点:
- throw和throws的区别。throw写在方法里,后面跟的是一个实例化的对象,throws写在类名后面,后面跟的是异常的类型(可以写多个,中间用逗号隔开);
- try和catch配对。一个try至少要有一个catch和它对应或者有一个finally,一个try可以有多个catch;
- finally。finally是异常处理的最终措施,无论是否发生异常,finally 代码块中的代码总会被执行。它推荐写,但也可以不写。
- catch的顺序。当有多个catch时,catch的顺序为从小到大,即第一个catch的异常可以继承自下一个异常或是和下一个异常平级,但不能是第二个异常继承自第一个异常,这样就没有意义了。
下面是个伪代码
//try、catch和finally
try{
// do something
}
catch(异常类型1 异常的变量名1){
// do something
}
catch(异常类型2 异常的变量名2){
// do something
}
finally{
// do something
}
//throw和throws
public static void main(String[] args) throws IOException,
InsufficientFundsException
{
// Method implementation
throw new Exception();
}
XML文档
XML,可扩展标记语言,和JSON一样被设计来传输和存储数据。而要写一个XML文档,就要有一个文档头(必须在开头):
<?xml version="1.0" encoding="UTF-8"?>
在写注释时,XML使用的是<!-- -->
而不是//
,这种注释方式支持换行但是不支持嵌套。
XML有其自身许多属性和元素,我们在与JAVA搭配使用的时候就涉及到这么几个点:
- schema——说明本文档有schema约束条件
- xmlns——就是XML的命名空间,去你后面指定的URL找需要的东西
- xmlns:xsi ——指定schemaLocation来自哪个命名空间
- xsi:schmeLocation——指定该名称空间下的哪个xsd文件
这是写在一个XML文档开始的部分,后面就看你发挥了,是要写个Servlet还是写个Filter。
我还想说的是转义的问题。和其他语言使用“\”不同,这里使用的是&
+你要转义的字符,例如:
jdbc:mysql://localhost:3306/test?useSSL=true&&serverTimezone=Hongkong
关于XML的解析,由于目前使用较少,了解仅限以下内容:
解析的两种方式
DOM:树形结构解析,在加载整个文档之后进行解析
SAX:按行读取,读一行解析一行
基于两种方式的三种具体实现
JAXP: 基于DOM,是w3c推出
DOM4J:基于DOM,是第三方开源的
SAX:基于SAX,是来源于一个开源社区
而这些解析方式都有各自的处理过程和优缺点,大家可以自行了解。
再给个开头样例:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--
servlet或是Filter等
-->
</web-app>
Servlet
在我看来,servlet是sun公司搞出来的一套在服务端和客户端之间的一个交互的工具,运用这个工具,我们可以更便利的实现我们的需求,他可以处理异常,提交表单、访问数据库等等,我们要做的就是去使用它。那么我们要怎么使用它呢?
首先,我们要添加它所依赖的jar包,这个包一般在你下的Tomcat的lib文件夹里都会有。
然后给它配置一个文件web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>demo.serverlet.controller.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
其中有几个关键词
- servlet——在这里写servlet的声明
- servlet-name——servlet的声明
- servlet-class——所声明的servlet在哪个方法里实现
- servlet-mapping——servlet的映射,其中的servlet-name要和上面servlet匹配
- url-pattern——映射到的路径,用以网络访问时具体的路径
在一个servlet里可以声明多个具体的内容,每一个声明都要有一个映射与之对应;url-pattern要区分大小写,当然url-pattern里也可以写*.do
或者绝对路径。
接下来就是具体实现servlet,其中主要包括以下几个部分:
- 继承HttpServlet。我们通常编写 Servlet 来扩展 javax.servlet.http.HttpServlet,并实现 Servlet 接口的抽象类专门用来处理 HTTP 请求;
- init()。执行必需的初始化;
- service()。实际做的内容,可以是post或get,也采用继承;
- destory()。清场,这里servlet 被销毁,但是并没有立即被回收,再次请求时,并没有重新初始化,还是需要JAVA自己的垃圾回收器。
下面给个例子:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet {
private String message;
public void init() throws ServletException
{
// 初始化
message = "Hello World";
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
// 设置响应内容类型
response.setContentType("text/html");
// 实际的逻辑
PrintWriter out = response.getWriter();
out.println("<h1>" + message + "</h1>");
}
public void destroy()
{
System.out.println("destory");
}
}
启动tomcat,访问localhost:8080/hello
就会显示出下面的结果
当然,异常处理、XML和servlet不仅仅是这一点内容,还有更多的内容等着我们慢慢积累。