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

第一个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("");
        out.println("");
        out.println("Hello World");
        out.println("");
        out.println("");
        out.println("

Hello!" + name + "!

"); out.println(""); out.println(""); 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文件的标签中添加如下内容:


    HelloWorld
    HelloWorld



    HelloWorld
    /HelloWorld

方法二:在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目录下。

你可能感兴趣的:(Java)