BBY-Java笔记第二篇

Actionsupport介绍
ActionSupport工具类实现了Action接口,定义了一个validate()方法,重写该方法,它会在execute()方法之前执行,如校验失败,会转入input处,必须在配置该Action时配置input属性;
另外,ActionSupport还提供了一个getText(String key)方法还实现国际化,该方法从资源文件上获取国际化信息。
iBatis语句符号
$中间的变量就是直接替换成值的,#会根据变量的类型来进行替换。比如articleTitle的类型是string, 值是"标题"的时候,$articleTitle$ = 标题;#articleTitle# = '标题'。
函数执行顺序
静态块在静态方法之前执行;静态方法和构造函数同时存在时,构造函数不执行;服务器端用绝对路径,客户端用相对路径;
Eclipse tomcat debug模式设置
需要设置server.xml中的Context reloadable="true", true自动重载(不是重启!), false手动重载。(如果项目在Tomcat中,应该去Tomcat目录设置) Eclipse EE 设置方式,文件设置:server.xml > reloadable="false" 界面设置:Server > Modules > Edit > webapp > Auto reloading enabled > false。
Ibatis配置文件
用<![CDATA[   ]]>标记避免Sql中与xml规范相冲突的字符对xml映射文件的合法性造成影响。
i18n-internationalization
通过native2ascii工具创建支持中文的资源属性文件
*native2ascii工具的位置:JAVA_HOME\bin\
具体使用方法:native2ascii 输入文件 输出文件  例:native2ascii a.properties b.properties
在struts.xml文件中引入资源文件
<constant name="struts.custom.i18n.resources" value="资源文件名"/>在JSP页面中调用资源文件的方法:
1) 使用<s:text key / label/
如:<s:text name="HelloWorld" />
2) 使用<s:property >
如:
<!-- 1.取当前项目文件中的key(name)叫做HelloWorld
2.使用EL表达式通过getText方法简单的获取国际化字符串-->
<s:property value="%{getText('HelloWorld')}" />
<!-- 通过getText设置UI标签中label标签的属性 -->
<s:textfield name="name" label="%{getText('HelloWorld')}" />
MyEclipse在线安装Svn、PropertiesEditor和FreeMarker
1、svn
help -- > software updates -- > find and install..
search for new features to install -- >next -- >new remote site
name:SVN
url:http://subclipse.tigris.org/update_1.4.x
如果出现 Subclipse Integration for Mylyn 3.x (Optional) (3.0.0) requires plug-in "org.eclipse.mylyn.tasks.core (3.0.0)", or compatible.错误,把第一个框框的Integrations项的勾干掉。
2、PropertiesEditor
name: PropertiesEditor
url: http://propedit.sourceforge.jp/eclipse/updates/
3、FreeMarker
name: FreeMarker
url: http://www.freemarker.org/eclipse/freemarker/
加载资源文件中的国际化配置
Java国际化类包括Locale及ResourceBundle,存在于java.util包中,Locale由语言和地区两部分组成。
Locale locale = new Locale("zh","CN");
ResourceBundle messages = ResourceBundle.getBundle("messages",locale);
String title = messages.getString("title");
加载了messages_zh_CN.properties的资源文件,读取了资源文件中的title的值。
二期Struts2配置文件注释
一、国际化和Struts标签模板配置
<!—配置国际化资源-->
<constant name="struts.custom.i18n.resources" value="i18n/message"></constant>
<constant name="struts.i18n.encoding" value="UTF-8" />
<!—配置action后缀名-->
<constant name="struts.action.extension" value="action"/>
Struts模板配置(影响标签在页面的显示样式)
1、struts.xml中
<!—配置struts默认主题-->
<constant name="struts.ui.theme" value="simple" />
<!—配置struts主题默认路径-->
<constant name="struts.ui.templateDir" value="template" />
<!—配置struts模板文件后缀名-->
<constant name="struts.ui.templateSuffix" value="ftl" />
2、struts.properties中
struts.ui.theme=simple
struts.ui.templateDir=template
struts.ui.templateSuffix=ftl
更多详细配置参照:http://blog.csdn.net/tjcyjd/article/details/6261869
二、拦截器配置
<interceptors>
<!-- 自定义拦截器 -->
<interceptor name="venu4aAuthority"
class="cn.com.venustech.venus4a.common.permissions.AuthorityInterceptor"/>
<!-- struts2的json数据类型拦截器 -->
<interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>
<!-- 自定义拦截器栈 -->
<interceptor-stack name="venu4aDefault">
<!-- 引入默认拦截器 -->
<interceptor-ref name="defaultStack"/>
<!-- 引入自定拦截器 -->
<interceptor-ref name="venu4aAuthority"/>
<!-- 引入json拦截器 -->
<interceptor-ref name="json"></interceptor-ref>
</interceptor-stack >
</interceptors>
二期Spring配置文件注释
<!-- 加载Oracle数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@192.168.14.173:1521:ora10g" />
<property name="username" value="venus" />
<property name="password" value="venus" />
</bean>
<!-- 配置spring事务管理数据源 -->
<bean id="transactionManager" class=
"org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!—配置spring事务处理驱动,采用java5的@Transactional方式-->
<tx:annotation-driven transaction-manager="transactionManager"/>
在联合操作方法(通常是ServiceImpl类中)上加注解@Transactional,适用于联合处理较少的工程;事物处理除此方法还可采用配置文件方式,在一xml文件中配置,适用于联合处理较多的工程。
<!-- 加载ibatis的sql管理文件 -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource">
<ref local="dataSource"/>
</property>
<property name="configLocation">
<value>classpath:config.xml</value>
</property>
</bean>
其中config.xml是ibatis总配置文件。
<!--初始化平台参数-->
<bean id="globalParamUtil" class="cn.com.venustech.venus4a.common.util.GlobalParamUtil"
init-method="loadSysParamList">
<property name="sysGlobalParamDao" ref="sysGlobalParamDao"></property>
</bean>
在方法loadSysParamList中加载参数。
JavaServiceWrapper可将Java应用程序转为系统服务;
LDAP(轻量目录访问协议),是存贮模式和访问协议,是一个比关系数据库抽象层次更高的存贮概念,与关系数据库的查询语言SQL属同一级别,数据查询很快,LDAP最基本的形式是一个连接数据库的标准方式。
三种主流工作流1、jboss的Jbpm;2、opensymphony的Osworkflow;3、Enhydra的Shark。
ActiveMQ是一种开源的消息总线,同类开源JMS供应商还有jbossmq,jboss messaging,joram,openjms,mantamq,ubermq,SomnifugiJMS,IBM的MQ是收费的。二期中使用4.1.1版本比较旧。
Java可通过RMI(远程方法调用)实现分布式编程;
SOA(service-oriented architecture),面向服务的体系结构,是一个组件模型。
Jasperreport是一种报表生成工具;
Eclipse/MyEclipse多个开发环境配置
使用Eclipse/MyEclipse开发时,不需要配置环境变量,方法:
开发平台:可以指定默认JDK版本,这个默认的JDK可以选择为本地安装的JDK;并且tomcat也可以关联到JDK;
运行环境:在tomcat/bin/cataline.bat中配置JDK,实际上是为了指定jre环境,配置如下:
set CURRENT_DIR=%cd%后加入一行
set JAVA_HOME=D:\Program Files\Java\jdk1.6.0_13(本地安装路径)
Java解析Xml文档(网上搜索来的)
Dom和Sax是两种主流选择,其他还有Jdom,Dom4j
DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。
例:
import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
public class MyXMLReader{
  public static void main(String arge[]){
  long lasting =System.currentTimeMillis();
  try{
   File f=new File("data_10k.xml");
   DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
   DocumentBuilder builder=factory.newDocumentBuilder();
   Document doc = builder.parse(f);
   NodeList nl = doc.getElementsByTagName("VALUE");
   for (int i=0;i<nl.getLength();i++){
System.out.print("车牌号码:"+ doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());
System.out.println("车主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());
  }
  }catch(Exception e){
  e.printStackTrace();
  }
SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。
例:
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
public class MyXMLReader extends DefaultHandler {
  java.util.Stack tags = new java.util.Stack();
  public MyXMLReader() {
  super();}
  public static void main(String args[]) {
  long lasting = System.currentTimeMillis();
  try {
   SAXParserFactory sf = SAXParserFactory.newInstance();
   SAXParser sp = sf.newSAXParser();
   MyXMLReader reader = new MyXMLReader();
   sp.parse(new InputSource("data_10k.xml"), reader);
  } catch (Exception e) {
   e.printStackTrace();
  }
  System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + "毫秒");}
  public void characters(char ch[], int start, int length) throws SAXException {
  String tag = (String) tags.peek();
  if (tag.equals("NO")) {
   System.out.print("车牌号码:" + new String(ch, start, length));}if (tag.equals("ADDR")) {
  System.out.println("地址:" + new String(ch, start, length));}}
  public void startElement(String uri,String localName,String qName,Attributes attrs) {
  tags.push(qName);}}
注意:
当xml数据的形式作为传递时,要获取一条条的纪录是比较适宜于采用dom,虽然它对系统(内存,性能等)有较高的要求,但是一般的服务器都可满足上G的xml文档的处理。
当需要对xml的某些内容或某些节点的特定访问时,或需要一及时地事件相应时,可以用sax来处理。它是基于时间处理机制的,在编程时,通过重载一些事件方法,来获得对xml文档的处理。
有关xml的编码,InputStreamReader和xmlReader的关系:
通常的DOM和SAX对于用ascii编码的文档,通过用InputStreamReader读入xml文档,后变成了unicode码,然后不能用XMlREader来处理,出现错误的原因是:遇到无效的unicode的字符。(当你用system.out.println()输出是没有任何问题,因为它能自动转成本地机的编码)。
解决的方法:
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(f),"ISO8859-1"));
这样就可以限定它的编码,这样就没有问题。
String 的长度问题:String 类型安标准来说没有长度限制,但是一般jdk中String的最大长度是4G。
String与BufferedString关系:在不涉及到字符串有效的大量处理,通常使用String. BufferedString在处理字符串的大量处理上有优势。
这里之所以提到了Xml文件解析,是要记录一种基于Sax加载配置参数的一种方法,大体如下:
类继承org.xml.sax.helpers.DefaultHandler,然后:
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser sp = sf.newSAXParser();
LoadServer testsax = new LoadServer();
try {
sp.parse(new InputSource(getWebRootPath() + "/server.xml"),testsax);
} catch (Exception e) {
sp.parse(new InputSource("bin/" + getWebRootPath() + "/server.xml"),testsax);
}
具体参数提取逻辑在startElement方法中实现,例如:
public void startElement(String namespaceURI, String localName,String qName, Attributes atts) {
// 如果是根标记<Server>
if ("Server".equalsIgnoreCase(qName)) {
for (int i = 0; i < atts.getLength(); i++) {
//服务器监听端口
if ("port".equalsIgnoreCase(atts.getQName(i))) {
try {
SysProperty.SYS_PORT = Integer.parseInt(atts.getValue(i));
} catch (Exception e) {
logger.error(e);
}
}
}
}
}
工程无法发布问题
myEclipse下为tomcat发布工程时,如果不能以Exploded Archive模式发布,需要在工程目录下.mymetadata文件中添加以下属性:context-root="/工程名",然后重启myEclipse即可。
Myeclipse运行出现内存溢出情况的解决办法
java.lang.OutOfMemoryError: Java heap space
一直都知道可以设置jvm heap大小,一直用eclipse写/调试java程序。一直用命令行or console加参数跑程序。现象:在eclipse的配置文件eclipse.ini中设置-vmargs -Xms500m -Xmx1024m,在eclipse中直接run 或者debug某些耗内存的程序时依然出现java.lang.OutOfMemoryError: Java Heap Space错误,即通常认为的内存不足,java虚拟机内存不够用。而在命令行加这些参数则有效果,不会出错。这说明一个问题,这些参数根本没有起作用。今天需要在eclipse里调试程序,还没到需要调试的地方就heap error了,在网上搜了很多地方,得到了最终的答案:
选中被运行的类,点击菜单‘run->run...’,选择(x)=Argument标签页下的vm arguments框里输入 -Xmx800m, 保存运行。
request.getSession
request.getSession()不管有没有参数,如果会话已经存在了,那么就会返回存在的会话;
设置参数的目的只是当会话不存在时,返回null还是新的session的区别,
参数为false时,返回的是null; 没有参数或是true则返回新的session。
将XML文件转为document文件对象方法
String classPath = Test.class.getResource("/").getPath();
String appWSConfigFilePath = classPath + "conf/accountserver/appWebService.xml";
SAXReader read = new SAXReader();
// 装载目标xml
Document doc = null;
try {
    Document doc = read.read(appWSConfigFilePath);
Element root = doc.getRootElement();
} catch (DocumentException e1) {
     e1.printStackTrace();
}
注:
this.getClass().getClassLoader().getResource(“”);—获取当前类路径;this.getClass().getClassLoader().getResource(“/”);—获取到bin/路径。
关于JAVA接口/类
一个接口可以继承多个接口:
interface C extends A, B {}是可以的;
一个类可以实现多个接口:
class D implements A,B,C{};
但是一个类只能继承一个类,不能继承多个类:
class B extends A{};
在继承类的同时,也可以继承接口:
class E extends D implements A,B,C{};
这也正是选择用接口而不是抽象类的原因。
Ibatis打印完整语句
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.logger.com.ibatis=debug
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug,stdout
关于Eclipse无法生成class文件的问题
今天调试东西的时候发现怎么都无法build,遂用Eclipse里的clean功能打算重新编译一下,结果所有的class文件全部消失了 重新打包发包也不行,经过查找后得到方法:
把properties属性里的java compiler-->building-->abort build when build path errors occur 前的勾去掉,这样就ok 了。
Oralce连接异常解决
java.sql.SQLException: Got minus one from a read call
Caused by: oracle.net.ns.NetException: Got minus one from a read call
调整Spring配置文件数据库最小空闲数,最小初始化数,最大连接数。
Java编译rmi代理类
当前路径:src
命令:
如果没有class类的话,先编译
javac cn/com/venustech/accountserver/externalinterface/AccountServer.java
或者直接到工程bin路径下:
rmic –classpath .; cn.com.venustech.accountserver.externalinterface.CommandServer
Java环境变量设置
添加以下三个系统环境变量
classpath
.;%java_home%\lib\dt.jar;%java_home%\lib\tools.jar;%java_home%\jre\lib\rt.jar
java_home
C:\Program Files\Java\jdk1.5.0_03
Path
%java_home%\bin
JavaBean覆盖toString方法代码
@Override
public String toString() {
       StringBuffer buff = new StringBuffer();
       Method[] m = this.getClass().getMethods();
       final int idx = 3;
       try {
           for(int i=0;i<m.length;i++) {
              String methodName = m[i].getName();
              if (methodName.startsWith("get") && !methodName.endsWith("Class")) {
                  Object o = m[i].invoke(this, new Object[]{});
                  if (o != null) {
                     buff.append(methodName.substring(idx)).append("=[").append(o).append("]\n");
                  }
              }
           }
       }catch(IllegalAccessException iae) {
           iae.printStackTrace();
       }catch(InvocationTargetException ite) {
           ite.printStackTrace();
       }
       return buff.toString();
    }
Web工程servlet类编写及配置
1、继承javax.servlet.http.HttpServlet类
实现doGet、doPost、init方法
2、在web.xml中配置servlet
<servlet>
<servlet-name>SysCodeCycleServlet</servlet-name>
<servlet-class>cn.com.venustech.venus4a.servlet.SysCodeCycleServlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
Web工程listener类编写及配置
1、实现ServletContextListener接口,重写contextInitialized、contextDestroyed两个方法
public class SyncMasterToCATimeListener
implements ServletContextListener{

private static Timer timer = new Timer();
private static Logger log = LoggerFactory.getLogger(MasterLoginIntervalTimeListener.class);
private static SyncMasterToCAAction syncAction =
new SyncMasterToCAAction();
private static String scheduleTime =
PropertyUtil.getProperty("SyncMasterToCATime");
//监听器销毁
public void contextDestroyed(ServletContextEvent arg0) {
timer.cancel();
}
//监听器初始化
public void contextInitialized(ServletContextEvent arg0) {
int periodTime =30;
if(scheduleTime!=null && !scheduleTime.trim().equals("")){
periodTime = Integer.parseInt(scheduleTime);
}
log.info("同步主帐号到CA系统开始");
SyncMasterToCATask task = new SyncMasterToCATask();
timer.schedule(task, 5000,periodTime*1000L);
log.info("同步主帐号到CA系统完毕");
}

public static class SyncMasterToCATask extends TimerTask{
        public void run(){
        syncAction.SyncMasterTOCA();
        }
}
}
2、配置web.xml文件
<listener>
<listener-class>
cn.com.venustech.venus4a.common.timer.SyncMasterToCATimeListener
</listener-class>
</listener>
利用开源jar包实现多线程http请求(不错的代码)
Jar包commons-httpclient-3.0.jar和json.jar
大概代码如下:
public class Venus4ACTBSSyncVideoLog {
private static Logger  logger=
Logger.getLogger(Venus4ACTBSSyncVideoLog.class);
private static
MultiThreadedHttpConnectionManager connectionManager;
static {
connectionManager = new MultiThreadedHttpConnectionManager();
HttpConnectionManagerParams params =
connectionManager.getParams();
params.setConnectionTimeout(15000);
params.setSoTimeout(30000);
params.setDefaultMaxConnectionsPerHost(32);
params.setMaxTotalConnections(256);
}
//周期运行控制
public String executeSync() {
Runnable thread = new Runnable() {
public void run() {
getSynicRDPRes();
}
};
ScheduledExecutorService scheduler =
Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(thread, 60, 3*60, SECONDS);
return null;
}
//调用结果得到json
private static void getSynicRDPRes() {
JSONObject json=getResponseTOJSON(subid);
int count=0;
if(json.has("Root")){ if(json.getJSONObject("Root").getString("Status").equals("0")&&!json.getJSONObject("Root").getJSONObject("ReturnData").getString("RcdFileNum").equals("0")){
json=
json.getJSONObject("Root").getJSONObject("ReturnData").getJSONObject("RcdFileList");
if(json.get("FileInfo") instanceof  JSONArray){
JSONArray array= json.getJSONArray("FileInfo");
for(int j=0;j<array.length();j++){
json=array.getJSONObject(j);
count=updateRcdBySession(json,sessionid,subid);
}
}else{
json=json.getJSONObject("FileInfo"); count=updateRcdBySession(json,sessionid,subid);
}
}
}
//远程http调用
private static JSONObject getResponseTOJSON(String sessionid){
JSONObject json=new JSONObject();
GetMethod getmethod = new GetMethod(SysParamDao.getSysParamValue("CTBS_URL")+"?funcode=45&sessionid="+sessionid);
HttpClient httpclient = new HttpClient(connectionManager);
try{
httpclient.executeMethod(getmethod);
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(getmethod.getResponseBodyAsStream(),"utf-8"));
String line=bufferedReader.readLine();
StringBuilder builder=new StringBuilder();
while(line!=null){
builder.append(line);
line=bufferedReader.readLine();
}
bufferedReader.close();
json=XML.toJSONObject(builder.toString());
}catch(Exception ex){
logger.info("连接CTBS服务失败!"+ex);
}
return json;
}
Xfire发布及调用
http://itil-rong.iteye.com/blog/855909
http://my.oschina.net/lovedreamland/blog/52977
axis和http调用xfire的webservice的方法
http://flyzonemu.iteye.com/blog/987619

你可能感兴趣的:(java)