JSP_客户端请求,表单处理,过滤器,cookies处理

Posted 小企鹅推雪球!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSP_客户端请求,表单处理,过滤器,cookies处理相关的知识,希望对你有一定的参考价值。

JSP_客户端请求

  1. 当浏览器请求网页时,它会向Web服务器发送大量信息。这些信息不能直接读取,因为这些信息作为HTTP请求标头的一部分。

重要的http请求头信息

  1. Cookie请求头将返回给先前发送到服务器的cookie到浏览器。
  2. Host请求头指定原始URL中给出的主机和端口。
  3. Connection请求头指示客户端是否可以处理持久的HTTP连接。 持久连接允许客户端或其他浏览器通过单个请求检索多个文件。如果是Keep-Alive值表示使用持久连接。

JSP_HttpServletRequest对象

  1. request对象是javax.servlet.http.HttpServletRequest对象的一个实例。 每当客户端请求页面时,JSP引擎将创建一个新对象来表示该请求
  2. HttpServletRequest请求对象提供了获取包括表单数据,Cookie,HTTP方法等HTTP头信息的方法。
  3. HttpServletRequest对象代表Web服务器的客户端请求。

JSP_HTTP头请求示例

  1. 使用HttpServletRequest对象的getHeaderNames()方法来读取HTTP头信息的示例
  2. getHeaderNames返回包含与当前HTTP请求相关联的头信息的枚举。

创建index.jsp内容如下

head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>客户端请求参数数据</title>
</head>
<body>
    <div style="margin: auto; width: 80%;">
        <h2>客户端请求头参数数据示例</h2>

        <table width="100%" border="1" align="center">
            <tr bgcolor="#949494">
                <th>Header Name</th>
                <th>Header Value(s)</th>
            </tr>
            <%
                Enumeration headerNames = request.getHeaderNames();
                while (headerNames.hasMoreElements()) {
                    String paramName = (String) headerNames.nextElement();
                    out.print("<tr><td>" + paramName + "</td>\\n");
                    String paramValue = request.getHeader(paramName);
                    out.println("<td> " + paramValue + "</td></tr>\\n");
                }
            %>
        </table>
    </div>
</body>

JSP_服务器响应

  1. 当Web服务器响应HTTP请求时,响应通常由状态行,一些响应头,空行和文档组成。

HttpServletResponse对象

  1. response对象是javax.servlet.http.HttpServletResponse对象的一个实例。就像服务器创建请求对象一样,它还创建一个对象来表示对客户端的响应。
  2. response对象还定义了处理创建新HTTP头的接口。通过此对象,JSP程序员可以添加新的Cookie或日期戳,HTTP状态代码等。

使用setIntHeader()方法设置Refresh头来模拟数字时钟

<body>
    <div style="margin: auto; width: 80%;">
        <h2>自动刷新HTTP标头示例</h2>
        <%
            // Set refresh, autoload time as 5 seconds
            response.setIntHeader("Refresh", 3);

            // Get current time
            Calendar calendar = new GregorianCalendar();

            String am_pm;
            int hour = calendar.get(Calendar.HOUR);
            int minute = calendar.get(Calendar.MINUTE);
            int second = calendar.get(Calendar.SECOND);

            if (calendar.get(Calendar.AM_PM) == 0)
                am_pm = "AM";
            else
                am_pm = "PM";
            String CT = hour + ":" + minute + ":" + second + " " + am_pm;
            out.println("Current Time is: " + CT + "\\n");
        %>
    </div>
</body>

JSP_表单处理

  1. 当需要从浏览器将一些传递到Web服务器的信息处理并最终传递到后端程序时,可能会遇到一些情况。浏览器使用两种方法将此信息传递到Web服务器。GET或POST

GET方法

  1. GET方法将附加的用户数据信息编码并发送到请求的页面。页面和编码信息被分隔符 - ?字符分隔开
http://www.baidu.com/hello?key1=value1&key2=value2
  1. GET方法是将信息从浏览器传递到Web服务器的默认方法,它生成一个长字符串,出现在浏览器的地址栏框中。如果有密码或其他敏感信息传递到服务器,建议最好不要使用GET方法
  2. GET方法具有大小限制:请求字符串中最多只能有1024个字符。
  3. 可以使用getQueryString()和getParameter()方法来处理请求对象。

POST方法

  1. 通常更可靠的将信息传递给后端程序是使用POST方法。
  2. POST方法与GET方法将信息打包的方式完全相同,而不是将使用?作为分隔符组成文本字符串并在URL中发送。 此消息以标准输入的形式发送到后端程序,可以解析并用于处理。
  3. JSP使用getParameter()方法处理这种类型的请求,以读取简单参数的值,而getInputStream()方法来读取客户端的二进制数据流。

使用JSP读取表单数据

  1. getParameter() - 调用request.getParameter()方法来获取表单参数的值。
  2. getParameterValues() - 如果参数出现多次并返回多个值(例如复选框),则调用此方法。
  3. getParameterNames() - 如果想要当前请求中的所有参数的完整列表,则调用此方法。
  4. getInputStream() - 调用此方法读取客户端的二进制数据流。

GET使用URL示例

  1. 将使用GET方法将两个值传递给HelloForm程序。
  2. http://localhost:8080/FormProcessing/main.jsp?username=maxsu&email=ryx@163.com
  3. index.jsp内容
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>使用GET方法读取URL请求数据</title>
</head>
<body>
    <h1>使用GET方法读取URL请求数据</h1>
    <ul>
        <li><p>
                <b>UserName:</b>
                <%=request.getParameter("username")%>
            </p></li>
        <li><p>
                <b>Email:</b>
                <%=request.getParameter("email")%>
            </p></li>
    </ul>
</body>
</html>

GET方法处理表单数据

  1. index.jsp提交按钮传递两个值的示例。这里使用hello.html来处理这个输入
<html>
<head>
<meta charset="UTF-8">
<title>用户表单处理</title>
</head>
<body>
    <div style="margin: auto; width: 80%;">
        <form action="index.jsp" method="GET">
            用户名: <input type="text" name="username">  Email: <input
                type="text" name="email" /> <input type="submit" value="提交" />
        </form>
    </div>
</body>
</html>

POST方法处理表单元素

  1. 使用GET或POST方法处理由Web浏览器给出的输入JSP程序:index.jsp。
<title>使用Post方读取请求数据</title>
</head>
<body>
    <h1>使用Post方读取表单数据</h1>
    <ul>
        <li><p>
                <b>UserName:</b>
                <%=request.getParameter("username")%>
            </p></li>
        <li><p>
                <b>Email:</b>
                <%=request.getParameter("email")%>
            </p></li>
    </ul>
</body>
<title>用户表单处理</title>
</head>
<body>
    <div style="margin: auto; width: 80%;">
        <form action="index.jsp" method="post">
            用户名: <input type="text" name="username">  Email: <input
                type="text" name="email" /> <input type="submit" value="提交" />
        </form>
    </div>
</body>

JSP_处理复选框数据

  1. 当表单数据需要多个选项时,可使用复选框。以下是具有两个复选框的表单的示例HTML代码:
<html>
<head>
<meta charset="UTF-8">
<title>复选框数据处理示例</title>
</head>
<body>
    <div style="margin: auto; width: 80%;">
        <h2>选择课程(多选)</h2>
        <form action="index.jsp" method="POST">
            <input type="checkbox" name="maths" checked="checked" /> 数学 <input
                type="checkbox" name="physics" /> 物理 <input type="checkbox"
                name="chemistry" checked="checked" /> 化学 <input
                type="submit" value="选择提交" />
        </form>
    </div>
</body>
</html>

index.jsp

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>复选框数据处理示例</title>
</head>
<body>
    <div style="margin: auto; width: 80%;">
        <h2>复选框数据处理示例</h2>
        <ul>
            <li><p>
                    <b>数学:</b>
                    <%=request.getParameter("maths")%>
                </p></li>
            <li><p>
                    <b>物理:</b>
                    <%=request.getParameter("physics")%>
                </p></li>
            <li><p>
                    <b>化学:</b>
                    <%=request.getParameter("chemistry")%>
                </p></li>
        </ul>
    </div>
</body>
</html>

JSP_读取所有表单数据

  1. 使用HttpServletRequest的getParameterNames()方法读取所有可用的表单参数的通用示例,此方法返回一个枚举,其中包含未指定顺序的参数名称。
  2. 当有了返回的枚举后,就可以使用标准方式循环枚举,使用hasMoreElements()方法来确定何时停止并使用nextElement()方法来获取每个参数名称。

index.html

<title>获取所有表单数据</title>
</head>
<body>
<body>
    <div style="margin: auto; width: 80%;">
        <h2>选择课程(多选)</h2>
        <form action="index.jsp" method="POST">
            <input type="checkbox" name="maths" checked="checked" value="math"/> 数学 <input
                type="checkbox" name="physics" value="phys"/> 物理 <input type="checkbox"
                name="chemistry" checked="checked" value="chem"/> 化学 <input type="submit"
                value="选择提交" />
        </form>
    </div>
</body>

index.jsp样例内容

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>获取所有表单数据</title>
</head>
<body>
    <div style="margin: auto; width: 80%;">
        <h2>获取所有表单数据</h2>
        <table width="100%" border="1" align="center">
            <tr bgcolor="#949494">
                <th>Param Name</th>
                <th>Param Value(s)</th>
            </tr>
            <%
                Enumeration paramNames = request.getParameterNames();
                while (paramNames.hasMoreElements()) {
                    String paramName = (String) paramNames.nextElement();
                    out.print("<tr><td>" + paramName + "</td>\\n");
                    String paramValue = request.getParameter(paramName);
                    out.println("<td> " + paramValue + "</td></tr>\\n");
                }
            %>
        </table>
    </div>
</body>
</html>

JSP_过滤器

  1. 过滤器用于在客户端访问后端的资源之前拦截请求,在服务器发送回客户端之前操纵响应
  2. 过滤器部署在部署描述符文件web.xml中,然后映射到应用程序部署描述符中的servlet或JSP名称或URL模式。
  3. 部署描述符文件web.xml可以在<Tomcat-installation-directory>\\conf目录中或在项目的WEB-INF目录下找到。

过滤器的方法

  1. 过滤器只是一个实现javax.servlet.Filter接口的Java类
  2. public void doFilter (ServletRequest, ServletResponse, FilterChain):在链末端的客户端请求,所以每当通过链路传递请求/响应对时,容器就会调用此方法
  3. public void init(FilterConfig filterConfig)方法由Web容器调用,向过滤器指示它正在投入使用。
  4. public void destroy()由Web容器调用以向过滤器指示它正在停用服务。

JSP_过滤器样例

  1. 显示了客户访问任何JSP文件时,打印客户端的IP地址和当前日期时间

这是bean类的内容

package com.yiibai;

//Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

//Implements Filter class
public class LogFilter implements Filter {
    public void init(FilterConfig config) throws ServletException {
        // Get init parameter
        String testParam = config.getInitParameter("test-param");
        // Print the init parameter
        System.out.println("Test Param: " + testParam);
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws java.io.IOException, ServletException {

        // Get the IP address of client machine.
        String ipAddress = request.getRemoteAddr();

        // Log the IP address and current timestamp.
        System.out.println("IP " + ipAddress + ", Time " + new Date().toString());

        // Pass request back down the filter chain
        chain.doFilter(request, response);
    }

    public void destroy() {
        /*
         * Called before the Filter instance is removed from service by the web
         * container
         */
    }
}

web.xml中的JSP过滤器的映射

  1. 过滤器需要先定义,然后映射到URL或JSP文件名,与Servlet定义的方式大致相同,然后映射到web.xml文件中的URL模式。
  2. 在部署描述符文件web.xml中为过滤器标签创建以下标签项 -
<filter>
   <filter-name>LogFilter</filter-name>
   <filter-class>LogFilter</filter-class>

   <init-param>
      <param-name>test-param</param-name>
      <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>

<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>
  1. 上述过滤器将适用于所有servlet和JSP,因为我们在配置中指定了/*。如果要仅在少数servlet或JSP上应用过滤器,则可以指定特定的servlet或JSP路径。

JSP_cookies处理

  1. Cookie是存储在客户端计算机上的文本文件,它们用于各种信息的跟踪
  2. JSP支持使用底层的cookies处理技术

cookies识别和返回用户信息有三个步骤

  1. 服务器脚本将一组Cookie发送到浏览器。例如姓名,年龄或身份证号等
  2. 浏览器将此信息存储在本地机器上以备将来使用。’
  3. 当下一次浏览器向Web服务器发送任何请求时,浏览器将这些cookie信息发送到服务器,服务器使用该信息来识别用户,或者也可以用于其他目的。

jsp设置Cookies

  1. 创建一个cookies对象,指定Cookie名称和Cookie值调用Cookie构造函数,这两者都是字符串Cookie cookie = new Cookie("key","value");
    注意:名称和值都不应包含空格或[ ] ( ) = , " / ? @ : ;
  2. 设置最大有效时间:可以使用setMaxAge指定cookie应该有效的时间(以秒为单位)。以下代码将设置一个24小时有效时间的cookie
Cookie cookie = new Cookie("key","value");
cookie.setMaxAge(60*60*24);
  1. 将Cookie发送到HTTP响应头使用response.addCookie在HTTP响应标头中添加Cookie
Cookie cookie = new Cookie("key","value");
cookie.setMaxAge(60*60*24); 
response.addCookie(cookie);

JSP_操作Cookies案例

  1. 现将用户提交上来的用户名和Email设置到cookie中,并返回到客户端浏览器

index.jsp内容:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>接收表单并设置Cookies</title>
</head>
<body>
    <%

        Cookie cookie1 = new Cookie("username", request.getParameter("username"));
        Cookie cookie2 = new Cookie("email", request.getParameter("email"));
        cookie1.setMaxAge(60 * 60 * 24);
        cookie2.setMaxAge(60 * 60 * 24);

       
        response.addCookie(cookie1);
        response.addCookie(cookie2);
    %>
    <div style="margin: auto; width: 80%;">
        <center>
            <h2>设置Cookies</h2>
        </center>
        <ul>
            <li><p>
                    <b>用户名:</b>
                    <%=request.getParameter("username")%>
                </p></li>
            <li><p>
                    <b>Email:</b>
                    <%=request.getParameter("email")%>
                </p></li>
        </ul>
    </div>
</body>
</html>

创建另一个显示表单的html文件,main.jsp 内容如下

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户表单</title>
</head>
<body>
    <div style="margin: auto; width: 80%">
        <form action="index.jsp" method="POST">
            用户名: <input type="text" name="username">
            Email: <input type="text" name="email" /> <input
                type="submit" value="提交" />
        </form>
    </div>
</body>
</html>

JSP_读取Cookies

  1. 使用JSP读取cookie,需要通过调用HttpServletRequest的getCookies()方法来创建一个javax.servlet.http.Cookie对象的数组
  2. 循环遍历数组,并使用getName()和getValue()方法来访问每个cookie和关联的值。

getCookies.jsp内容

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>读取Cookies</title>
</head>
<body>
    <div style="margin: auto; width: 80%;">
        <%
            Cookie cookie = null;
            Cookie[] cookies = null;

            cookies = request.getCookies();

            if (cookies != null) {
                out.println("<h2>找到的Cookie名称和值</h2>");

                for (int i = 0; i < cookies.length; i++) {
                    cookie = cookies[i];
                    out.print("Name : " + cookie.getName() + ",  ");
                    out.print("Value: " + cookie.getValue() + " <br/>");
                }
            } else {
                out.println("<h2>没有找到cookies</h2>");
            }
        %>
    </div>
</body>
</html>

JSP_删除Cookie

  1. 删除一个cookie,需要三个步骤
  2. 第一步:读取已存在的cookie并将其存储在Cookie对象中。
  3. 第二步:使用setMaxAge()方法将Cookie的过期时间设置为零,以删除现有的Cookie。
  4. 第三步:将此cookie添加回响应头。

删除名为usename的cookie,并且下次运行访问getcookies.jsp时,将不再返回username的cookies值。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>删除Cookies</title>
</head>
<body>
    <div style="margin: auto; width: 80%;">
        <center>
         <h1>删除Cookies</h1>
      </center>
      <%
         Cookie cookie = null;
         Cookie[] cookies = null;
         cookies = request.getCookies();

         if( cookies != null ) {
            out.println("<h2>找到的Cookie名称和值</h2>");
            for (int i = 0; i < cookies.length; i++) {
               cookie = cookies[i];
               if(cookie.getName().equals("username")) {
                  cookie.setMaxAge(0);
                  response.addCookie(cookie);
                  out.print("Deleted cookie: " + cookie.getName( ) + "<br/>");
               }
               out.print("Name : " + cookie.getName( ) + ",  ");
               out.print("Value: " + cookie.getValue( )+" <br/>");
            }
         } else {
            out.println(
            "<h2>No cookies founds</h2>");
         }
      %>
    </div>
</body>
</html>

以上是关于JSP_客户端请求,表单处理,过滤器,cookies处理的主要内容,如果未能解决你的问题,请参考以下文章

JSP Cookie 处理

jsp学习与提高——JSP Cookie 处理

JSP Cookie 处理

Cookie不能保存中文的解决办法

Jsp处理过程and数据交互

雷林鹏分享:jsp Cookies 处理