JSP&Servlet学习笔记(2): 编写与设置Servlet

时间:2022-06-02 21:04:30

第一个Servlet程序

package cc.openhome;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/hello.view")
public class HelloWorld extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,IOException {
response.setContentType("text/html;charset=UTF-8"); //设置正确的响应内容类型
PrintWriter out = response.getWriter();
//取得代表响应输出的PrintWriter对象
String name = request.getParameter("name");

//通过PrintWriter的println()方法来对浏览器输出响应的文字信息
out.println("<html>");
out.println("<head>");
out.println("<title>Hello World</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1> Hello!" + name + "!<h1/>");
out.println("</body>");
out.println("</html>");

out.close();
}
}

在doGet()方法上可以看到HttpServletRequest与HttpServletResponse两个参数,容器接收到客户端的HTTP请求后,会收集HTTP请求中的信息,并分别创建代表请求与响应的Java对象,而后在调用doGet()时将这两个对象当作参数传入。
由于HttpServletResponse对象代表对客户端的响应,因此可以通过其setContentType()设置正确的内容类型。接着使用getWriter()方法取得代表响应输出的PrintWriter对象,通过PrintWriter的println()方法来对浏览器输出响应的文字信息。
@WebServlet(“/hello.view”)这表示如果请求的URL是/hello.view,就会由HelloWorld来处理请求。

这一步为部署servlet,两种方法选其一
方法一:在WEB-INF目录下web.xml文件的标签中添加如下内容:

<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>HelloWorld</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>

方法二:在HelloWorld文件的类前面加:@WebServlet(“/略”)。

关于HttpServlet

要编译HelloWorldServlet.java,则类路径中必须包括Servlet API的相关类,如果使用的是Tomcat,则这些类通常封装在Tomcat目录的lib子目录中的servlet-api.jar。
Servlet接口定义了Servlet应有的基本行为,实现该接口的类是GenericServlet类,它来实现了ServletConfig接口。ServletConfig并没有规范任何有关HTTP的相关方法,而是由继承它的HttpServlet来定义。
HttpServlet的service()方法中的流程如下:

protected void service(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException, IOException {
String method = req.getMethod(); //取得请求的方法
if(method.equals(METHOD_GET)) { //HTTP GET
//...
doGet(req,resp);
//...
} else if(method.equals(METHOD_HEAD)) { //HTTP HEAD
//...
doHead(req,resp);
} else if(method.equals(METHOD_POST)) { //HTTP POST
//...
doPOST(req,resp);
} else if(method.equals(METHOD_PUT)) { //HTTP PUT
//...
}

当请求来到时,容器就会调用Servlet的service()方法。HttpServlet的service()中所定义的,基本上就是判断HTTP请求的方式,再分别调用doGet()、doPost()等方法。所以只针对GET、POST的话,只需在继承HttpServlet之后重新定义doGet()、doPost()方法。

使用@WebServlet

编写好Servlet后,要告诉Web容器有关于Servlet的一些信息。在Servlet3.0中,可以使用标注。只要在Servlet上设置@WebServlet标注,容器就会自动读取当中的信息。

使用Web.xml

这样的文件称为部署描述文件。一个Servlet在Web.xml中会有三个名称设置:设置的逻辑名称,注册的Servlet名称,以及设置的实体类名称。

文件组织与部署

几个重要的目录及文件位置:

  • WEB-INF:固定目录,位于应用程序根目录下。放置在这里的文件或目录,是客户端无法使用HTTP的任何方式直接访问到WEB-INF中的文件或目录的。所以不想让外界存取的资源可以放在这里。
  • web.xlm:一定在WEB-INF根目录下。
  • lib:放置JAR文件的目录,一定在WEB-INF根目录下。
  • classes:放置编译后的.class文件的目录,一定在WEB-INF目录下。