整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

JSP 表单处理

JSP 表单处理

我们在浏览网页的时候,经常需要向服务器提交信息,并让后台程序处理。浏览器中使用 GET 和 POST 方法向服务器提交数据。

GET 方法

GET方法将请求的编码信息添加在网址后面,网址与编码信息通过"?"号分隔。如下所示:

http://www.runoob.com/hello?key1=value1&key2=value2

GET方法是浏览器默认传递参数的方法,一些敏感信息,如密码等建议不使用GET方法。

用get时,传输数据的大小有限制 (注意不是参数的个数有限制),最大为1024字节。

POST 方法

一些敏感信息,如密码等我们可以通过POST方法传递,POST提交数据是隐式的。

POST提交数据是不可见的,GET是通过在url里面传递的(可以看一下你浏览器的地址栏)。

JSP使用getParameter()来获得传递的参数,getInputStream()方法用来处理客户端的二进制数据流的请求。

JSP 读取表单数据

  • getParameter(): 使用 request.getParameter() 方法来获取表单参数的值。

  • getParameterValues(): 获得如checkbox类(名字相同,但值有多个)的数据。 接收数组变量 ,如checkbox类型

  • getParameterNames():该方法可以取得所有变量的名称,该方法返回一个Emumeration。

  • getInputStream():调用此方法来读取来自客户端的二进制数据流。



使用URL的 GET 方法实例

以下是一个简单的URL,并使用GET方法来传递URL中的参数:

http://localhost:8080/testjsp/main.jsp?name=菜鸟教程&url=http://ww.runoob.com

testjsp 为项目地址。

以下是 main.jsp 文件的JSP程序用于处理客户端提交的表单数据,我们使用getParameter()方法来获取提交的数据:

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ page import="java.io.*,java.util.*" %>

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>菜鸟教程(runoob.com)</title>

</head>

<body>

<h1>使用 GET 方法读取数据</h1>

<ul>

<li><p><b>站点名:</b>

<%=request.getParameter("name")%>

</p></li>

<li><p><b>网址:</b>

<%=request.getParameter("url")%>

</p></li>

</ul>

</body>

</html>

接下来我们通过浏览器访问 http://localhost:8080/testjsp/main.jsp?name=菜鸟教程&url=http://ww.runoob.com 输出结果如下所示:

使用表单的 GET 方法实例

以下是一个简单的 HTML 表单,该表单通过GET方法将客户端数据提交 到 main.jsp 文件中:

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>菜鸟教程(runoob.com)</title>

</head>

<body>

<form action="main.jsp" method="GET">

站点名: <input type="text" name="name">

<br />

网址: <input type="text" name="url" />

<input type="submit" value="提交" />

</form>

</body>

</html>

将以上HTML代码保存到test.htm文件中。 将该文件放置于当前jsp项目的 WebContent 目录下(与 main.jsp 同一个目录)。

通过访问 http://localhost:8080/testjsp/test.html 提交表单数据到 main.jsp 文件,演示 Gif 图如下所示:

在 "站点名" 与 "网址" 两个表单中填入信息,并点击 "提交" 按钮,它将输出结果。

使用表单的 POST 方法实例

接下来让我们使用POST方法来传递表单数据,修改main.jsp与Hello.htm文件代码,如下所示:

main.jsp文件代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ page import="java.io.*,java.util.*" %>

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>菜鸟教程(runoob.com)</title>

</head>

<body>

<h1>使用 POST 方法读取数据</h1>

<ul>

<li><p><b>站点名:</b>

<%

// 解决中文乱码的问题

String name=new String((request.getParameter("name")).getBytes("ISO-8859-1"),"UTF-8");

%>

<%=name%>

</p></li>

<li><p><b>网址:</b>

<%=request.getParameter("url")%>

</p></li>

</ul>

</body>

</html>

代码中我们使用 new String((request.getParameter("name")).getBytes("ISO-8859-1"),"UTF-8")来转换编码,防止中文乱码的发生。

以下是test.htm修改后的代码:

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>菜鸟教程(runoob.com)</title>

</head>

<body>

<form action="main.jsp" method="POST">

站点名: <input type="text" name="name">

<br />

网址: <input type="text" name="url" />

<input type="submit" value="提交" />

</form>

</body>

</html>

通过访问 http://localhost:8080/testjsp/test.html 提交表单数据到 main.jsp 文件,演示 Gif 图如下所示:

传递 Checkbox 数据到JSP程序

复选框 checkbox 可以传递一个甚至多个数据。

以下是一个简单的HTML代码,并将代码保存在test.htm文件中:

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>菜鸟教程(runoob.com)</title>

</head>

<body>

<form action="main.jsp" method="POST" target="_blank">

<input type="checkbox" name="google" checked="checked" /> Google

<input type="checkbox" name="runoob" /> 菜鸟教程

<input type="checkbox" name="taobao" checked="checked" />

淘宝

<input type="submit" value="选择网站" />

</form>

</body>

</html>

以上代码在浏览器访问如下所示:

以下为main.jsp文件代码,用于处理复选框数据:

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ page import="java.io.*,java.util.*" %>

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>菜鸟教程(runoob.com)</title>

</head>

<body>

<h1>从复选框中读取数据</h1>

<ul>

<li><p><b>Google 是否选中:</b>

<%=request.getParameter("google")%>

</p></li>

<li><p><b>菜鸟教程是否选中:</b>

<%=request.getParameter("runoob")%>

</p></li>

<li><p><b>淘宝是否选中:</b>

<%=request.getParameter("taobao")%>

</p></li>

</ul>

</body>

</html>

通过访问 http://localhost:8080/testjsp/test.html 提交表单数据到 main.jsp 文件,演示 Gif 图如下所示:

读取所有表单参数

以下我们将使用 HttpServletRequestgetParameterNames() 来读取所有表单参数,该方法可以取得所有变量的名称,该方法返回一个枚举。

一旦我们有了一个 Enumeration(枚举),我们就可以调用 hasMoreElements() 方法来确定是否还有元素,以及使用nextElement()方法来获得每个参数的名称。

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ page import="java.io.*,java.util.*" %>

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>菜鸟教程(runoob.com)</title>

</head>

<body>

<h1>读取所有表单参数</h1>

<table width="100%" border="1" align="center">

<tr bgcolor="#949494">

<th>参数名</th><th>参数值</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>

</body>

</html>

以下是test.htm文件的内容:

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>菜鸟教程(runoob.com)</title>

</head>

<body>

<form action="main.jsp" method="POST" target="_blank">

<input type="checkbox" name="google" checked="checked" /> Google

<input type="checkbox" name="runoob" /> 菜鸟教程

<input type="checkbox" name="taobao" checked="checked" />

淘宝

<input type="submit" value="选择网站" />

</form>

</body>

</html>

现在我们通过浏览器访问 test.htm 文件提交数据,输出结果如下:

通过访问 http://localhost:8080/testjsp/test.html 提交表单数据到 main.jsp 文件,演示 Gif 图如下所示:

你可以尝试使用以上的JSP代码读取其它对象,如文本框,单选按钮或下拉框等等其他形式的数据。

如您还有不明白的可以在下面与我留言或是与我探讨QQ群308855039,我们一起飞!

么是JSP

JSP全名为Java Server Pages,java服务器页面。JSP是一种基于文本的程序,其特点就是HTML和Java代码共同存在

为什么需要JSP

JSP是为了简化Servlet的工作出现的替代品,Servlet输出HTML非常困难,JSP就是替代Servlet输出HTML的。

简单使用一下JSP

  • 在idea下生成一个JSP,我们来看一下JSP长什么样子

  • 看起来就像一个HTML页面,前面也说了:JSP的特点就是HTML和Java代码共同存在
  • 我们向浏览器输出一句HelloWorld,至于<%%>这个东西,我先不解释!

JSP的工作原理

  • 在Tomcat博客中我提到过:Tomcat访问任何的资源都是在访问Servlet!,当然了,JSP也不例外!JSP本身就是一种Servlet。为什么我说JSP本身就是一种Servlet呢?其实JSP在第一次被访问的时候会被编译为HttpJspPage类(该类是HttpServlet的一个子类)
  • 刚才我简单使用了一下JSP,它被编译成了这么一个Servlet:

  • 编译过程是这样子的:浏览器第一次请求1.jsp时,Tomcat会将1.jsp转化成1_jsp.java这么一个类,并将该文件编译成class文件。编译完毕后再运行class文件来响应浏览器的请求
  • 以后访问1.jsp就不再重新编译jsp文件了,直接调用class文件来响应浏览器。当然了,如果Tomcat检测到JSP页面改动了的话,会重新编译的
  • 既然JSP是一个Servlet,那JSP页面中的HTML排版标签是怎么样被发送到浏览器的?我们来看下上面1_jsp.java的源码就知道了。原来就是用write()出去的罢了。说到底,JSP就是封装了Servlet的java程序罢了。

  • 有人可能也会问:JSP页面的代码服务器是怎么执行的?再看回1_jsp.java文件,java代码就直接在类中的service()中。
String s="HelloWorda";
out.println(s);
  • JSP比Servlet更方便更简单的一个重要原因就是:内置了9个对象!内置对象有:out、session、response、request、config、page、application、pageContext、exception,这几个内置对象不在这里讲。现在先知道一下即可!

JSP生命周期

JSP也是Servlet,运行时只有一个实例,JSP初始化和销毁时也会调用Servlet的init()和destroy()方法。另外,JSP还有自己初始化和销毁的方法

JSP的语法

JSP代码可以分为两部分:

  1. 模板数据:就是HTML代码
  2. 元素:JSP页面中的java代码、JSP指令、JSP标签


JSP脚本

  • JSP的脚本就是JSP页面中的java代码,也叫做scriptlet。JSP的脚本必须使用<%%>括起来,不然会被当成是模板数据的!
  • JSP脚本有三种方式:
  • <%%>【定义局部变量,编写语句】
  • <%!%>【定义类或方法,但是没人这样用!
  • <%=%>(也称之为表达式输出)【输出各种类型的变量,int、double、String、Object等】
  • 如果过多地使用<%%>会导致代码混乱,JSP还提供了一种scriptlet标签,使用此标签和<%%>有相同的功能,只不过它更美观了一些
<jsp:scriptlet>
 String s="HelloWorld";
 out.println(s);
</jsp:scriptlet>

JSP注释

<%--这是JSP注释--%>
<%--%>
//这是java的当行注释
//
/*这是java的多行注释*/
/**/

JSP指令

JSP指令用来声明JSP页面的相关属性,例如编码方式、文档类型等等

JSP指令的语法:

<%@指令 属性名="值" %>


page指令

  • 我在idea生成的JSP页面就有page指令了。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


  • page指令常见属性:
  • language="java"
  • extends="package.class"
  • import="{package.class | package.*}, …"
  • session="true | false"
  • buffer="none | 8kb | sizekb"
  • autoFlush="true | false"
  • isThreadSafe="true | false"
  • info="text"
  • errorPage="relative_url"
  • isErrorPage="true | false"
  • contentType="mimeType ;charset=characterSet " | "text/html ; charset=ISO-8859-1"
  • pageEncoding="characterSet | ISO-8859-1"
  • isELIgnored="true | false"
  • 一般地,在eclipse或idea这些高级开发工具上开发,我们只需要在page指令中指定contentType="text/html;charset=UTF-8",就不会出现中文乱码问题!
  • 当然了contentType 不仅仅可以指定以text/html的方式显示,还可以使用其他的形式显示出来。在conf/web.xml文件中可以查询出来

  • 比如,我以doc形式显示jsp的数据
<%@ page contentType="application/msword;charset=UTF-8" language="java" %>
<html>
<head>
 <title>简单使用JSP</title>
</head>
<body>
 1111
</body>
</html>
  • 我们上网的时候,如果我们操作不当,或者服务器出错了,页面都是会出现友好提示的!这个也能通过page指令来实现跳转到友好提示页面上
  • page指令errorPage=和isErrorPage这两个属性,下面我们来看一下怎么使用!
  • 1.jsp出现了错误,通过page指令的errorPage属性跳转到error.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
<html>
<head>
 <title>该页面出错了!</title>
</head>
<body>
 <%--模拟页面出错了!!!--%>
 <%
 int result=2 / 0;
 %>
 你好呀
</body>
</html>
  • error.jsp页面要通过page指令的isErrorPage属性设置页面就是错误页面
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
 <head>
 <title>友好提示页面</title>
 </head>
 <body>
 服务器正忙着呢!
 </body>
</html>
  • 下面是效果:

  • 当然了,细心的朋友可以发现地址栏是没有变化的,所以属于是服务器跳转。以上的做法是单个页面设置的,如果我会有很多错误(JSP多的情况下,错误就会多),单个设置太麻烦了!
  • 我们可以在web.xml文件中全局设置错误页,只要发生了404错误或者空指针异常的错误都会跳转到error.jsp页面上
<error-page>
 <error-code>404</error-code>
 <location>/error.jsp</location>
</error-page>
<error-page>
 <exception-type>java.lang.NullPointerException</exception-type>
 <location>/error.jsp</location>
</error-page>
  • 随便输个资源进行,会发生发404错误的,跳转到错误页面。下面是效果:


include指令

  • 在讲解request对象的时候,我们曾经使用过request.getRequestDispatcher(String url).include(request,response)来对页头和页尾面进行包含
  • inclue指令也是做这样的事情,我们来试验一下吧!
  • 这是页头
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
 <head>
 <title>页头</title>
 </head>
 <body>
 我是页头
 <br>
 <br>
 <br>
 </body>
</html>
  • 这是页尾
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
 <title>页尾</title>
</head>
<body>
我是页尾
</body>
</html>
  • 在1.jsp中把页头和页尾包含进来
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
 <title>包含页头和页尾进来</title>
</head>
<body>
<%@include file="head.jsp" %>
<%@include file="foot.jsp" %>
</body>
</html>
  • 访问1.jsp

  • include指令是静态包含。静态包含的意思就是:把文件的代码内容都包含进来,再编译!,看一下jsp的源代码就知道了!

  • jsp还提供另一种包含文件的方式:JSP行为---动态包含。jsp行为在下面会讲到!



taglib指令

  • JSP支持标签技术,要使用标签技术就先得声明标签库和标签前缀。taglib指令就是用来指明JSP页面内使用标签库技术。
  • 这里就不详细说明了,等到学习JSP标签的时候再使用吧!现在记住有这个指令即可。



JSP行为

JSP行为(JSP Actions)是一组JSP内置的标签,只书写少量的标记代码就能够使用JSP提供丰富的功能,JSP行为是对常用的JSP功能的抽象和封装

为什么我不把它直接称为JSP标签呢?我把这些JSP内置的标签称之为JSP行为,能够和JSTL标签区分开来。当然了,你也可以把它称之为JSP标签,你不要搞混就行了。我个人喜欢把这些JSP内置标签称之为JSP行为。

include行为

  • 上面已经提及到了,include指令是静态包含,include行为是动态包含其实include行为就是封装了request.getRequestDispatcher(String url).include(request,response)
  • include行为语法是这个样子的
 <jsp:include page=""/>
  • 我们先来使用一下把,在1.jsp页面中也将页头和页尾包含进来
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
 <title>包含页头和页尾进来</title>
</head>
<body>
 <jsp:include page="head.jsp"/>
 <jsp:include page="foot.jsp"/>
</body>
</html>
  • 访问1.jsp页面看一下效果:

  • 使用jsp行为来包含文件,jsp源文件是这样子的:

  • jsp行为包含文件就是先编译被包含的页面,再将页面的结果写入到包含的页面中(1.jsp)
  • 当然了,现在有静态包含和动态包含,使用哪一个更好呢?答案是:动态包含
  • 动态包含可以向被包含的页面传递参数(用处不大),并且是分别处理包含页面的(将被包含页面编译后得出的结果再写进包含页面)【如果有相同名称的参数,使用静态包含就会报错!】
  • 模拟一下场景吧,现在我的头页面有个名为s的字符串变量
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
 <head>
 <title>页头</title>
 </head>
 <body>
 <%
 String s="zhongfucheng";
 %>
 我是页头呀
 <br>
 <br>
 <br>
 </body>
</html>
  • 我的页尾也有个名为s的字符串变量
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
 <title>页尾</title>
</head>
<body>
<%
 String s="zhongfucheng";
%>
我是页尾呀
</body>
</html>
  • 现在我使用静态包含看看会发生什么,出现异常了。

  • 出现异常的原因很简单,就是同一个文件中有两个相同的变量s

  • 使用动态包含就可以避免这种情况


param行为

  • 当使用和行为引入或将请求转发给其它资源时,可以使用行为向这个资源传递参数。


forward行为

  • 在讲解request对象的时候,我们使用request.getRequestDispatcher(String url).forward(request,response)进行跳转。其实forward行为就是对其封装
  • 我们来看一下forward的语法:
<jsp:forward page=""/>
  • 好的,我们来使用一下吧。访问1.jsp页面就跳转到head.jsp页面中
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
 <title>访问1.jsp就跳转到head.jsp</title>
</head>
<body>
<jsp:forward page="head.jsp"/>
</body>
</html>
  • 看一下效果

  • 如果我要传递参数,就要在forward行为嵌套param行为
  • 在跳转到head.jsp时传入参数username值为zhongfucheng
<jsp:forward page="head.jsp">
 <jsp:param name="username" value="zhongfucheng"/>
</jsp:forward>
  • 在head.jsp页面中获取到传递过来的参数
<%
 String ss=request.getParameter("username");
%>
获取到的参数是:
<%=ss%>
  • 效果如下图所示

directive行为

  • directive的中文意思就是指令该行为就是替代指令<%@%>的语法的
  • 相当于<%@include file="" %>
  • 相当于<%@page %>
  • 相当于<%@taglib %>
  • 我们来试一下能不能用的
<jsp:directive.include file="head.jsp"></jsp:directive.include>
<jsp:directive.include file="foot.jsp"></jsp:directive.include>
  • 看下效果,正常可以包含页面:

  • 使用该指令可以让JSP页面更加美观
  • 使用scriptlet行为替代<%%>是同样一个道理


javaBean行为

  • JSP还提供了操作javaBean对象的行为在这里就不详细说明了,后面会讲到的!现在记住JSP提供了javaBean行为来操作简单类即可!
<jsp:useBean id=""/>
<jsp:setProperty name="" property=""/>
<jsp:getProperty name="" property=""/>

文章来源:https://dwz.cn/OtXvyvh3

作者:Java3y

精品长文创作季#

JSP,全称是Java Server Pages,中文含义是Java服务端页面,它是一种用于动态网页开发的技术,本质上就是Servlet程序,只不过JSP是将Servlet中和HTML、CSS、JavaScript等界面相关的代码单独抽取出来,从而形成了JSP,下面就介绍一下JSP程序。

1.1、JSP的本质

JSP是专门用于前端界面显示的一个文件,为什么会出现JSP呢???首先我们来看下,JSP没有出来之前,如果我们要使用Servlet程序编写一个HTML界面,此时你会写出下面的代码:

package com.gitcode.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @version 1.0.0
 * @Date: 2024/2/10 20:20
 * @Author ZhuYouBin
 * @Description:
 */
public class HtmlResponseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 响应HTML内容
        response.setContentType("text/html;charset=UTF-8");
        // 获取输出流
        PrintWriter writer=response.getWriter();

        // 输出HTML内容
        writer.println("<!DOCTYPE html>");
        writer.println("<html lang=\"en\">");
        writer.println("<head>");
        writer.println("    <meta charset=\"UTF-8\">");
        writer.println("    <title>响应HTML内容</title>");
        writer.println("</head>");
        writer.println("<body>");
        writer.println("    <h3>Hello World!你好,世界!</h3>");
        writer.println("</body>");
        writer.println("</html>");

        // 关闭流
        writer.close();
    }
}

从上面代码中,可以看出来,开发一个HTML界面,需要使用writer输出流,将HTML代码拼接起来,通过HttpServletResponse响应对象,返回给客户端。

可想而知,这是多么复杂的事情,这还只是一个HTML界面,一个Web工程中有着几十、几百个HTML,那么通过这种编码方式,一方面开发效率非常低,另一方面后期维护起来的时候,也是非常困难。

所以,为了解决这个问题,Sun公司就提出了一种新的动态网页开发技术,也就是我们这里所学的JSP程序。

JSP是如何解决输出HTML问题的呢???

我们这样想一下,在上面的代码中,大部分代码都是使用writer.println()方法输出HTML标签内容,那么我们能不能将这一部分代码单独抽取出来,然后在程序运行的时候,再把这些代码嵌入到对应的位置,最终拼接成一个完整的HTML返回给客户端。

Sun公司就是采用了这种思想,将这些和HTML相关的代码都单独抽取了出来,将其单独保存到一个以【.jsp】为后缀的文件里面,这个.jsp文件就叫做JSP程序。Sun公司开发了一个JSP引擎程序,在程序运行过程中,通过JSP引擎将对应的jsp文件渲染成Servlet程序,最终将渲染的结果响应给客户端,这样就实现了简化Servlet的开发。

所以说,JSP程序本质上就是Servlet程序,这是因为JSP引擎会将我们访问的JSP文件,渲染成Servlet程序,然后再执行这个Servlet程序,从而完成客户端的响应处理。

1.2、创建JSP程序

创建JSP程序非常简单,我们只需要创建一个以【.jsp】为后缀的文件,接着编写相关的代码即可。在IDEA中的web目录下,创建一个HelloWorld.jsp文件,如下:

这样就创建成功啦!!!启动Tomcat容器,浏览器访问http://localhost:8080/servlet/HelloWorld.jsp地址,看到下面内容,那么第一个JSP程序就算完成啦。

PS:一般情况下,我们会将jsp文件保存在WEB-INF目录下面,因为这个目录下的文件是受保护的,浏览器不能直接访问

今天就到这里,未完待续~~