- 浏览: 1250173 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (608)
- 数据结构 (2)
- AJAX (3)
- 设计模式 (3)
- java (117)
- js (14)
- css (9)
- jsp (10)
- 杂文 (49)
- htmlparser (6)
- 数据库 (29)
- 算法 (14)
- 数据挖掘 (11)
- 电脑杂症 (12)
- 网络爬虫 (7)
- 应用服务器 (9)
- PHP (2)
- C# (14)
- 测试 (3)
- WEB高性能开发 (3)
- swt (1)
- 搜索引擎 (16)
- HttpClient (4)
- Lite (1)
- EXT (1)
- python (1)
- lucene (4)
- sphinx (9)
- Xapian (0)
- linux (44)
- 问题归类 (1)
- Android (6)
- ubuntu (7)
- SEO (18)
- 数学 (0)
- 农业资讯 (12)
- 游戏 (3)
- nginx (1)
- TeamViewer (1)
- swing (1)
- Web前 端 (1)
- 主页 (0)
- 阿萨德发首发身份 (0)
- 软件设计师 (0)
- hibernate (5)
- spring3.0 (5)
- elastic (1)
- SSH (3)
- ff (0)
- oracle 10g (9)
- 神经网络 (1)
- struts2.0 (2)
- maven (1)
- nexus (1)
- 辅助工具 (3)
- Shiro (1)
- 联通项目 (0)
- 2014年专业选择 (0)
- freemarker (1)
- struts1.2 (8)
- adfasdfasfasf (0)
- TortoiseSVN (1)
- jstl (1)
- jquery (1)
- eclipse plugin (0)
- 游戏外挂 (1)
- 推广 (0)
- 按键精灵 (1)
- ibatis3.0 (1)
最新评论
-
水野哲也:
不不不, 这个您真错了!其实是你引用的那个jsp和本身的jsp ...
解析关于jsp页面指令冲突问题contentType="text/html;charset=UTF-8" -
caobo_cb:
import xx.cn.weibo.Util;
[ java版]新浪微博之ruquest_token篇 -
caobo_cb:
你好 Util包没有
[ java版]新浪微博之ruquest_token篇 -
小桔子:
你好!我遇到个问题 max_allowed_packet值总是 ...
mysql查询占用内存,优化的技巧 -
donghustone:
谢谢大神!
用JSmooth制作java jar文件的可执行exe文件教程(图文)
有时候,在抓取网站的时候,网站的编码方式可能不统一,这样的情况,可能有些网页编码不成功,而htmlparser报了错,不能正常的读取。抛出来的异常为:org.htmlparser.util.EncodingChangeException: character mismatch (new: 中 [0x4e2d] != old: [0xd6?]) for encoding change from ISO-8859-1 to GB2312 at character offset 23
为了解决不管它是用何种编码方式,都能够正常读取数据。我在htmlparser的Page类中加了一个字段,之所以要在Page类中加,那是因为它历遍所有的标签过程中,把meta标签属性content捕获到了,并已经传值到setEncoding(String charset)办法中。
代码如下:
// Decompiled by Jad v1.5.8f. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://www.kpdus.com/jad.html // Decompiler options: packimports(3) // Source File Name: Page.java package org.htmlparser.lexer; import java.io.*; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.*; import java.util.zip.*; import org.htmlparser.http.ConnectionManager; import org.htmlparser.util.ParserException; // Referenced classes of package org.htmlparser.lexer: // InputStreamSource, PageIndex, StringSource, Cursor, // Stream, Source public class Page implements Serializable { public Page() { this(""); } public Page(URLConnection connection) throws ParserException { if(null == connection) { throw new IllegalArgumentException("connection cannot be null"); } else { setConnection(connection); mBaseUrl = null; return; } } public Page(InputStream stream, String charset) throws UnsupportedEncodingException { if(null == stream) throw new IllegalArgumentException("stream cannot be null"); if(null == charset) charset = "ISO-8859-1"; mSource = new InputStreamSource(stream, charset); mIndex = new PageIndex(this); mConnection = null; mUrl = null; mBaseUrl = null; } public Page(String text, String charset) { if(null == text) throw new IllegalArgumentException("text cannot be null"); if(null == charset) charset = "ISO-8859-1"; mSource = new StringSource(text, charset); mIndex = new PageIndex(this); mConnection = null; mUrl = null; mBaseUrl = null; } public Page(String text) { this(text, null); } public Page(Source source) { if(null == source) { throw new IllegalArgumentException("source cannot be null"); } else { mSource = source; mIndex = new PageIndex(this); mConnection = null; mUrl = null; mBaseUrl = null; return; } } public static ConnectionManager getConnectionManager() { return mConnectionManager; } public static void setConnectionManager(ConnectionManager manager) { mConnectionManager = manager; } public String getCharset(String content) { String CHARSET_STRING = "charset"; String ret; if(null == mSource) ret = "ISO-8859-1"; else ret = mSource.getEncoding(); if(null != content) { int index = content.indexOf("charset"); if(index != -1) { content = content.substring(index + "charset".length()).trim(); if(content.startsWith("=")) { content = content.substring(1).trim(); index = content.indexOf(";"); if(index != -1) content = content.substring(0, index); if(content.startsWith("\"") && content.endsWith("\"") && 1 < content.length()) content = content.substring(1, content.length() - 1); if(content.startsWith("'") && content.endsWith("'") && 1 < content.length()) content = content.substring(1, content.length() - 1); ret = findCharset(content, ret); } } } return ret; } public static String findCharset(String name, String fallback) { String ret; try { Class cls = Class.forName("java.nio.charset.Charset"); Method method = cls.getMethod("forName", new Class[] { java.lang.String.class }); Object object = method.invoke(null, new Object[] { name }); method = cls.getMethod("name", new Class[0]); object = method.invoke(object, new Object[0]); ret = (String)object; } catch(ClassNotFoundException cnfe) { ret = name; } catch(NoSuchMethodException nsme) { ret = name; } catch(IllegalAccessException ia) { ret = name; } catch(InvocationTargetException ita) { ret = fallback; System.out.println("unable to determine cannonical charset name for " + name + " - using " + fallback); } return ret; } private void writeObject(ObjectOutputStream out) throws IOException { if(null != getConnection()) { out.writeBoolean(true); out.writeInt(mSource.offset()); String href = getUrl(); out.writeObject(href); setUrl(getConnection().getURL().toExternalForm()); Source source = getSource(); mSource = null; PageIndex index = mIndex; mIndex = null; out.defaultWriteObject(); mSource = source; mIndex = index; } else { out.writeBoolean(false); String href = getUrl(); out.writeObject(href); setUrl(null); out.defaultWriteObject(); setUrl(href); } } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { boolean fromurl = in.readBoolean(); if(fromurl) { int offset = in.readInt(); String href = (String)in.readObject(); in.defaultReadObject(); if(null != getUrl()) { URL url = new URL(getUrl()); try { setConnection(url.openConnection()); } catch(ParserException pe) { throw new IOException(pe.getMessage()); } } Cursor cursor = new Cursor(this, 0); for(int i = 0; i < offset; i++) try { getCharacter(cursor); } catch(ParserException pe) { throw new IOException(pe.getMessage()); } setUrl(href); } else { String href = (String)in.readObject(); in.defaultReadObject(); setUrl(href); } } public void reset() { getSource().reset(); mIndex = new PageIndex(this); } public void close() throws IOException { if(null != getSource()) getSource().destroy(); } protected void finalize() throws Throwable { close(); } public URLConnection getConnection() { return mConnection; } public void setConnection(URLConnection connection) throws ParserException { mConnection = connection; mConnection.setConnectTimeout(6000); mConnection.setReadTimeout(6000); try { getConnection().connect(); } catch(UnknownHostException uhe) { throw new ParserException("Connect to " + mConnection.getURL().toExternalForm() + " failed.", uhe); } catch(IOException ioe) { throw new ParserException("Exception connecting to " + mConnection.getURL().toExternalForm() + " (" + ioe.getMessage() + ").", ioe); } String type = getContentType(); String charset = getCharset(type); try { String contentEncoding = connection.getContentEncoding(); System.out.println("contentEncoding="+contentEncoding); Stream stream; if(null != contentEncoding && -1 != contentEncoding.indexOf("gzip")) stream = new Stream(new GZIPInputStream(getConnection().getInputStream())); else if(null != contentEncoding && -1 != contentEncoding.indexOf("deflate")) stream = new Stream(new InflaterInputStream(getConnection().getInputStream(), new Inflater(true))); else{ stream = new Stream(getConnection().getInputStream()); } try { /* * 时间:2008年12月23日 * 原因:当String charset = getCharset(type);返回来的是ISO-8859-1的时候,需要处理一下 */ if(charset.indexOf("ISO-8859-1")!=-1){ charset = getQICHAODEFAULT_CHARSET(); } mSource = new InputStreamSource(stream, charset); } catch(UnsupportedEncodingException uee) { charset = "ISO-8859-1"; mSource = new InputStreamSource(stream, charset); } } catch(IOException ioe) { throw new ParserException("Exception getting input stream from " + mConnection.getURL().toExternalForm() + " (" + ioe.getMessage() + ").", ioe); } mUrl = connection.getURL().toExternalForm(); mIndex = new PageIndex(this); } public String getUrl() { return mUrl; } public void setUrl(String url) { mUrl = url; } public String getBaseUrl() { return mBaseUrl; } public void setBaseUrl(String url) { mBaseUrl = url; } public Source getSource() { return mSource; } public String getContentType() { String ret = "text/html"; URLConnection connection = getConnection(); if(null != connection) { String content = connection.getHeaderField("Content-Type"); if(null != content) ret = content; } return ret; } public char getCharacter(Cursor cursor) throws ParserException { int i = cursor.getPosition(); int offset = mSource.offset(); char ret; if(offset == i) try { i = mSource.read(); if(-1 == i) { ret = '\uFFFF'; } else { ret = (char)i; cursor.advance(); } } catch(IOException ioe) { throw new ParserException("problem reading a character at position " + cursor.getPosition(), ioe); } else if(offset > i) { try { ret = mSource.getCharacter(i); } catch(IOException ioe) { throw new ParserException("can't read a character at position " + i, ioe); } cursor.advance(); } else { throw new ParserException("attempt to read future characters from source " + i + " > " + mSource.offset()); } if('\r' == ret) { ret = '\n'; if(mSource.offset() == cursor.getPosition()) try { i = mSource.read(); if(-1 != i) if('\n' == (char)i) cursor.advance(); else try { mSource.unread(); } catch(IOException ioe) { throw new ParserException("can't unread a character at position " + cursor.getPosition(), ioe); } } catch(IOException ioe) { throw new ParserException("problem reading a character at position " + cursor.getPosition(), ioe); } else try { if('\n' == mSource.getCharacter(cursor.getPosition())) cursor.advance(); } catch(IOException ioe) { throw new ParserException("can't read a character at position " + cursor.getPosition(), ioe); } } if('\n' == ret) mIndex.add(cursor); return ret; } public void ungetCharacter(Cursor cursor) throws ParserException { cursor.retreat(); int i = cursor.getPosition(); try { char ch = mSource.getCharacter(i); if('\n' == ch && 0 != i) { ch = mSource.getCharacter(i - 1); if('\r' == ch) cursor.retreat(); } } catch(IOException ioe) { throw new ParserException("can't read a character at position " + cursor.getPosition(), ioe); } } public String getEncoding() { return getSource().getEncoding(); } public void setEncoding(String character_set) throws ParserException { this.QICHAODEFAULT_CHARSET = character_set; getSource().setEncoding(character_set); } public URL constructUrl(String link, String base) throws MalformedURLException { return constructUrl(link, base, false); } public URL constructUrl(String link, String base, boolean strict) throws MalformedURLException { int index; URL url; if(!strict && '?' == link.charAt(0)) { if(-1 != (index = base.lastIndexOf('?'))) base = base.substring(0, index); url = new URL(base + link); } else { url = new URL(new URL(base), link); } String path = url.getFile(); boolean modified = false; boolean absolute = link.startsWith("/"); if(!absolute) do { if(!path.startsWith("/.")) break; if(path.startsWith("/../")) { path = path.substring(3); modified = true; continue; } if(!path.startsWith("/./") && !path.startsWith("/.")) break; path = path.substring(2); modified = true; } while(true); while(-1 != (index = path.indexOf("/\\"))) { path = path.substring(0, index + 1) + path.substring(index + 2); modified = true; } if(modified) url = new URL(url, path); return url; } public String getAbsoluteURL(String link) { return getAbsoluteURL(link, false); } public String getAbsoluteURL(String link, boolean strict) { String ret; if(null == link || "".equals(link)) ret = ""; else try { String base = getBaseUrl(); if(null == base) base = getUrl(); if(null == base) { ret = link; } else { URL url = constructUrl(link, base, strict); ret = url.toExternalForm(); } } catch(MalformedURLException murle) { ret = link; } return ret; } public int row(Cursor cursor) { return mIndex.row(cursor); } public int row(int position) { return mIndex.row(position); } public int column(Cursor cursor) { return mIndex.column(cursor); } public int column(int position) { return mIndex.column(position); } public String getText(int start, int end) throws IllegalArgumentException { String ret; try { ret = mSource.getString(start, end - start); } catch(IOException ioe) { throw new IllegalArgumentException("can't get the " + (end - start) + "characters at position " + start + " - " + ioe.getMessage()); } return ret; } public void getText(StringBuffer buffer, int start, int end) throws IllegalArgumentException { if(mSource.offset() < start || mSource.offset() < end) throw new IllegalArgumentException("attempt to extract future characters from source" + start + "|" + end + " > " + mSource.offset()); int length; if(end < start) { length = end; end = start; start = length; } length = end - start; try { mSource.getCharacters(buffer, start, length); } catch(IOException ioe) { throw new IllegalArgumentException("can't get the " + (end - start) + "characters at position " + start + " - " + ioe.getMessage()); } } public String getText() { return getText(0, mSource.offset()); } public void getText(StringBuffer buffer) { getText(buffer, 0, mSource.offset()); } public void getText(char array[], int offset, int start, int end) throws IllegalArgumentException { if(mSource.offset() < start || mSource.offset() < end) throw new IllegalArgumentException("attempt to extract future characters from source"); int length; if(end < start) { length = end; end = start; start = length; } length = end - start; try { mSource.getCharacters(array, offset, start, end); } catch(IOException ioe) { throw new IllegalArgumentException("can't get the " + (end - start) + "characters at position " + start + " - " + ioe.getMessage()); } } public String getLine(Cursor cursor) { int line = row(cursor); int size = mIndex.size(); int start; int end; if(line < size) { start = mIndex.elementAt(line); if(++line <= size) end = mIndex.elementAt(line); else end = mSource.offset(); } else { start = mIndex.elementAt(line - 1); end = mSource.offset(); } return getText(start, end); } public String getLine(int position) { return getLine(new Cursor(this, position)); } public String toString() { String ret; if(mSource.offset() > 0) { StringBuffer buffer = new StringBuffer(43); int start = mSource.offset() - 40; if(0 > start) start = 0; else buffer.append("..."); getText(buffer, start, mSource.offset()); ret = buffer.toString(); } else { ret = super.toString(); } return ret; } public static final String DEFAULT_CHARSET = "ISO-8859-1"; public static String QICHAODEFAULT_CHARSET = "gb2312"; public static final String DEFAULT_CONTENT_TYPE = "text/html"; public static final char EOF = 65535; protected String mUrl; protected String mBaseUrl; protected Source mSource; protected PageIndex mIndex; protected transient URLConnection mConnection; protected static ConnectionManager mConnectionManager = new ConnectionManager(); public static String getQICHAODEFAULT_CHARSET() { return QICHAODEFAULT_CHARSET; } }
在调用的时候,代码如下:
Parser parser = new Parser(url); parser.setEncoding(parser.getLexer().getPage().getQICHAODEFAULT_CHARSET());
一般情况下,设置成这样应该是没问题的啦,但是,你有时候看到的编码方式并不一定是它该网页的编码方式。比如说,肉眼看到页面中有<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />,htmlparser可以正常的获取到,代码如下:
public void doSemanticAction() throws ParserException { String httpEquiv = getHttpEquiv(); if("Content-Type".equalsIgnoreCase(httpEquiv)) { String charset = getPage().getCharset(getAttribute("CONTENT")); getPage().setEncoding(charset); } }
但是,你不要认为这个就是它的编码方式啦,在htmlparser,还进行了一次判断,在类Page中,有个方法是获取报头字段Content-Type的。代码如下:
public String getContentType() { String ret = "text/html"; URLConnection connection = getConnection(); if(null != connection) { String content = connection.getHeaderField("Content-Type"); if(null != content) ret = content; } return ret; }
两个进行比较,如果不一样的话,它就报了
org.htmlparser.util.EncodingChangeException: character mismatch (new: 中 [0x4e2d] != old: [0xd6?]) for encoding change from ISO-8859-1 to GB2312 at character offset 23
,所以,我在类InputStreamSource再一次进行修改:
代码如下:
public void setEncoding(String character_set) throws ParserException { String encoding = getEncoding(); /** * time:2008年12月23日 */ if(encoding!=null){ character_set = encoding; } if(!encoding.equalsIgnoreCase(character_set)) { InputStream stream = getStream(); try { char buffer[] = mBuffer; int offset = mOffset; stream.reset(); try { mEncoding = character_set; mReader = new InputStreamReader(stream, character_set); mBuffer = new char[mBuffer.length]; mLevel = 0; mOffset = 0; mMark = -1; if(0 != offset) { char new_chars[] = new char[offset]; if(offset != read(new_chars)) throw new ParserException("reset stream failed"); for(int i = 0; i < offset; i++) if(new_chars[i] != buffer[i]) throw new EncodingChangeException("character mismatch (new: " + new_chars[i] + " [0x" + Integer.toString(new_chars[i], 16) + "] != old: " + " [0x" + Integer.toString(buffer[i], 16) + buffer[i] + "]) for encoding change from " + encoding + " to " + character_set + " at character offset " + i); } } catch(IOException ioe) { throw new ParserException(ioe.getMessage(), ioe); } } catch(IOException ioe) { throw new ParserException("Stream reset failed (" + ioe.getMessage() + "), try wrapping it with a org.htmlparser.lexer.Stream", ioe); } } }
这样应该来说,不管什么方式都OK的。
评论
10 楼
qachenzude
2011-12-11
在catch里面捕获到它的异常,然后进行修改,比如parser.setEncoding("gb2312")。这样就行了
这个方法最好的~~
这个方法最好的~~
9 楼
xredman
2010-08-27
哦,太好了,我烦人的问他你总算解决了
8 楼
wokong
2010-05-20
最好的方法。。。本人在采用 与楼主说的最后1条意思一致 通用无论什么编码都不怕
1.采用httpclient解析网页并返回html
2.直接调用 paser.setInputHTML(httpclient返回的html);
什么网页 什么编码都通用了。。。
1.采用httpclient解析网页并返回html
2.直接调用 paser.setInputHTML(httpclient返回的html);
什么网页 什么编码都通用了。。。
7 楼
lzj0470
2010-05-04
p_x1984 写道
你好!我现在想在爬取的时候:比如说A网站的编码是:gb2312,B网站是iso-8859-1,C网站是:gbk,我能否修改它的源码,到时候抓取的都是统一的编码,这样入库也是统一的编码格式啊。我的QQ是:282215036,可以讨论下。万分感谢了!
想要做到编码统一,个人建议不要用htmlparser作为连接网络的部分。你把连接网络部分独立出来。htmlparser的优点就是对网页的解析。
6 楼
lzj0470
2010-05-04
gbfd2012 写道
你修改的InputStreamSource貌似和源代码没有什么修改。
你用的是什么版本
5 楼
gbfd2012
2010-05-04
你修改的InputStreamSource貌似和源代码没有什么修改。
4 楼
p_x1984
2009-04-15
你好!我现在想在爬取的时候:比如说A网站的编码是:gb2312,B网站是iso-8859-1,C网站是:gbk,我能否修改它的源码,到时候抓取的都是统一的编码,这样入库也是统一的编码格式啊。我的QQ是:282215036,可以讨论下。万分感谢了!
3 楼
lzj0470
2009-01-13
你不修改源码也行,你在catch里面捕获到它的异常,然后进行修改,比如parser.setEncoding("gb2312")。这样就行了
2 楼
ganting
2009-01-12
急。。。。望大虾解决!!
1 楼
ganting
2009-01-12
楼主太厉害了,请问:能不能不改源代码而解决上面的问题呢?
发表评论
-
htmlparser获取A标签内容,既然是空
2011-09-22 15:39 1843形式是: <a href="#" c ... -
org.htmlparser.util.ParserException: Error in open
2009-06-11 11:03 3606使用HTMLparser时碰到一个错误 org.htmlpa ... -
htmlparser如何连接网络
2008-12-18 16:26 1567今天,有个人问我,前几天已经可以抓取,今天不知道为什么就不可以 ... -
htmlparser 假死问题
2008-12-18 10:10 2087前几天,在用htmlparser分析页面时,遇到一个郁闷的问题 ... -
htmlparser 文件不存在
2008-12-12 16:11 1046今天用htmlparser分析了一些网页,在过程中,有一个网页 ...
相关推荐
一个彻底重写的htmlparser包,里面有源码,重写了两个类,彻底解决爬取网页时出现编码异常的问题!直接引用用里面的包就可以使用!
彻底 HtmlParser 重写的两个类文件,直接放在目录下面或者大宝到jar里面可以用
HtmlParser 网页内容提取库HtmlParser的源码项目 nekohtml-1.9.7 nekohtml的源码项目 RhinoTest 测试js解析 ExtractContext 内容抽取示例 SearchChinesePdf 包含对PDF文件的处理 parse-rtf 包含对RTF文件的处理 ...
注意:html代码必须是utf-8编码字符,如果不是请转成utf-8如果有乱码的问题参考: ://www.fwolf.com/blog/post/314现在支持composer “ require”:{“ bupt1987 / html-parser”:“ dev-master”}加载作曲家需要'...
字符串和编码 使用list和tuple 条件判断和循环 使用dict和set 函数 调用函数 定义函数 函数的参数 递归函数 高级特性 切片 迭代 列表生成式 生成器 函数式编程 高阶函数 匿名函数 装饰器 偏函数 模块 使用模块 安装...
技术点:1、使用htmlparser解析html文件,得到html代码里的js、css、img链接 2、将相对路径的链接转变成绝对路径,并读取资源 3、将css和js合并到html 4、将图片转换成base64编码,写入标签的src
4 commons-codec-1.4.jar 编码处理包,例如BASE64 5 commons-collections-3.2.1.jar 集合包,Velocity依赖 6 commons-dbutils-1.3.jar JDBC操作封装 7 commons-digester-2.0.jar XML解析,Velocity依赖 8 ...
刚学完ssh2,然后看懂了htmlparser,和lucene.分词器用的是ik,好不容易找到的,对中文支持得很好.有点只认框架的味道,所以运行起来比较慢,但这也是一种必要的偿试. sql语句都在.记住,tomcat sever.xml里字符编码为utf-8...
字符串和编码 使用list和tuple 条件判断 循环 使用dict和set 函数 调用函数 定义函数 函数的参数 递归函数 高级特性 切片 迭代 列表生成式 生成器 迭代器 函数式编程 高阶函数 map/reduce filter sorted 返回函数 ...
字符串和编码 37 使用 list 和 tuple 46 条件判断 53 循环 58 使用 dict 和 set 63 函数 70 调用函数 72 定义函数 75 函数的参数 80 递归函数 93 高级特性 97 切片 98 迭代 102 列表生成式 105 生成器...
3.2 字符串和编码 25 3.3 使用list和tuple 34 3.4 条件判断 39 3.5 循环 43 3.6 使用dict和set 45 4 函数 50 4.1 调用函数 52 4.2 定义函数 54 4.3 函数的参数 58 4.4 递归函数 70 5 高级特性 73 5.1 切片 73 5.2 ...
* 解决中文乱码问题 * @param httpUrl * @return */ public static String downloadPage(String httpUrl) { StringBuffer pageBuffer = new StringBuffer(); URL pageUrl = null; try { pageUrl =...
htmlparser.jar 强大的html解析器 jcommon-1.0.15.jar 使用java生成图表的工具 freemarker-2.3.8.jar 模板相关操作需要包 struts2-core-2.0.14.jar struts2核心包 struts2-spring-plugin-2.0.14.jar...
htmlparser.jar 强大的html解析器 jcommon-1.0.15.jar 使用java生成图表的工具 freemarker-2.3.8.jar 模板相关操作需要包 struts2-core-2.0.14.jar struts2核心包 struts2-spring-plugin-2.0.14.jar struts...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...