zoukankan      html  css  js  c++  java
  • Java Web高级编程(一)

    Servlet

    一、创建Servlet类

    在Java EE中,Servlet用来接收和响应终端用户的请求。Servlet是所有Web应用程序的核心类,是唯一既可以直接处理和响应用户请求,也可以将处理工作委托给应用中的其它部分的类。除非某些过滤器提前终止了客户端的请求,否则所有的请求都将被发送到某些Servlet中。

    所有的Servlet都实现了javax.servlet.Servlet接口,但通常不是直接实现的,Servlet知识一个简单的接口,包含了初始化并销毁和处理请求的方法。无论什么类型的请求都将会调用service方法。

    作为响应HTTP请求的java.servlet.http.HttpServlet,并实现了只接受HTTP请求的service方法。提供了响应每种HTTP方法类型的方法的空实现。

    方法 Servlet方法 目的
    GET doGet() 从指定的URL中获取资源
    HEAD doHead() 与GET一致,但是只返回头部数据
    POST doPost() 通常用于处理Web表单提交
    PUT doPut() 存储URL中提供的实体
    DELETE doDelete() 删除URL标识的资源
    OPTIOND doOptions() 返回支持的HTTP方法
    TRACE doTrace() 用于诊断目的

    Servlet将总是继承HttpServlet。这样方法的接受的是javax.servlet.http.HttpServletRequest和javax.servlet.http.HttpServletResponse参数,这样就可以轻松访问Servlet服务所处理的请求中的HTTP特定的特性。

    创建全新的空Servlet开始,让它继承HttpServlet。任何未重写的HTTP Servlet方法都将返回一个HTTP状态405作为响应,需要重写doGET()方法,添加对HTTP GET方法的支持。

    import javax.servlet.http.HttpServlet;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    public class helloServlet extends HttpServlet{   
        @Override   
        protected void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{   resopnse.getWriter().println(" ");   }
    }

    初始化方法和销毁方法

    @Override
        public void init() throws ServletException
        {
            System.out.println("Servlet " + this.getServletName() + " has started.");
        }
    
        @Override
        public void destroy()
        {
            System.out.println("Servlet " + this.getServletName() + " has stopped.");
        }

    二、配置可部署的Servlet

    在创建完Servlet之后,尽管已经有了一个可以响应HTTP GET请求并发出问候的类,需要再WEB-INF目录中创建的web.xml文件,并对Servlet进行配置,使它可以正确地部署到服务器中。然后使得浏览器可以访问到该Servlet。

    在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_3_1.xsd"
             version="3.1">
    
        <display-name>Hello World Application</display-name><--?代表了应用程序在应用服务器中显示的名字-->
    
    </web-app>

    当需要该诉Web容器创建一个之前实例Servlet的实例,因此在描述符文件中的开始和结束标志符中添加一个Servlet标签:

    <servlet>
            <servlet-name>helloServlet</servlet-name>
            <servlet-class>com.wrox.HelloServlet</servlet-class>
    </servlet>

    同时

    <load-on-startup>1</load-on-startup>

    如果多个Servlet配置都包含了该标签,它们将按照标签内值的大小顺序启动,值越小越先启动。,如果多个Servlet的<load-on-startup>配置相同,将按照它们在描述符文件中出现的顺序启动。

    将Servlet映射到URL中,在告诉应用服务器如何启动Servlet之后,需要告诉该Servlet应该如何应该对那些请求URL做出响应:

    <servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <url-pattern>/greeting</url-pattern>
    </servlet-mapping>

    使用该配置之后,所有访问应用程序相对URL/greeting的请求都将有helloServlet处理,其中<servlet>和<servlet-mapping>标签内的<servlet-name>标签应该一致。当然可以通过多个<url-pattern>标签,让多个URL映射到同一个servlet中。对有相同逻辑但是不同处理页面的web就可以将其连接到同一个servlet,只是在<servlet-name>中添加不同的实例名称。

    三、doGet()和doPost()

    Servlet类的service方法会处理所有到达的请求。最终,它必须根据所使用的协议解析并处理到达请求中的数据,然后返回客户端可接受的响应。扩展HttpServlet使我们不需要考虑到任何细节。

    HttpServletRequest接口是对ServletRequest的扩展,将提供关于收到请求的额外的与HTTP协议相关信息。

    获取请求参数:

    HttpServletRequest最重要的功能是从客户端发送的请求中获取参数。请求参数有两种不同的形式:

    查询参数(URI参数),以application/x-www-form-urlencodeed或multipart/form-data编码的请求正文。

    getParameter方法将返回参数的单个值,如果参数有多个值,将返回第一个值,getParameterValues将返回参数的值的数组。

    确定与请求内容相关的信息:

    getContentType方法将确定HTTP请求内容的类型,

    getContentLenght方法和getContentLengthLong都返回了请求正文的长度,

    getCharacterEncoding方法将返回请求内容的字符编码。

    读取请求的内容:

    getInputStream和getReader都可以用来读取请求的内容,如果是UTF-8和ISO-8859-1则使用getReader是最简单的方法,如果是二进制格式则使用getInputStream是最方便的,但是在调用其中一个方法之后不可以再调用另外一个。

    获取请求的特有数据:

    getRequestURL,返回客户端完整用于创建请求的完整的URL。

    getRequestURI,只返回URL中服务器路径部分。

    getServletPath,返回更少的URI。

    getHeader,返回制定名字的头数据。

    getHeaderName,返回请求中所有头数据的名字的枚举。

    getIntHeader和getDataHeader。

    使用HttpServletResponse

    HttpServletResponse提供了对请求中与HTTP协议相关属性的访问,并且可以使用相应对象完成设置响应头,编写响应正文,重定向请求,设置HTTP状态码以及将Cookies返回到客户端等任务。

    编写响应正文:

    就是讲内容输出道响应正文中,可以是在浏览器中显示的HTML、浏览器中希望获取的图像或者下载的文件内容。getOutputStream方法将返回一个javax.servlet.ServletOutputStream,而方法getWriter将返回一个java.io.PrintWriter,通过他们可以向响应中输出数据,但是不要对一个对象同时使用上述两种方法。在向响应正文中输出数据时,可能需要设置内容类型或编码格式:setContentType和setCharacterEncoding。

    另外还可以使用:

    setStatus:设置HTTP响应状态码,

    getStatus:获取当前的响应状态,

    sendError:设置状态码,

    sendRedirect:将客户端重定向至另一个URL。

        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException
        {
            String user = request.getParameter("user");
            if(user == null)
                user = HelloServlet.DEFAULT_USER;
    
            response.setContentType("text/html");
            response.setCharacterEncoding("UTF-8");
    
            PrintWriter writer = response.getWriter();
            writer.append("<!DOCTYPE html>
    ")
                  .append("<html>
    ")
                  .append("    <head>
    ")
                  .append("        <title>Hello User Application</title>
    ")
                  .append("    </head>
    ")
                  .append("    <body>
    ")
                  .append("        Hello, ").append(user).append("!<br/><br/>
    ")
                  .append("        <form action="greeting" method="POST">
    ")
                  .append("            Enter your name:<br/>
    ")
                  .append("            <input type="text" name="user"/><br/>
    ")
                  .append("            <input type="submit" value="Submit"/>
    ")
                  .append("        </form>
    ")
                  .append("    </body>
    ")
                  .append("</html>
    ");
        }

    四、初始化参数配置应用程序

    初始化参数配置应用程序可以提供一些配置应用程序和其中Servlet的方式。通过上下文初始化参数和Servlet初始化参数进行设置是最简单的方法,这些参数可以定义关系数据库的链接信息,提供发送订单警告的邮件地址,这些参数在启动时定义,重启才会被修改。

        <context-param>
            <param-name>settingOne</param-name>
            <param-value>foo</param-value>
        </context-param>
        <context-param>
            <param-name>settingTwo</param-name>
            <param-value>bar</param-value>
        </context-param>

    在初始化参数之后可以在Servlet代码的任何地方使用这些参数

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException
        {
            ServletConfig c = this.getServletConfig();
            PrintWriter writer = response.getWriter();
    
            writer.append("database: ").append(c.getInitParameter("database"))
                  .append(", server: ").append(c.getInitParameter("server"));
        }

    另外一种初始化参数的方法是通过注解:

    @WebServlet{
        name = "servletParameterServlet",
        urlPatterns = {"/servletParameters"},
        initParams = {
            @WebInitParam{name = "database", value = "CustomerSupport"},
            @WebInitParam{name = "server", value = "10.0.12.5"}
        }
    }
  • 相关阅读:
    在线用户数与并发用户数的区别和比例关系
    MYSQL中数据类型介绍
    5分钟教你搞定RAID模式
    nginx与fastdfs配置详解与坑
    Fastdfs group通过添加硬盘扩容
    fastDfs配置文件tracker.conf配置详解
    FastDFS配置详解之Storage配置
    mysql修改库名
    vCenter Server Appliance(VCSA )6.7部署指南
    如何知道一个函数的执行时间简单案例
  • 原文地址:https://www.cnblogs.com/winterfells/p/8016947.html
Copyright © 2011-2022 走看看