猫哥带你去战斗—Java Web开发—Servlet篇[3]—获取网页数据

来源:互联网 发布:淘宝店铺的装修特色 编辑:程序博客网 时间:2024/05/15 06:38

上篇讲了网页可以通过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>

所以我们可以通过访问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();    }}

测试后网页输出: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>

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

文本框:name="name",所以Servlet使用"name"作为参数名来取文本框的输入内容复选框:name="class"表示复选框名称,注意value属性,选择一班的话,后台取到的值应该是1而不是1班,1班只是显示值。单选按钮:name="sex",注意两个单选按钮都叫"sex",说明它俩是一伙的,也就是说这俩最多只有一个被选中。由于第一个单选按钮有checked="checked",表示默认选中。取值的话,如果选中第一个单选按钮,取到的值应该是"man",注意男就是个文本,跟单选按钮都没鸟关系,就像注释一样。复选框,同样,按name取,后台取到的值为对应的value值。

好的,我们修改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();    }

测试下,在网页如下图输入:
这里写图片描述
点击提交,页面显示:
这里写图片描述
这里面就有几个问题了:

1,获取到的name的值是乱码,说明我们的字符集设置有问题2,checkFootball的值是null,说明复选框如果不选的话,得到的值为null,注意不是空字符串3nothing的值是null,说明如果参数名不存在,得到的值是null

需要注意,如果文本框不输入内容,得到的不是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";//数据库连接字符串

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>
    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();    }
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 肛周脓肿手术后大便干怎么办 月经半个月了还没干净怎么办 房东出租违建房不退房租怎么办 上海公租房住满5年后怎么办 监狱对死缓犯人延长转为无期怎么办 手机号码办理的宽带不想要了怎么办 朋友诈骗罪被关看守所了该怎么办 打架被拘留家里有孩子没人看怎么办 刑事拘留满37天给逮捕了怎么办 因打架被拘留十五天释放后会怎么办 犯罪人在拘留所生了小孩怎么办 我申请了进京证更换车辆怎么办 丈夫去世前想把财产留给妻子怎么办 假货中通代收货款发现是假货怎么办 注册志愿者时身份证被使用该怎么办 双眼皮贴贴的皮肤送了怎么办? 满60岁社保末满十五年怎么办 眼角膜少了一块怎么办应该吃什么 左右胸相差一个罩杯左右怎么办 穿一字肩的裙子没有无肩内衣怎么办 农业网柑橘被奄24小时怎么办 钱包被偷了小偷抓到了钱不认怎么办 快高考了很想学却没有动力怎么办? 孩子高三了学习状态不好怎么办 离婚时对方说把钱都花了怎么办 挂科太多学校不给毕业证怎么办 大专挂科太多学校让延期毕业怎么办 安卓手机老是收到垃圾短信怎么办 高铁站行李拉安检仪上应该怎么办 连壁金融立案了投资钱怎么办 联壁金融倒了投资人的钱怎么办 改签的高铁票错过了怎么办 高铁票错过了当天没别的车次怎么办 电脑文件剪切到u盘不见了怎么办 电脑剪切到u盘然后打不开了怎么办 淘宝未满十八岁限制购买物品怎么办 网上飞机订票手机号填写错了怎么办 室外回填土都是砂土压不实怎么办 王牌车新车储气筒漏气查不到怎么办 顺丰快递保价后商品出现问题怎么办 未保价快递丢失没有价值证明怎么办