Java Web简明教程–Servlet篇[3]–获取网页数据

简介: 上篇讲了网页可以通过get或post方式向Servlet抛出请求,有时候呢,请求是带参数的。比如网页端想查询三班所有学生姓名,那么这个请求传递给Servlet处理时候,就要携带一个“三班”的参数信息,Servlet根据"三班"来返回该班学生姓名。所以,本篇主要内容:

1, 简单演示get方式传参方法(因为get传参本来就比较简单)

2,比较详细演示表单通过post方式传参(表单也可以通过get传参,参见上一篇)


首先说下get传参,为了演示get传参这个事情,我们先得有个Servlet,那就新建一个ParameterPassDemoServlet(猫哥的英文一贯维持在较高水准)。相关代码如下:


<!-- web.xml节选-->

 <servlet>

   <servlet-name>ParameterPassDemoServlet</servlet-name>

   <servlet-class>servlet.ParameterPassDemoServlet</servlet-class>

 </servlet>

 <servlet-mapping>

   <servlet-name>ParameterPassDemoServlet</servlet-name>

   <url-pattern>/ParameterPassDemoServlet</url-pattern>

 </servlet-mapping>

1

2

3

4

5

6

7

8

9

所以我们可以通过访问http://127.0.0.1:8080/ServletDemo/ParameterPassDemoServlet来访问ParameterPassDemoServlet。


好的,通过get方式传参数非常简单,在URL地址后面加上?param1=XXX¶m2=XXX就行了。


比如要查询三班有多少学生,可以这样设计http://127.0.0.1:8080/ServletDemo/ParameterPassDemoServlet?class=3。(注意此处没有写class=三班,是因为使用URL传递参数时一般不要在URL写汉字,另外也不要写班级名称而是写班级在数据库中对应的id,想想为啥,想不通也没关系,以后就慢慢明白了,至于传递中文参数的问题,本篇后面会讲的)。


OK,此时我们这样设计Servlet就可以得到参数class:


package servlet;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class ParameterPassDemoServlet extends HttpServlet {//用于演示参数传递的Servlet类

public ParameterPassDemoServlet() {

 super();

}

public void doGet(HttpServletRequest request, HttpServletResponse response)

  throws ServletException, IOException {//处理get请求

 response.setContentType("text/html");

 PrintWriter out = response.getWriter();

 String inputClass=request.getParameter("class");//获取输入的参数class

 out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");

 out.println("<HTML>");

 out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");

 out.println("  <BODY>");

 out.print("class:"+inputClass);//输出

 out.println("  </BODY>");

 out.println("</HTML>");

 out.flush();

 out.close();

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

测试后网页输出:class:3,显然我们的ParameterPassDemoServlet获取到了浏览器客户端地址里面包含的参数。


之所以能如此简单的就获取到了前台输入的参数,还是因为HttpServletRequest request,这个doGet()方法的参数,它封装了网页请求这个模型,你可以认为request对象里面保存的就是网页请求的信息,而request.getParameter("XXX");的意思就是从网页请求信息里面得到名为XXX的参数的值。


同理,如果在html网页中有<a href="http://127.0.0.1:8080/ServletDemo/ParameterPassDemoServlet?class=3"></a>,同样可以通过点击这个链接实现同样的效果。


因为前一篇说过需要知道第一个/表示127.0.0.1:8080/,所以要先写项目名后写Servlet映射名(/FirstAutoServlet)。


所以其实可以简写为<a href="/ServletDemo/ParameterPassDemoServlet?class=3"></a>。


前面啰嗦了这么多,总算把get传参这个事情说完了,大家也发现了吧,get方式传参泄漏了很多天机啊,你看那class=3,泄露了我们的参数名class,还泄露了一个可能是在数据库里存在的值。所以啊,还是Post传参好,安全性更高,接下来我们演示下POST传参。


第一步,我们得有个网页,用来提交参数,那就叫inputParameter.html吧,代码如下:


<!DOCTYPE html>

<html>

 <head>

   <title>inputParameter.html</title>

 </head>

 <body>

    <form name="mainForm" method="post" action="/ServletDemo/ParameterPassDemoServlet">

    姓名:<input type="text" name="name"></input>

    <br/>

    班级:<select name="class">

     <option value="1">1班</option>

     <option value="2">2班</option>

     <option value="3">3班</option>

    </select>

    <br/>

    性别:<input type="radio" name="sex" value="man" checked="checked"/>男

    <input type="radio" name="sex" value="women"/>女

    <br/>

    特长:<input type="checkbox" name=checkBasketball value="basketball"/>篮球

    <input type="checkbox" name="checkFootball" value="football"/>足球

    <br/>

    <input type="submit"></input>

   </form>

 </body>

</html>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

我们还是穿参数给ParameterPassDemoServlet,然后注意method="post"指明了我们要用post方法传递参数,然后我们在网页上分别放置了一个文本框、一个下拉框、2个单选按钮和2个复选框。分别简单说明下:


文本框:name="name",所以Servlet使用"name"作为参数名来取文本框的输入内容

复选框:name="class"表示复选框名称,注意value属性,选择一班的话,后台取到的值应该是1而不是1班,1班只是显示值。

单选按钮:name="sex",注意两个单选按钮都叫"sex",说明它俩是一伙的,也就是说这俩最多只有一个被选中。由于第一个单选按钮有checked="checked",表示默认选中。取值的话,如果选中第一个单选按钮,取到的值应该是"man",注意男就是个文本,跟单选按钮都没鸟关系,就像注释一样。

复选框,同样,按name取,后台取到的值为对应的value值。

1

2

3

4

好的,我们修改ParameterPassDemoServlet的doPost方法如下:


public void doPost(HttpServletRequest request, HttpServletResponse response)

  throws ServletException, IOException {//处理post请求

 response.setContentType("text/html");//设置输入格式

 PrintWriter out = response.getWriter();//out用于输出

 //获取参数,注意nothing参数是不存在的,看看会发生什么

 String name=request.getParameter("name");

 String myclass=request.getParameter("class");

 String sex=request.getParameter("sex");

 String checkBasketball=request.getParameter("checkBasketball");

 String checkFootball=request.getParameter("checkFootball");

 String nothing=request.getParameter("nothing");

 //输出获取的参数,验证获取是否成功

 out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");

 out.println("<HTML>");

 out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");

 out.println("  <BODY>");

 out.print("name:"+name+"<br/>");

 out.print("myclass:"+myclass+"<br/>");

 out.print("sex:"+sex+"<br/>");

 out.print("checkBasketball:"+checkBasketball+"<br/>");

 out.print("checkFootball:"+checkFootball+"<br/>");

 out.print("nothing:"+nothing+"<br/>");

 out.println("  </BODY>");

 out.println("</HTML>");

 out.flush();

 out.close();

}

image.png

点击提交,页面显示:

image.png

这里面就有几个问题了:


1,获取到的name的值是乱码,说明我们的字符集设置有问题

2,checkFootball的值是null,说明复选框如果不选的话,得到的值为null,注意不是空字符串

3,nothing的值是null,说明如果参数名不存在,得到的值是null

1

2

3

需要注意,如果文本框不输入内容,得到的不是null而是空字符串。而单选按钮和下拉列表因为有默认选中项,倒是不必担心初始值是null还是空字符串的问题。(null和空字符串是不一样的哦,null可以认为就没有初始化,而空字符串是初始化了的一个字符串,空的字符串就像0似的,也是有意义的)。


好了,现在我们了解决下乱码的问题,对于编码猫哥了解也不深,但是猫哥知道,编码无非就以下几处,都改成支持中文的utf-8不就OK了:


1,在网页处设置编码,可以在<head>标签下添加 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

2,在Servlet处,设置request.setCharacterEncoding("utf-8");和response.setCharacterEncoding("utf-8");这样输入、输出都是utf-8编码。

3,在Java语言和数据库交互处的数据库连接字符串设置:String url = "jdbc:mysql://localhost:3306/java?useUnicode=true&characterEncoding=utf-8";//数据库连接字符串

1

2

3

OK,此处我们只用到1、2条,修改后重试,果然OK了。好了,不用大家费心了,源码奉上:


<!DOCTYPE html>

<html>

 <head>

   <title>inputParameter.html</title>

   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

 </head>

 <body>

    <form name="mainForm" method="post" action="/ServletDemo/ParameterPassDemoServlet">

    姓名:<input type="text" name="name"></input>

    <br/>

    班级:<select name="class">

     <option value="1">1班</option>

     <option value="2">2班</option>

     <option value="3">3班</option>

    </select>

    <br/>

    性别:<input type="radio" name="sex" value="man" checked="checked"/>男

    <input type="radio" name="sex" value="women"/>女

    <br/>

    特长:<input type="checkbox" name=checkBasketball value="basketball"/>篮球

    <input type="checkbox" name="checkFootball" value="football"/>足球

    <br/>

    <input type="submit"></input>

   </form>

 </body>

</html>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

public void doPost(HttpServletRequest request, HttpServletResponse response)

  throws ServletException, IOException {//处理post请求

 response.setContentType("text/html");//设置输入格式

 response.setContentType("text/html");

 request.setCharacterEncoding("utf-8");

 response.setCharacterEncoding("utf-8");

 PrintWriter out = response.getWriter();//out用于输出

 //获取参数,注意nothing参数是不存在的,看看会发生什么

 String name=request.getParameter("name");

 String myclass=request.getParameter("class");

 String sex=request.getParameter("sex");

 String checkBasketball=request.getParameter("checkBasketball");

 String checkFootball=request.getParameter("checkFootball");

 String nothing=request.getParameter("nothing");

 //输出获取的参数,验证获取是否成功

 out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");

 out.println("<HTML>");

 out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");

 out.println("  <BODY>");

 out.print("name:"+name+"<br/>");

 out.print("myclass:"+myclass+"<br/>");

 out.print("sex:"+sex+"<br/>");

 out.print("checkBasketball:"+checkBasketball+"<br/>");

 out.print("checkFootball:"+checkFootball+"<br/>");

 out.print("nothing:"+nothing+"<br/>");

 out.println("  </BODY>");

 out.println("</HTML>");

 out.flush();

 out.close();

}

相关文章
|
21天前
|
前端开发 JavaScript Java
java常用数据判空、比较和类型转换
本文介绍了Java开发中常见的数据处理技巧,包括数据判空、数据比较和类型转换。详细讲解了字符串、Integer、对象、List、Map、Set及数组的判空方法,推荐使用工具类如StringUtils、Objects等。同时,讨论了基本数据类型与引用数据类型的比较方法,以及自动类型转换和强制类型转换的规则。最后,提供了数值类型与字符串互相转换的具体示例。
|
25天前
|
开发框架 前端开发 JavaScript
ASP.NET Web Pages - 教程
ASP.NET Web Pages 是一种用于创建动态网页的开发模式,采用HTML、CSS、JavaScript 和服务器脚本。本教程聚焦于Web Pages,介绍如何使用Razor语法结合服务器端代码与前端技术,以及利用WebMatrix工具进行开发。适合初学者入门ASP.NET。
|
28天前
|
JSON Java 程序员
Java|如何用一个统一结构接收成员名称不固定的数据
本文介绍了一种 Java 中如何用一个统一结构接收成员名称不固定的数据的方法。
26 3
|
1月前
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
48 3
|
1月前
|
Java 程序员 容器
Java中的变量和常量:数据的‘小盒子’和‘铁盒子’有啥不一样?
在Java中,变量是一个可以随时改变的数据容器,类似于一个可以反复打开的小盒子。定义变量时需指定数据类型和名称。例如:`int age = 25;` 表示定义一个整数类型的变量 `age`,初始值为25。 常量则是不可改变的数据容器,类似于一个锁死的铁盒子,定义时使用 `final` 关键字。例如:`final int MAX_SPEED = 120;` 表示定义一个名为 `MAX_SPEED` 的常量,值为120,且不能修改。 变量和常量的主要区别在于变量的数据可以随时修改,而常量的数据一旦确定就不能改变。常量主要用于防止意外修改、提高代码可读性和便于维护。
|
1月前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
100 2
|
1月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
33 2
|
4月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
46 3
|
4月前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
45 1
|
4月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
基于Servlet和JSP的Java Web应用开发指南
88 0