JavaWeb——Servlet开发2

1、HttpServletRequest的使用

 获取Request的参数的方法。

  • 方法getParameter将返回参数的单个值
  • 方法getParameterValues将返回参数的值的数组
  • 方法getParameterMap将返回包含了所有参数名值对的java.util.Map<String,String[]>
  • 方法getParameterNames方法将返回所有可用参数的名字的枚举

 确定与内容相关的信息

  • getContentType将返回请求的MIME内容类型,例如text/html、application/javascript等等
  • getContentLength和getContentLong都将返回请求正文的长度,区别是getContentLong用于内容超过2GB的
  • getCharacterEncoding将返回请求内容的字符编码

 读取请求的内容

  • getInputStream将返回一个javax.servlet.ServletInputStream,用于读取请求中的二进制内容
  • getReader将返回一个java.io.BufferedReader,用于读取字符编码

     要注意的是不能在统一请求上同时使用这两个方法,调用了其中一个方法之后,再调用另一个方法将触发异常

 读取请求特有的数据

  • getRequestURL,返回客户端同于创建请求的完整URL,包括协议、服务器名、端口号和服务器路径,不包括查询字符串,例如http://localhost:8080/hello-world/first?user=a%20user,该方法将返回http://localhost:8080/hello-world/first

  • getRequestURI,只返回URL的服务器路径部分,对于上面的例子来说,该方法将返回/hello-world/first
  • getServletPath,只返回Servlet映射的URL部分/first
  • getHeader,返回指定名字的头数据,传入参数的大小写不必与头名称大小写一致,所以getHeader("contenttype")可以匹配Content-Type头,如果多个头使用了相同的名字,将只返回第一个值如果不指定参数名,将返回所有值的枚举

  • getHeaderNames:返回请求中所有头数据的枚举
  • getDateHeader:对于可以表示有效时间戳的头数据,将返回一个Unix时间戳

2、使用HttpServletResponse

 编写响应正文

  • getOutputStream将返回一个javax.servlet.ServletOutputStream,将用于编写二进制数据
  • getWriter将返回一个java.io.PrintWriter,使用这个方法可以向客户端返回HTML或者其他基于字符编码的文本。

  同样不能对同一个响应对象同时使用这两个方法,调用了其中一个方法之后,再调用另一个方法将触发异常

  • setContentType和setCharacterEncoding将用于设置内容类型和编码格式

 设置头和其他响应属性

  • setHeader、setIntHeader、setDateHeader等方法可以设置几乎所有的头数据,如果现有的响应头中已经包括了同名的头、该头数据将被覆盖。
  • 为了防止覆盖可以使用addHeader、addIntHeader、addDateHeader等方法,这些方法不会覆盖原有的头数据,会添加一个额外的值。
  • 还可以使用getHeader、getIntHeader、getDateHeader等方法判断是否已经在响应中设置过某个响应头

  另外还可以使用

  • setStatus 用于设置HTTO响应状态码
  • getStatus 判断当前响应的状态
  • sendError 设置状态码,表示一条可选的错误消息将会输出到响应数据中,重定向到Web容器为客户端提供错误页面,并清空缓存

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

3、使用参数和接受表单提交

  上面记录了很多方法,接下来就是使用的时候了

  在我自己实现的HelloServlet中我修改了doGet和doPost方法:

    private static final String DEFAULT_USER = "Guest";

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String user = req.getParameter("user");
        if(user == null){
            user = HelloServlet.DEFAULT_USER;
        }
        resp.setContentType("text/html");
        resp.setCharacterEncoding("UTF-8");

        PrintWriter writer = resp.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="first" 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>
");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }

  这里的实现的具体逻辑是:

  • 检查请求中是否包含user参数,如果没有包含的话,就设置为我提前设置好的常量
  • 将响应的内容类型设置为text/html,将字符编码设置为UTF-8
  • 从响应中获取一个PrintWriter,然后调用append方法编写响应正文

  这里的HTML中的表单方法设置为POST,不过在doPost中只是简单的调用了doGet方法,因为这里的表单将读取我们输入的数据并赋值给user变量。

  这是直接访问这个URL的效果。

  在URL中添加字符串user=niko,变成http://localhost:8080/hello-world/first?user=niko

  在输入框中输入xx,点击Submit

然后我修改了一下,试用了上面的大部分代码,比较乱,代码是:

    private static final String DEFAULT_USER = "Guest";

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String user = req.getParameter("user");
        if(user == null){
            user = HelloServlet.DEFAULT_USER;
        }
        resp.setContentType("text/html");
        resp.setCharacterEncoding("UTF-8");

        PrintWriter writer = resp.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="first" method="POST">
")
                .append("              用户名:<input type="text" name="user"/><br/>
")
                .append("              密码 :<input type="text" name="pwd"><br/>
")
                .append("              性别:<input type="radio" name="sex" value="boy" checked="checked">男
")
                .append("                    <input type="radio" name="sex" value="girl">女<br/>
")
                .append("              爱好:<input type="checkbox" name="hobby" value="game" >打游戏
")
                .append("                    <input type="checkbox" name="hobby" value="book" >看书
")
                .append("                    <input type="checkbox" name="hobby" value="music" >听音乐
")
                .append("                    <input type="checkbox" name="hobby" value="coding" >编程<br/>
")
                .append("               所在学校:<select name="school">
")
                .append("                        <option>---请选择---</option>
")
                .append("                        <option value="yz">一中</option>
")
                .append("                        <option value="ez">二中</option>
")
                .append("                        <option value="bz">八中</option>
")
                .append("                        </select><br/>
")
                .append("               <input type="submit" value="点击提交">
")
                .append("         </form>
")
                .append("     </body>
")
                .append("</html>
");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String user = req.getParameter("user");
        String pwd = req.getParameter("pwd");
        String sex = req.getParameter("sex");
        String[] hobby = req.getParameterValues("hobby");
        String school = req.getParameter("school");
        Map<String,String[]> paramMap = req.getParameterMap();
        Enumeration<?> paramNames = req.getParameterNames();
        Enumeration<?> HeaderNames = req.getHeaderNames();
        this.doGet(req,resp);

        PrintWriter writer = resp.getWriter();
        if(user != null){
            writer.append("用户名 = ").append(user).append("<br/>");
        }
        if(pwd != null){
            writer.append("密码 = ").append(pwd).append("<br/>");
        }
        if(sex != null){
            writer.append("性别 = ").append(sex).append("<br/>");
        }
        if(hobby != null){
            writer.append("爱好 = ").append(Arrays.toString(hobby)).append("<br/>");
        }
        if(school != null){
            writer.append("学校 = ").append(school).append("<br/><br/>");
        }
        if(paramMap != null){
            writer.append("paramMap:").append("<br/>");
            for (Map.Entry<String,String[]> entry : paramMap.entrySet()) {
                writer.append(entry.getKey()).append(" = ").append(Arrays.toString(entry.getValue())).append("<br/>");
            }
        }
        if(paramNames != null){
            writer.append("paramNames: ");
            while(paramNames.hasMoreElements()){
                String value = (String)paramNames.nextElement();
                writer.append(value).append(", ");
            }
            writer.append("<br/>");
        }
        writer.append("getContentType:  ").append(req.getContentType()).append("<br/>");
        writer.append("getContentLength:  " + req.getContentLength()).append("<br/>");
        writer.append("getCharacterEncoding:  ").append(req.getCharacterEncoding()).append("<br/>");
        writer.append("getRequestURL:  ").append(req.getRequestURL()).append("<br/>");
        writer.append("getRequestURI:  ").append(req.getRequestURI()).append("<br/>");
        writer.append("getDateHeader:  " + req.getDateHeader("")).append("<br/>");
        if(HeaderNames != null){
            writer.append("HeaderNames: ");
            while(HeaderNames.hasMoreElements()){
                String value = (String)HeaderNames.nextElement();
                writer.append(value).append(", ");
            }
            writer.append("<br/>");
        }
    }

  具体效果:

原文地址:https://www.cnblogs.com/xxbbtt/p/8349963.html