??xml version="1.0" encoding="utf-8" standalone="yes"?>
3、 DateFormat:抽象cjava.util.CalendarQ它z的一个子cMؓ(f)java.util.GregorianCalendar
Q注Q如果有朋友对具体类和抽象类不了解,可以参考相关Java资料Q?br />
现在对以上三个类q行如下分析Q?br />
一、对Datecȝ分析
Date cMJDK 1.0开始进化, 当时它只包含了几个简单的处理日期数据的方法。 由于这些方法实用性差Q现在基本上被CalendarcM各方法所代替了。这U改q目的是Z更好的处理日期数据国际化格式。 Date cd际上只是一个包裹类, 它包含一个长整型数据, 表示的是从GMT(格林治标准旉)1970q? 1 月??0:00:00q一M前或者是之后l历的毫U数.
Z加深对Datecȝ理解Q列丑֦下一个简单例子来说明Date的用:(x)
import java.util.Date;
public class DateTest1 {
public static void main(String[] args) {
/** Get the system Date **/
Date date = new Date();
System.out.println(date.getTime());
}
}
pȝ输出如下l果Q?br />1001803809710
在这个例子中,值得我们注意的是我们使用了Date 构造函数创Z个日期对? 在没有Q何参数的情况下,q个构造函C(x)自动调用System.currentTimeMillis() Ҏ(gu)来获取当前系l日?。?br />
二、对DateFormatcȝ分析
如果我们希望定制日期数据的格? 比如昄的日期格式ؓ(f)Q?006q?6?3日,抽象cjava.util.Calendar和它的子cjava.util.GregorianCalendar能完成这一功能。?br />下面的例子展CZ如何完成q个工作:
import java.util.SimpleDateFormat;
import java.util.Date;
public class DateTest2 {
public static void main(String[] args) {
SimpleDateFormat format = new SimpleDateFormat("yyyyqMM月dd?,Locale.US);
Date date = new Date();
System.out.println(bartDateFormat.format(date));
}
}
只要通过向SimpleDateFormat 的构造函C递格式字W串" yyyyqMM月dd?, 我们可以指明自己想要的格式. 其中yyyy是年QMM是月, dd是日. 字符的个数决定了日期是如何格式化的,如果格式?yyyyqMM月dd?׃(x)昄 06q?6?3日;如果?yy-MM-dd"显C?6-06-23。?br />
三、对Calendar cȝ分析
如果惌|、获取、操U一个日期对象的各个特定部分Q比如获得小? ? 分钟、计一个月的某一天说星期几等{。这L(fng)情况需要抽象类java.util.Calendar和它的子cL处理。ؓ(f)了能清楚地说明问题,列D下面的例? 它的功能是计第十个星期五是13?
import java.util.GregorianCalendar;
import java.util.Date;
import java.text.DateFormat;
public class CalendarTest{
public static void main(String[] args) {
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL);
GregorianCalendar cal = new GregorianCalendar();
/** Set the date and time of our calendar to the system&s date and time **/
cal.setTime(new Date());
System.out.println("System Date: " + dateFormat.format(cal.getTime()));
/** Set the day of week to FRIDAY **/
cal.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.FRIDAY);
System.out.println("After Setting Day of Week to Friday: " +
dateFormat.format(cal.getTime()));
int friday13Counter = 0;
while (friday13Counter <= 10) {
/** Go to the next Friday by adding 7 days. **/
cal.add(GregorianCalendar.DAY_OF_MONTH, 7);
/** If the day of month is 13 we have another Friday the 13th. **/
if (cal.get(GregorianCalendar.DAY_OF_MONTH) == 13) {
friday13Counter++;
System.out.println(dateFormat.format(cal.getTime()));
}
}
}
}
输出l果?
System Date: Saturday, September 29, 2005
四、ȝ
在Java通过一下三个类的用,一般可以满_UŞ式的日期使用。实际上QJava中日期用的Ҏ(gu)q有很多Q如果有兴趣的朋友请参考JDK帮助手册。?br />http://www.javaresearch.org/article/55424.htm
]]>
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM user WHERE username='aa'");
stmt.executeUpdate("UPDATE user SET lastdatetime=now() where username='aa'");
q是一个用L(fng)录时Q经常用到的代码Q先是根据用户名aa查找该用L(fng)详细信息Q然后再更新该用L(fng)最后登录时_(d)lastdatetimeQ。这q个里面Q我们用了两个sql语句Q这个是我一直用的方法,但是如果用JDBC2.0l我们提供的便利Q我们只要写一条sql够了,其他的都交给jdbcQ看下面的代码:(x)
Statement stmt2 = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs2 = stmt.executeQuery("SELECT * FROM user WHERE username='aa'");
rs2.next();
rs2.updateDate("lastdatetime", new Date(Calendar.getInstance().getTimeInMillis()));
rs2.updateRow();
q里面最主要的特征就是ResultSet.TYPE_FORWARD_ONLY和ResultSet.CONCUR_UPDATABLEQ通过初始化Statement时传不同的参敎ͼ可以对ResultSetq行不用的错作限制。con.createStatement的时候,有三U可以掉用的函数Q?
1、createStatement();
2、createStatement(int resultSetType, int resultSetConcurrency)
3、createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)
其中resultSetType可选值是Q?
1、ResultSet.TYPE_FORWARD_ONLY 在ResultSet中只能先前移动游标,
2、ResultSet.TYPE_SCROLL_INSENSITIVE 在ResultSet中可以随心所Ʋ的先前向后Ud游标Q?
3、ResultSet.TYPE_SCROLL_SENSITIVE 在ResultSet中可以随心所Ʋ的先前向后Ud游标Q同时ResultSet的值有所改变的时候,他可以得到改变后的最新的?
其中resultSetConcurrency可选值是Q?
1、ResultSet.CONCUR_READ_ONLY 在ResultSet中的数据记录是只ȝQ可以修?
2、ResultSet.CONCUR_UPDATABLE 在ResultSet中的数据记录可以L修改Q然后更C(x)数据?
其中resultSetHoldability可选值是Q?
1、ResultSet.HOLD_CURSORS_OVER_COMMIT 表示修改提交?不关闭ResultSet的游?
2、ResultSet.CLOSE_CURSORS_AT_COMMIT 表示修改提交?关闭ResultSet的游标?
对于查询操作W一U初始化Ҏ(gu)createStatement()Q相当于W二U方法的createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)Q第三种Ҏ(gu)的createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT)
下面写一Ddemo的代码,我把一些特征函数都用出来,但是只是用来查考和说明名灵zL的。?
Statement stmt2 = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs2 = stmt.executeQuery("SELECT * FROM user");
rs2.next();
rs2.updateDate("lastdatetime", new Date(Calendar.getInstance().getTimeInMillis()));
rs2.updateRow();
rs2.afterLast();
while(rs2.previous()){ /**....*/ }
rs.beforeFirst();
while(rs2.next()){ /**....*/ }
rs.last();
rs.first();
rs.absolute(5); //游标Ud到第5?
rs.absolute(-1); //游标Ud到最后一?
rs.relative(-5); //游标向上Ud5?
rs.relative(2); //游标向下Ud2?
rs.deleteRow(); //删除当前?
rs.last(); //游标Ud到最?
rs.updateString("summary", "This is ..."); //讄更新的字D?
rs.cancelRowUpdates(); //取消刚才输入的更?
rs.getRow(); //得到当前行号
rs.moveToInsertRow(); //游标Ud到要新增的那条记录上
rs.updateInt("id", 1);
rs.updateString(2, "my name");
rs.insertRow(); //插入新记录?
JDBC2.0提供的还有一个功能就是数据库的批量操作:(x)
con.setAutoCommit(false);
Statement stmt3 = con.createStatement();
stmt3.addBatch("insert .....");
stmt3.addBatch("insert .....");
int[] rows = stmt3.executeBatch();
con.commit();
但是有一点要注意Qstmt3.executeBatch()他不?x)自动给你回滚数据操作,当你?条update语句的时候,如果W三条发生错误,那么无法自动回滚前两条update语句的媄响,所以一定要自己手工q行事务理。?
在?zhn)的事务中使用 Savepoint
JDBC3.0中最令h兴奋的附加特点就是 Savepoint 了。有时候需要的是对事务多一点的控制Q而不是在当前的事务中单地Ҏ(gu)一个改变进行回滚。在JDBC3.0下,(zhn)就可以通过 Savepoint 获得q种控制。Savepoint 接口允许(zhn)将事务分割为各个逻辑断点Q以控制有多事务需要回滚。看下面的代码:(x)
conn.setAutoCommit(false);
conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
Statement stmt = conn.createStatement();
int rows = stmt.executeUpdate( "INSERT INTO authors (first_name, last_name) valueS(′Lewis? ′Carroll?");
Savepoint svpt = conn.setSavepoint("NewAuthor");
try{
rows = stmt.executeUpdate( "UPDATE authors set type = ′fiction′ WHERE last_name = ′Carroll?);
}catch(Exception e){
conn.rollback(svpt);
rows = stmt.executeUpdate( " update .......... other sql ");
}
conn.commit();
上面代码昄Q当UPDATE authorsp|的时候,pȝ事务回滚UPDATE authors的sql的媄响,而INSERT INTO authors的sql仍然有效
索自动生的关键字?/b>
Z解决对获取自动生的或自动增加的关键字的值的需求,JDBC 3.0现在获取这U值变得很L。要定M所产生的关键字的|只要单地在语句的 execute() Ҏ(gu)中指定一个可选的标记QStatement.RETURN_GENERATED_KEYS和Statement.NO_GENERATED_KEYS。在执行q条语句后,所产生的关键字的值就?x)通过从 Statement 的实例方法 getGeneratedKeys() 来检索 ResultSet 而获得。ResultSet 包含了每个所产生的关键字的列。看下面代码Q?
Statement stmt = conn.createStatement();
stmt.executeUpdate("INSERT INTO authors (first_name, last_name) valueS (′George? ′Orwell?", Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
if ( rs.next() ) {
int key = rs.getInt();
}
http://www.netskycn.com/article/articleId2913.html
]]>
ClassNotFoundException
ClassNotFoundException 是最常见的类装入异常cd。它发生在装入阶Dc(din)Java 规范?ClassNotFoundException 的描q是q样的:(x)
当应用程序试N过cȝ字符串名Uͼ使用以下三种Ҏ(gu)装入c,但却找不到指定名U的cd义时抛出该异常?br /> * c?Class 中的 forName() Ҏ(gu)?br /> * c?ClassLoader 中的 findSystemClass() Ҏ(gu)?br /> * c?ClassLoader 中的 loadClass() Ҏ(gu)?br /> 所以,如果昑ּ地装入类的尝试失败,那么抛?ClassNotFoundException?br /> q些异常修复h通常比较单。可以用 verbose 选项查类路径Q确保用的c\径设|正。如果类路径讄正确Q但是仍然看到这个错误,那么是需要的cdc\径中不存在。要修复q个问题Q可以把cȝ动到c\径中指定的目录或 JAR 文g中,或者把cL在的位置d到类路径中?br />
NoClassDefFoundError
NoClassDefFoundError 是类装入器在装入阶段抛出的另一个常见异常。JVM 规范?NoClassDefFoundError 的定义如下:(x)
如果 Java 虚拟机或 ClassLoader 实例试图装入cd义(作ؓ(f)正常的方法调用的一部分Q或者作Z?new 表达式创建新实例的一部分Q,但却没有扑ֈcd义时抛出该异常?br /> 当目前执行的cdl编译,但是找不到它的定义时Q会(x)存在 searched-for cd义?
实际上,q意味着 NoClassDefFoundError 的抛出,是不成功的隐式类装入的结果?br /> 单说来,是引用的类在类路径中没有找到?br />ClassCastException
c装入器能够抛出的另一个异常是 ClassCastException。它是在cd比较中发C兼容cd的时候抛出的。JVM 规范指定 ClassCastException 是:(x)
该异常的抛出Q表明代码企图把对象的类型{换成一个子c,而该对象q不是这个子cȝ实例?
UnsatisfiedLinkError
在把本地Ҏ(gu)调用链接到对应的本机定义Ӟc装入器扮演着重要角色。如果程序试图装入一个不存在或者放错的本机库时Q在链接阶段的解析过E会(x)发生 UnsatisfiedLinkError。JVM 规范指定 UnsatisfiedLinkError 是:(x)
对于声明?native 的方法,如果 Java 虚拟机找不到和它对应的本a定义Q就?x)抛异常?
当调用本机方法时Q类装入器会(x)试装入定义了该Ҏ(gu)的本机库。如果找不到q个库,׃(x)抛出q个错误?br /> 本机库的装入p?System.loadLibrary() Ҏ(gu)的类的类装入器启?Q根据用的c装入器Q会(x)搜烦不同的位|:(x)
* 对于?bootstrap c装入器装入的类Q搜?sun.boot.library.path?br /> * 对于由扩展类装入器装入的c,先搜?java.ext.dirsQ然后是 sun.boot.library.pathQ然后是 java.library.path?br /> * 对于ql类装入器装入的c,搜烦 sun.boot.library.pathQ然后是 java.library.path?br />ClassCircularityError
JVM 规范指定 ClassCircularityError 的抛出条件是Q?br /> cL接口׃是自q类或超接口而不能被装入?
q个错误是在链接阶段的解析过E中抛出的。这个错误有点奇怪,因ؓ(f) Java ~译器不允许发生q种循环情况。但是,如果独立地编译类Q然后再把它们放在一P可能发生这个错误?br />ClassFormatError
JVM 规范指出Q抛?ClassFormatError 的条件是Q?br /> 负责指定所h的编译类或接口的二进制数据Ş式有误?
q个异常是在c装入的链接阶段的校验过E中抛出。如果字节码发生了更改,例如ȝ本号或次版本号发生了更改Q那么二q制数据的Ş式就?x)有误。例如,如果对字节码故意做了更改Q或者在通过|络传送类文g时现Z错误Q那么就可能发生q个异常?br /> 修复q个问题的惟一Ҏ(gu)是获得字节码的正确副本Q可能需要重新进行编译?br />ExceptionInInitializerError
Ҏ(gu) JVM 规范Q抛?ExceptionInInitializer 的情冉|Q?br /> * 如果初始化器H然完成Q抛Z些异?EQ而且 E 的类不是 Error 或者它的某个子c,那么׃(x)创徏 ExceptionInInitializerError cȝ一个新实例Qƈ?E 作ؓ(f)参数Q用q个实例代替 E?br /> * 如果 Java 虚拟囑ֈ建类 ExceptionInInitializerError 的新实例Q但是因为出?Out-Of-Memory-Error 而无法创建新实例Q那么就抛出 OutOfMemoryError 对象作ؓ(f)代替?br />http://www.tkk7.com/zyl/archive/2007/02/04/97881.html
]]>
< filter >
< filter-name > Set Character Encoding </ filter-name >
< filter-class > org.springframework.web.filter.CharacterEncodingFilter </ filter-class >
< init-param >
< param-name > encoding </ param-name >
< param-value > GBK </ param-value >
</ init-param >
< init-param >
< param-name > ignore </ param-name >
< param-value > true </ param-value >
</ init-param >
</ filter >
< filter-mapping >
< filter-name > Set Character Encoding </ filter-name >
< url-pattern > *.do </ url-pattern >
</ filter-mapping >
< filter-mapping >
< filter-name > Set Character Encoding </ filter-name >
< url-pattern > *.jsp </ url-pattern >
</ filter-mapping >
< filter-mapping >
< filter-name > Set Character Encoding </ filter-name >
< url-pattern > *.html </ url-pattern >
</ filter-mapping >
< filter-mapping >
< filter-name > Set Character Encoding </ filter-name >
< url-pattern > *.htm </ url-pattern >
</ filter-mapping >
的,有用
<% request.setCharacterEncoding( " GBK " ); %>
的,q有?/p>
<% @ page contentType = " text/html; charset=GBK " pageEncoding = " GBK " %>
<meta http-equiv="content-type" content="text/html; charset=GBK">
?q可以用
<% String name = new String(request.getParameter( " name " ).getBytes( " 8859_1 " ), " GB2312 " ); %>
昨天在做项目的q程中,发现用URL传request参数的时候,在第二个面上得Cؕ码的问题。把上面几种Ҏ(gu)都试了一下还是不行。仔l追t了一下,发现在页面的源代码上中文是正常的Q一直到URLq是中文正常Q可是在后台的Action里面log出来成了ؕ码了Q于是猜x在request装的过E中把中文变成ؕ码了Q以致于后台直接是取到的ؕ码。在后台Action中Set入中文,面上正常显C,说明Struts的中文已l不存在问题。剩下的Q应该就只有doGet和doPostҎ(gu)的问题了。找了一下tomcat的配|文Ӟ发现只要在server.xml中:(x)
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
< Connector port ="8080" maxHttpHeaderSize ="8192"
maxThreads ="150" minSpareThreads ="25" maxSpareThreads ="75"
enableLookups ="false" redirectPort ="8443" acceptCount ="100"
connectionTimeout ="20000" disableUploadTimeout ="true" />
<!-- Note : To disable connection timeouts, set connectionTimeout value
to 0 -->
改ؓ(f)
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
< Connector port ="8080" maxHttpHeaderSize ="8192"
maxThreads ="150" minSpareThreads ="25" maxSpareThreads ="75"
enableLookups ="false" redirectPort ="8443" acceptCount ="100"
connectionTimeout ="20000" disableUploadTimeout ="true" URIEncoding ="GBK"/>
<!-- Note : To disable connection timeouts, set connectionTimeout value
to 0 -->
是加上URIEncoding="GBK"׃事大吉了?br />
再加上一条:(x)
<session-factory>
<property name="hibernate.connection.url">jdbc:jtds:sqlserver://192.168.0.3:1433;DatabaseName=HomeConsume;charset=GBK</property>
<property name="hibernate.cglib.use_reflection_optimizer">true</property>
<property name="hibernate.connection.password">sju</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>
<property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
<mapping resource="net/magicyang/homeconsume/pojo/Test.hbm.xml" />
<mapping resource="net/magicyang/homeconsume/pojo/Consumeinfo.hbm.xml" />
<mapping resource="net/magicyang/homeconsume/pojo/Consumetype.hbm.xml" />
</session-factory>
xQ应该再困难的ؕ码问题都解决了吧。就是要在页面上、数据库中、request里、doGet、doPostҎ(gu)里面都是中文Q看你还有什么地方躲Q?
可是Q如果通过了多U反向代理的话,X-Forwarded-For的值ƈ不止一个,而是一Ԍp|I竟哪个才是真正的用L(fng)的真实IP呢?
{案是取X-Forwarded-For中第一个非unknown的有效IP字符丌Ӏ?br />
如:(x)
X-Forwarded-ForQ?92.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
用户真实IP为:(x) 192.168.1.110