- 浏览: 1758761 次
- 性别:
- 来自: 大连
博客专栏
-
Spring数据库访问系列...
浏览量:173873
-
Android学习笔记
浏览量:368370
-
iBatis开发详解
浏览量:189473
-
Objective-C学习...
浏览量:100020
最新评论
-
iLidy:
引用[/c
Hibernate持久化对象的生命周期详解 -
fengzigogo:
您好,有这个项目架构的源码下载地址吗?
一种Java Web应用开发框架的构建(基于Struts2+Spring+FreeMarker)之一 -
spring_springmvc:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
用Maven构建Java Web开发环境(Jetty容器)之二 -
springdata_springmvc:
spring mvc demo教程源代码下载,地址:http: ...
Spring 3之MVC & Security简单整合开发(二) -
赵庆辉:
看帖回复是美德,楼主讲的很清晰明了,看了豁然开朗.
Java String对象的经典问题(new String())
Servlet是SUN指定的Java服务器端编程规范,用以处理来自客户端的请求,处理并做出响应的一套基础API。Servlet是运行在Servlet容器中的Java小程序,容器运行在服务器端,服务器侦听特定端口的请求,并解析请求地址,将请求对象送给容器中的Servlet来执行,这个原理非常简单,平时我们多以在浏览器中输入URL地址,提交表单方式来实现,现在我们用Java语言来模拟常用的GET和POST请求,来更底层的看看Servlet,这就是C/S模型了,其实Java Web不拘泥于B/S模型,想做C/S程序也是可以的。
要模拟请求这就用到了Java网络编程中的一些知识,创建一个URL对象,获得URL连接对象,设置请求参数;有了连接还要处理和传递信息,那么还需要I/O方面的知识;GET/POST是HTTP协议中定义的方法,那么我们还应该了解HTTP协议请求报文的相关内容,这里不细说它们,只根据代码实例来看看基本原理。
创建一个Client类,定义两个基本方法。
下面,我们来实现这两个方法,先看看GET,比较简单:
注释都很详细了,只是要说一点,GET方式提交的参数是绑定在URL中的,所以这部分要单独处理,进行转码,参数是Map类型,那么我们遍历这个Map获取参数,并拼装成?,&的格式就行了。
下面来看POST,这个复杂一点:
这中间就是设置POST方式时要开启两个选项,不能忘了。而且POST方式提交参数,参数是在请求体中发送的,就是和GET的区别。模拟好了两个方法,下面我们来写Servlet,这就很简单了,我们使用Servlet 3:
下面就是测试了,用GET方式测试时,参数是英文没有问题,可是出现中文时,也转码了,但没有配置的Tomcat依然读取的是乱码,不要忘了配置Tomcat的server.xml:
加一个URIEncodeing选项就可以了,这样走GET请求编码就正常了,这也是Ajax走GET提交时不设置依然是中文乱码的一个原因,这一般情况想不到。
好了,我们来测试GET请求,写主函数:
在控制台,我们就得到了如下的输出:
因为我们打印了还原出的参数形式,这里没有用中文,所以看不出编码效果,中文效果大家可以自行测试。
POST方式就是修改主函数中调用的方法,这里不再测试了。
至此我们已经可以脱离浏览器进行GET/POST请求了,基本上网络传输的方式我们都可以来看看服务器返回的原始数据了,设置好URL和所需参数,直接运行就行了。
Servlet的原理很简单,这是比较直观的实现,要比直接上来就B\S清楚很多。
下面看个小实例,就是CET查分。对于CET不说什么了,相信大多数人都经历过,而查分网站也是非常…不说了,一个CET批量查分器的实现,就是发送POST请求,看看它网站的源码,Ajax而已。那么我们用上面的POST方法来模拟请求,批量获取数据,要注意大多数网站是防止来自外部的请求的,很简单,设置referer就可以了,这里不贴源码了,大家自己去写,我们来看一下:
文本系探索实践,欢迎交流,希望对使用者有用。
声明:请不要乱拍图片中的内容,仅作说明,别无他用。如果对图片中内容产生了一些想法,那么我们一起好好学习就行了。
StringBuffer是线程安全的,StringBuilder不是。
如果只是用作方法里的局部变量,还需要考虑线程安全?
这个只是解释一下区别,和示例无关。
StringBuffer是线程安全的,StringBuilder不是。
如果只是用作方法里的局部变量,还需要考虑线程安全?
StringBuffer是线程安全的,StringBuilder不是。
嗯,没有过多考虑,和参数处理改成StringBuffer的比较好。
要模拟请求这就用到了Java网络编程中的一些知识,创建一个URL对象,获得URL连接对象,设置请求参数;有了连接还要处理和传递信息,那么还需要I/O方面的知识;GET/POST是HTTP协议中定义的方法,那么我们还应该了解HTTP协议请求报文的相关内容,这里不细说它们,只根据代码实例来看看基本原理。
创建一个Client类,定义两个基本方法。
/** * 用于模拟HTTP请求中GET/POST方式 * * @author Sarin * */ public class Client { /** * 发送GET请求 * * @param url * 目的地址 * @param parameters * 请求参数,Map类型。 * @return 远程响应结果 */ public static String sendGet(String url, Map<String, String> parameters) { } /** * 发送POST请求 * * @param url * 目的地址 * @param parameters * 请求参数,Map类型。 * @return 远程响应结果 */ public static String sendPost(String url, Map<String, String> parameters) { } /** * 主函数,测试请求 * * @param args */ public static void main(String[] args) { } }
下面,我们来实现这两个方法,先看看GET,比较简单:
/** * 发送GET请求 * * @param url * 目的地址 * @param parameters * 请求参数,Map类型。 * @return 远程响应结果 */ public static String sendGet(String url, Map<String, String> parameters) { String result = "";// 返回的结果 BufferedReader in = null;// 读取响应输入流 StringBuffer sb = new StringBuffer();// 存储参数 String params = "";// 编码之后的参数 try { // 编码请求参数 if (parameters.size() == 1) { for (String name : parameters.keySet()) { sb.append(name).append("=").append( java.net.URLEncoder.encode(parameters.get(name), "UTF-8")); } params = sb.toString(); } else { for (String name : parameters.keySet()) { sb.append(name).append("=").append( java.net.URLEncoder.encode(parameters.get(name), "UTF-8")).append("&"); } String temp_params = sb.toString(); params = temp_params.substring(0, temp_params.length() - 1); } String full_url = url + "?" + params; System.out.println(full_url); // 创建URL对象 java.net.URL connURL = new java.net.URL(full_url); // 打开URL连接 java.net.HttpURLConnection httpConn = (java.net.HttpURLConnection) connURL .openConnection(); // 设置通用属性 httpConn.setRequestProperty("Accept", "*/*"); httpConn.setRequestProperty("Connection", "Keep-Alive"); httpConn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)"); // 建立实际的连接 httpConn.connect(); // 响应头部获取 Map<String, List<String>> headers = httpConn.getHeaderFields(); // 遍历所有的响应头字段 for (String key : headers.keySet()) { System.out.println(key + "\t:\t" + headers.get(key)); } // 定义BufferedReader输入流来读取URL的响应,并设置编码方式 in = new BufferedReader(new InputStreamReader(httpConn .getInputStream(), "UTF-8")); String line; // 读取返回的内容 while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { e.printStackTrace(); } finally { try { if (in != null) { in.close(); } } catch (IOException ex) { ex.printStackTrace(); } } return result; }
注释都很详细了,只是要说一点,GET方式提交的参数是绑定在URL中的,所以这部分要单独处理,进行转码,参数是Map类型,那么我们遍历这个Map获取参数,并拼装成?,&的格式就行了。
下面来看POST,这个复杂一点:
/** * 发送POST请求 * * @param url * 目的地址 * @param parameters * 请求参数,Map类型。 * @return 远程响应结果 */ public static String sendPost(String url, Map<String, String> parameters) { String result = "";// 返回的结果 BufferedReader in = null;// 读取响应输入流 PrintWriter out = null; StringBuffer sb = new StringBuffer();// 处理请求参数 String params = "";// 编码之后的参数 try { // 编码请求参数 if (parameters.size() == 1) { for (String name : parameters.keySet()) { sb.append(name).append("=").append( java.net.URLEncoder.encode(parameters.get(name), "UTF-8")); } params = sb.toString(); } else { for (String name : parameters.keySet()) { sb.append(name).append("=").append( java.net.URLEncoder.encode(parameters.get(name), "UTF-8")).append("&"); } String temp_params = sb.toString(); params = temp_params.substring(0, temp_params.length() - 1); } // 创建URL对象 java.net.URL connURL = new java.net.URL(url); // 打开URL连接 java.net.HttpURLConnection httpConn = (java.net.HttpURLConnection) connURL .openConnection(); // 设置通用属性 httpConn.setRequestProperty("Accept", "*/*"); httpConn.setRequestProperty("Connection", "Keep-Alive"); httpConn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)"); // 设置POST方式 httpConn.setDoInput(true); httpConn.setDoOutput(true); // 获取HttpURLConnection对象对应的输出流 out = new PrintWriter(httpConn.getOutputStream()); // 发送请求参数 out.write(params); // flush输出流的缓冲 out.flush(); // 定义BufferedReader输入流来读取URL的响应,设置编码方式 in = new BufferedReader(new InputStreamReader(httpConn .getInputStream(), "UTF-8")); String line; // 读取返回的内容 while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { e.printStackTrace(); } finally { try { if (out != null) { out.close(); } if (in != null) { in.close(); } } catch (IOException ex) { ex.printStackTrace(); } } return result; }
这中间就是设置POST方式时要开启两个选项,不能忘了。而且POST方式提交参数,参数是在请求体中发送的,就是和GET的区别。模拟好了两个方法,下面我们来写Servlet,这就很简单了,我们使用Servlet 3:
package servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(name = "HelloWorld", urlPatterns = { "/HelloWorld" }) public class HelloWorld extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); PrintWriter out = response.getWriter(); response.setContentType("text/html;charset=UTF-8"); String name = request.getParameter("name"); out.println("Hello " + name); out.println("This is the output from doGet method!"); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); PrintWriter out = response.getWriter(); response.setContentType("text/html;charset=UTF-8"); String name = request.getParameter("name"); out.println("Hello " + name); out.println("This is the output from doPost method!"); } }
下面就是测试了,用GET方式测试时,参数是英文没有问题,可是出现中文时,也转码了,但没有配置的Tomcat依然读取的是乱码,不要忘了配置Tomcat的server.xml:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>
加一个URIEncodeing选项就可以了,这样走GET请求编码就正常了,这也是Ajax走GET提交时不设置依然是中文乱码的一个原因,这一般情况想不到。
好了,我们来测试GET请求,写主函数:
/** * 主函数,测试请求 * * @param args */ public static void main(String[] args) { Map<String, String> parameters = new HashMap<String, String>(); parameters.put("name", "sarin"); String result = sendGet("http://localhost:8080/servlets/HelloWorld", parameters); System.out.println(result); }
在控制台,我们就得到了如下的输出:
http://localhost:8080/servlets/HelloWorld?name=sarin null : [HTTP/1.1 200 OK] Date : [Sun, 29 Aug 2010 02:31:26 GMT] Content-Length : [54] Content-Type : [text/html;charset=UTF-8] Server : [Apache-Coyote/1.1] Hello sarinThis is the output from doGet method!
因为我们打印了还原出的参数形式,这里没有用中文,所以看不出编码效果,中文效果大家可以自行测试。
POST方式就是修改主函数中调用的方法,这里不再测试了。
至此我们已经可以脱离浏览器进行GET/POST请求了,基本上网络传输的方式我们都可以来看看服务器返回的原始数据了,设置好URL和所需参数,直接运行就行了。
Servlet的原理很简单,这是比较直观的实现,要比直接上来就B\S清楚很多。
下面看个小实例,就是CET查分。对于CET不说什么了,相信大多数人都经历过,而查分网站也是非常…不说了,一个CET批量查分器的实现,就是发送POST请求,看看它网站的源码,Ajax而已。那么我们用上面的POST方法来模拟请求,批量获取数据,要注意大多数网站是防止来自外部的请求的,很简单,设置referer就可以了,这里不贴源码了,大家自己去写,我们来看一下:
文本系探索实践,欢迎交流,希望对使用者有用。
声明:请不要乱拍图片中的内容,仅作说明,别无他用。如果对图片中内容产生了一些想法,那么我们一起好好学习就行了。
评论
7 楼
sarin
2010-09-05
JE帐号 写道
sarin 写道
90382730 写道
不错学习了。 正在学习java。。。。。。。。。。。。。。。。。。。。。。。。感觉stringBUild也不错
StringBuffer是线程安全的,StringBuilder不是。
如果只是用作方法里的局部变量,还需要考虑线程安全?
这个只是解释一下区别,和示例无关。
6 楼
JE帐号
2010-09-04
sarin 写道
90382730 写道
不错学习了。 正在学习java。。。。。。。。。。。。。。。。。。。。。。。。感觉stringBUild也不错
StringBuffer是线程安全的,StringBuilder不是。
如果只是用作方法里的局部变量,还需要考虑线程安全?
5 楼
sarin
2010-08-31
90382730 写道
不错学习了。 正在学习java。。。。。。。。。。。。。。。。。。。。。。。。感觉stringBUild也不错
StringBuffer是线程安全的,StringBuilder不是。
4 楼
90382730
2010-08-31
不错学习了。 正在学习java。。。。。。。。。。。。。。。。。。。。。。。。感觉stringBUild也不错
3 楼
sarin
2010-08-30
jokiye 写道
result += line;
嗯,没有过多考虑,和参数处理改成StringBuffer的比较好。
2 楼
jokiye
2010-08-30
result += line;
1 楼
tamsiuloong
2010-08-30
测试方便多了啊。支持annotation了
发表评论
-
HTML5/CSS3翻转动画(二)
2011-12-31 11:28 9597上一篇我们制作了两行文字的翻转效果,他们是同步进行的, ... -
HTML5/CSS3翻转动画(一)
2011-12-30 13:43 17687翻转动画效果,就是将页面的元素(文字,图片)加入围绕坐 ... -
HTML5/CSS3清爽后台番外篇-添加锁屏效果
2011-10-29 12:34 10288锁屏效果,也就是将屏幕置于模态,不允许用户触发任何动作 ... -
基于HTML5/CSS3的清爽后台管理页面(二)
2011-10-02 09:11 13068本文接上一篇继续来介绍企业级开发中后台管理页面的制作。 ... -
基于HTML5/CSS3的清爽后台管理页面(一)
2011-10-01 21:36 20634后台管理系统是企业级开发中必不可少的组成部分,一般来说 ... -
HTML5绘制饼图实例(二)
2011-08-15 21:16 11254本文接上一讲继续 ... -
HTML5绘制饼图实例(二)
2011-08-15 20:48 8本文接上一讲继续来说明 我们继续来制作饼图示例 ... -
HTML5绘制饼图实例(一)
2011-08-14 15:28 12281HTML5引入Canvas元素 ... -
我的视频教程《中小企业OA系统》
2011-07-29 22:27 7756经过5个月的制作,和华章合作的《中小企业OA系统》Ja ... -
从一道Neusoft题中想到的Java日志API
2011-03-05 09:45 6961先来看看这一季度 ... -
Apache POI组件操作Excel,制作报表(四)
2011-01-04 22:36 10133上一篇我们介绍了如何制作复杂报表的分析和设计,本篇结合 ... -
Apache POI组件操作Excel,制作报表(三)
2010-12-27 23:26 13284上一篇介绍了POI组件操作Excel时如何对单元格和行 ... -
Apache POI组件操作Excel,制作报表(二)
2010-12-19 16:04 18277本文接上一篇继续探究POI组件的使用。 现在来看 ... -
Apache POI组件操作Excel,制作报表(一)
2010-12-16 22:25 42322Apache的POI组件是Jav ... -
使用JACKSON解析JSON(HttpClient 3处理请求)
2010-11-24 18:50 27490在上一篇中,我们 ... -
使用XStream解析XML(使用HttpClient 4发送请求)
2010-11-07 12:55 9608本文意在简单说明XStream解析XML,配合Http ... -
从一道Neusoft题中想到的IO和Comparator
2010-09-23 10:36 2855Neusoft内部定期举 ... -
Spring支持的Quartz程序调度
2010-09-05 21:45 9698开发时有时会有这样一种需求,定期计算某些数据或者执行某 ... -
使用Fusion Charts制作报表(dom4j生成XML)
2010-07-13 13:03 16846首次看到Fusion Charts是在Bug Free ... -
使用Javabean作为数据源的JasperReport报表(通过WebService/RMI调用数据)
2010-06-18 09:46 7156本文接http://sarin.iteye.com/b ...
相关推荐
在Java Web开发中,我们通常会重写Servlet的`doGet`和`doPost`方法,这两个方法分别对应HTTP的GET和POST请求。例如: ```java @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) ...
"JavaWeb笔记08Servlet中get和post区别" Servlet是Java Web开发中最基本的组件之一,它可以处理HTTP请求并生成响应。...在Servlet中,get和post请求可以通过使用不同的方法来处理,以便更好地满足实际开发中的需求。
// 处理POST请求的逻辑 } } ``` 4. **请求和响应对象** `HttpServletRequest`和`HttpServletResponse`对象分别提供了访问请求信息和构造响应的方法。例如,你可以通过`req.getParameter()`获取请求参数,通过`...
3. 生成随机验证码:使用`java.util.Random`和`java.lang.Math`类生成一组随机数字或字母,组合成验证码字符串。 4. 保存验证码:将生成的验证码保存在会话(Session)中,以便在验证时进行比较。使用`...
在这个"Servlet表单Get和Post方式读取"的主题中,我们将深入探讨如何使用Servlet来接收和处理来自HTML表单的GET和POST请求。 首先,让我们了解GET和POST这两种HTTP方法的基本概念: 1. GET方法:这是HTTP请求中最...
3. **发送请求**:如果是POST请求,需要写入请求体(JSON数据)。对于GET请求,参数通常在URL中。 4. **读取响应**:一旦请求被发送,就可以从连接中获取响应。这通常涉及到设置输入流并读取服务器返回的数据。 5....
在 `dxServlet.java` 文件中,通过继承 `HttpServlet` 类来创建一个自定义的 Servlet,该类提供了默认的行为实现,包括初始化方法 `init()` 和处理 GET 和 POST 请求的方法。 ### HTTP POST 请求与 XML 数据处理 ...
在Servlet中,可以使用HttpServletRequest对象的getParameter()方法读取GET请求的参数,对于POST请求,需要使用getParameterValues()或getInputStream()来获取数据。 总之,Java Servlet技术是Java Web开发的重要...
Java Servlet是一种Java编程语言中的标准接口,用于生成动态web内容。Servlet是服务器端的小程序,它们扩展了服务器的功能,能够处理HTTP请求并返回响应。在本例中,“servlet实例”意味着我们将深入探讨如何创建和...
`GenericServlet`适用于非HTTP协议,而`HttpServlet`专门处理HTTP请求,提供了更方便的方法来处理GET和POST请求。 **总结** Java Servlet Specification Version 2.3是开发基于Java的Web应用程序的关键规范,它定义...
- `service`方法是Servlet的核心,它会根据请求的方法(GET、POST等)调用对应的`doGet`、`doPost`等方法。这个方法是线程安全的,因为它在多线程环境中被设计为并发安全的,但开发者仍需注意其内部逻辑的线程安全...
对于POST请求,可以传递数据。 - **监听状态变化**:通过onreadystatechange事件监听请求状态。当状态变为4(表示请求已完成)且状态码为200(表示成功)时,可以读取服务器返回的数据。 - **处理响应**:使用...
本文主要讲解如何使用java实现重定向发送post请求操作。 二、为什么需要post请求? 在某些情况下,我们需要使用post请求来提交数据,例如security登录系统中,需要使用post请求来传递用户名和密码。那么如何使用...
- `doGet()`和`doPost()`方法处理HTTP GET和POST请求,分别对应HTTP协议的两种主要请求方式。 - 使用`HttpServletRequest`和`HttpServletResponse`对象来获取请求参数和设置响应内容。 5. **会话管理**: - ...
3.2 doGet()与doPost():Servlet通过重写doGet()和doPost()方法来处理GET和POST请求,这两个方法是HTTP请求方法的抽象。 四、Web应用部署 4.1 web.xml:Web应用的部署描述符,用于配置Servlet、过滤器、监听器等,...
常见的请求方法有GET和POST,用于获取或提交数据。HTTP响应同样由三部分构成:状态行(包含HTTP协议版本、状态码和状态消息)、响应头和响应正文。状态码如200表示成功,404表示未找到资源。 **MIME类型** MIME...
在Java Web应用中,Servlet扮演着处理客户端请求和生成响应的角色。Servlet生命周期包括初始化、服务、销毁三个主要阶段,开发者可以通过重写相关方法来定制其行为。 1. **Servlet配置** 在`web.xml`部署描述符...
3. 随机数生成:使用Java的Random类生成随机字符串。 4. 图像处理:利用Java的Graphics2D类绘制验证码。 5. Session管理:使用HttpSession对象在服务器端保存和读取状态。 6. 验证码安全策略:添加扭曲效果,提高...
3. GET请求可以被浏览器缓存,POST请求不会。 4. GET请求可以被收藏为书签,POST请求不能。 5. GET请求的安全性较低,因为数据是可见的,而POST请求相对更安全。 理解Servlet生命周期是掌握Java Servlet的关键。...