当前位置:编程学习 > JAVA >>

用POST和GET获取URL后的参数小问题


<form action="servlet/ThirdServlet?userName=1&passWord=2" method="post">  
        姓名<input type="text" name="uesrName"><br>  
        密码<input type="text" name="passWord"><br>  
        <input type="submit" value="提交">  
</form>  



public void doPost(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
        String userName = request.getParameter("userName");  
        String passWord = request.getParameter("passWord");  
        response.getWriter().println("userName --->"+userName);  
        response.getWriter().println("passWord---->"+passWord);  



当form提交方式为get的时候,组件里填写了value的值,action里的url后也带有参数(写死的),这时servlet获取的uesrName和passWord是文本组件里的值

当form提交方式为post的时候,组件里填写了value的值,action里的url后也带有参数(写死的),这时servlet获取的uesrName和passWord是url后参数的值

小弟想问的是,post获取的为何是url后参数的值?post不是获取的是请求体里的值么(即组件里的值)?

求大神!!!! --------------------编程问答-------------------- 第一次看这样写表单
GET提交时貌似action后面的参数会被清除掉加上表单参数
POST没试过,会不会是个数组啊,用getParameterValues取出来看看 --------------------编程问答--------------------
引用 1 楼 xiangyuecn 的回复:
第一次看这样写表单
GET提交时貌似action后面的参数会被清除掉加上表单参数
POST没试过,会不会是个数组啊,用getParameterValues取出来看看


测试了下,其实有两个userName和passWord上传到服务器。

那小弟还想问下,这样是不是不用去关心为何post和get取出来单个值的时候不一样的问题了? --------------------编程问答--------------------
引用 2 楼 guaguawa121 的回复:
Quote: 引用 1 楼 xiangyuecn 的回复:

第一次看这样写表单
GET提交时貌似action后面的参数会被清除掉加上表单参数
POST没试过,会不会是个数组啊,用getParameterValues取出来看看


测试了下,其实有两个userName和passWord上传到服务器。

那小弟还想问下,这样是不是不用去关心为何post和get取出来单个值的时候不一样的问题了?

还发现个问题,如果是get提交原先url后的参数被清除,用文本框的value来代替
但是post却是有两个userName,passWord。(url后的和文本组件都会被上传) --------------------编程问答-------------------- Get请求的参数内容是放在http信息的报文头里面的,而post请求是放在报文体里面的。
1、URL带参数属于Get方式请求,所以当表单中为Get请求的时候表单中的文本中的值会覆盖你原来URL的参数。所以你得到的是文本组件中的值
2、Post请求的值是放在报文体中的,所以不会覆盖掉你原来URL中的参数。
至于后台对于第二种情况,你可以在doGet中获取到URL中的参数值,在doPost中获取到文本组件中的值,你可以试一下。 --------------------编程问答--------------------
引用 4 楼 xukaihua2006 的回复:
Get请求的参数内容是放在http信息的报文头里面的,而post请求是放在报文体里面的。
1、URL带参数属于Get方式请求,所以当表单中为Get请求的时候表单中的文本中的值会覆盖你原来URL的参数。所以你得到的是文本组件中的值
2、Post请求的值是放在报文体中的,所以不会覆盖掉你原来URL中的参数。
至于后台对于第二种情况,你可以在doGet中获取到URL中的参数值,在doPost中获取到文本组件中的值,你可以试一下。

也就是说出现这种情况的原因是get请求时候,组件里的值会覆盖url后的参数,而post既可以获取url后面的参数的值也可以获取组件里的值。  是否可以这么理解? --------------------编程问答-------------------- public void doPost这个方法应该是private类型的吧? --------------------编程问答-------------------- 就是这样的。但是后台获取的方式 要分开,用doGet 与doPost 分别获取

是protect的 --------------------编程问答-------------------- protected --------------------编程问答--------------------
引用 7 楼 xukaihua2006 的回复:
就是这样的。但是后台获取的方式 要分开,用doGet 与doPost 分别获取

是protect的

我还想问下,一般是doPost里执行doGet还是doGet里执行doPost?为啥? --------------------编程问答--------------------
引用 6 楼 fangmingshijie 的回复:
public void doPost这个方法应该是private类型的吧?

大神 那我是不是可以这么理解:在doGet里执行doPost?


public void doGet(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
        doPost(request,response);  


--------------------编程问答-------------------- 是这样的,doGet处理 Get请求表单的,doPost处理 Post请求表单的。你这种写法会误导人的。
实际上是把业务写在了doPost中,这里在doGet中写doPost,是因为doGet与doPost执行了相同的业务逻辑。
并不是在doGet中执行doPost
--------------------编程问答-------------------- 学习下,学习时没注意这些细节。。。。
谢谢大神的讲解 --------------------编程问答--------------------
引用 11 楼 xukaihua2006 的回复:
是这样的,doGet处理 Get请求表单的,doPost处理 Post请求表单的。你这种写法会误导人的。
实际上是把业务写在了doPost中,这里在doGet中写doPost,是因为doGet与doPost执行了相同的业务逻辑。
并不是在doGet中执行doPost

我的意思是如果doGet和doPost两个方法中执行的业务逻辑一样以下两种写法,哪种正确?

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//业务逻辑
System.out.println("123");
}

或者

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//业务逻辑
System.out.println("123");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}


--------------------编程问答-------------------- 两种的效果一摸一样 --------------------编程问答--------------------
引用 14 楼 xukaihua2006 的回复:
两种的效果一摸一样

效果是一样,但楼上有位大神说  
public void doPost这个方法应该是private类型的吧? 
给我的感觉好像是应该

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
    private void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //业务逻辑
        System.out.println("123");
    }


这种有讲究么? --------------------编程问答-------------------- 为什么要这么写,真是想不通。为什么要取名字为doPost,不是误导人吗?既然是private私有方法,就不要取doPost方法。因为在HttpServlet的中也有一个处理Post请求的方法叫doPost,你这样改成private方法会报编译错误的,子类覆盖父类的方法,修饰符的范围不能小于父类中被覆盖的方法。

回答的那么清楚了,把分给我吧 嘿嘿! --------------------编程问答--------------------
引用 4 楼 xukaihua2006 的回复:
Get请求的参数内容是放在http信息的报文头里面的,而post请求是放在报文体里面的。
1、URL带参数属于Get方式请求,所以当表单中为Get请求的时候表单中的文本中的值会覆盖你原来URL的参数。所以你得到的是文本组件中的值
2、Post请求的值是放在报文体中的,所以不会覆盖掉你原来URL中的参数。
至于后台对于第二种情况,你可以在doGet中获取到URL中的参数值,在doPost中获取到文本组件中的值,你可以试一下。

这个还是挺有干货的 --------------------编程问答-------------------- 学习了,写得好!
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,