一,附录B Servlet
必须熟悉Servlet API中定义的70多种类型……
B.1 Servlet API概述
4个包:
javax.servlet Servlet,GenericServlet,ServletConfig,ServletRequest,ServletResponse等
javax.servlet.http HTTPServlet
javax.servlet.annotation 标注
javax.servlet.descriptor 包含提供程序化登录web应用程序配置信息的类型(?)
Servlet技术的核心是Servlet接口。编写的所有Servlet类必须直接或间接实现它。
在一个应用程序中,每种Servlet类型只能有一个实例。
B.2 Servlet
Servlet接口中定义了5个方法:
void init(ServletConfig config) throws ServletException
void service(ServletRequest request,ServletResponse response)
throws ServletException,java.io.IOException
void destory()
java.lang.String getServletInfo()
ServletConfig getServletConfig()
B.3编写基础的Servlet应用程序
一开始直接编译有错误,找不到javax.servlet包。这个包根据提示在apache目录下的lib里有。但把apache的lib目录加到classpath中去之后,还是提示有这个错误。这时,我仔细看了一下lib目录下的文件,发现里面都是一些jar文件。根据书上所说,包含javax.servlet的应该是servlet-api.jar。我就把这个文件复制到所要编译的.java文件的同一目录下,并解压缩。这之后,就工作正常了。
B.4 ServletRequest
对于每个HTTP请求,Servlet容器都会创建一个ServletRequest对象并将它传递给Servlet的service方法。这个对象中包含HTTP请求的详情,可以通过一些函数获得各种参数。如:getContentlength() getContentType() getParameter() getProtocol()
其他getParameter()是很重要的一个函数,可以获得form中的参数,get请求的参数等。
B.5 ServletResponse
隐藏了向浏览器发送响应的复杂过程。getWriter()可以获得可以向浏览器发送文本的java.io.PrintWriter对象。可以用它来发送html代码。不过在那之前要通过setContentType()设置响应类型为text/html。
如:
response.setContentType("text/html");
PrintWriter writer = response.getWriter();
writer.print("admin:"+ admin + "
email:"+ email + "");
B.6 ServletConfig
被传递给init()一个ServletConfig。可以通过@WebServlet或者部署描述符传给Servlet的配置信息。
如:
@WebServlet(name = "ServletConfigDemoServlet",urlPatterns = { "/servletConfigDemo" },
initParams = {
@WebInitParam(name = "admin", value = "Harry Taciak"),
@WebInitParam(name = "email", value = "admin@example.com")
}
)
注意:像@WebServlet @WebInitParam这些标注在javax.servlet.annotation中定义。
调用其getInitParameter()方法可以获得WebInitParam中设置的参数。
如:String admin = servletConfig.getInitParameter("admin");
B.7 ServletContext
ServletContext表示Servlet应用程序。每个Web应用程序只有一个上下文。
对应JSP中的application
获得:
ServletConfig.getServletContext()
在ServletContext中保存、处理属性:
Object getAttribute(String name)
getAttributeNames()
setAttribute(String name,Objec obj)
removeAttribute(String name)
B.8 GenericServlet
GenericServlet实现了Servlet接口。将ServletConfig保存在类级变量中,并且通过getServletConfig()函数可以获取。
这样在编写自己的Servlet时,可以继承(extends)GenericServlet,不用再将所有方法都实现一遍(特别是在用不到的情况下)。
GenericServlet提供了不带参数的init()方法,可以覆盖这个方法来编写初始化代码,并且同时使得ServletConfig仍由GenericServlet保存。
B.9 Http Servlets
HttpServlet 是用于处理HTTP请求的Servlet类,应用的最为广范。
不需要覆写service()了,只需覆写doPost()或doGet()或doPost()和doGet()。
使用HttpServletRequest和HttpServletResponse,而不是ServletRequest和ServletResponse
HttpServlet -- GenericServlet
HttpServletRequest -- ServletRequest
HttpServletResponse -- ServletResponse
//HttpServlet 覆盖了GenericServlet中的service方法,
public void service(ServletRequest req,ServletResponse res)
throws ServletException, IOException {
HttpServletRequest request;
HttpServletResponse response;
try {
request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
} catch (ClassCastException e) {
throw new ServletException("non-HTTP request or response");
}
service(request,response);
}
HttpServlet添加了一个新的service方法:
protected void service(HttpServletRequest request,HttpServletResponse response)
throws ServletException, java.io.IOException
//HttpServletRequest类中新增的方法:
java.lang.String getContextPath()
Cookie[] getCookies() //返回一个Cookie对象数组
java.lang.String getMethod()
java.lang.String getQueryString()
HttpSession getSession()
HttpSession getSession(boolean create)
//HttpServletResponse类中新增的方法:
void addCookie(Cookie cookie) //给这个响应对象添加一个cookie
void addHeader(java.lang.String name,java.lang.String value) //给这个响应对象添加一个header
void sendRedirect(java.lang.String location) //发送一条响应码,将浏览器跳转到指定的位置
B.10 处理HTML表单
通过request.getParameter()方法可以获得参数值
如果表单中有多个项是同一个名字,可以用request.getParameterValues()获得一个参数值数组
request.getParameterNames()返回所有参数名字,返回类型为Enumeration
B.11 使用部署描述符
前面的例子都用了@WebServlet标注来映射Servlet路径。
也可以在web.xml中使用部署描述符来做这项工作。