??xml version="1.0" encoding="utf-8" standalone="yes"?>
Webloigc92 报下面的错误Q有知道的大侠指点一下啊Q谢谢。急急~~
<2009-7-3 上午09?6?3U?CST> <Error> <HTTP> <BEA-101019> <[weblogic.servlet.internal.WebAppServletContext@5d7554 - appName: 'traffic', name: 'WebRoot',
context-path: ''] Servlet failed with IOException
java.io.IOException: failed to read '2' bytes from InputStream; clen: 6016 remaining: 2 count: 6014
at weblogic.servlet.internal.ChunkOutput.writeStream(ChunkOutput.java:417)
at weblogic.servlet.internal.ChunkOutputWrapper.writeStream(ChunkOutputWrapper.java:168)
at weblogic.servlet.internal.ServletOutputStreamImpl.writeStream(ServletOutputStreamImpl.java:498)
at weblogic.servlet.internal.ServletOutputStreamImpl.writeStream(ServletOutputStreamImpl.java:486)
at weblogic.servlet.FileServlet.sendFile(FileServlet.java:405)
Truncated. see log file for complete stacktrace
>
是不是下面的代码有什么问题?
InputStream fis = null;
BufferedOutputStream bos = null;
try {
String dpId = session.getAttribute("dp_id")==null?"":session.getAttribute("dp_id").toString();
String nameReport=request.getParameter("nameReport");
String workbook = request.getParameter("workbook");
if(workbook==null || "".equals(workbook)){
workbook = session.getAttribute("dp_id").toString();
}
String tempworkbook = workbook +"/";
tempworkbook = tempworkbook.replaceAll("d作薄/",dpId+"/");
if(tempworkbook.endsWith("/")){
tempworkbook = tempworkbook.substring(0,tempworkbook.length()-1);
}
fis = request.getInputStream();
bos = new BufferedOutputStream(new FileOutputStream(new File(strAbsPath+"workbookspace\\"+tempworkbook+"\\"+nameReport+".cll")));
int b = fis.read();
while (b != -1) {
bos.write(b);
b = fis.read();
}
}catch (Exception e) {
e.printStackTrace();
}finally{
bos.flush();
bos.close();
fis.close();
bos = null;
fis = null;
}
原因Q因为workbook路径中包含了(jin)I格?/p>
public class UtilTool {
public static Map getParameterMap(HttpServletRequest request) {
Map paramMap = new LinkedHashMap();
String pathInfoStr = request.getPathInfo();
if (pathInfoStr != null && pathInfoStr.length() > 0) {
if (!pathInfoStr.endsWith("/")) pathInfoStr += "/";
int current = pathInfoStr.indexOf('/');
int last = current;
while ((current = pathInfoStr.indexOf('/', last + 1)) != -1) {
String element = pathInfoStr.substring(last + 1, current);
last = current;
if (element.charAt(0) == '~' && element.indexOf('=') > -1) {
String name = element.substring(1, element.indexOf('='));
String value = element.substring(element.indexOf('=') + 1);
paramMap.put(name, value);
}
}
}
java.util.Enumeration e = request.getParameterNames();
while (e.hasMoreElements()) {
String name = (String) e.nextElement();
paramMap.put(name, request.getParameter(name));
}
if (paramMap.size() == 0) {
Map multiPartMap = (Map) request.getAttribute("multiPartMap");
if (multiPartMap != null && multiPartMap.size() > 0) {
paramMap.putAll(multiPartMap);
}
}
return paramMap;
}
public static String requestParameter(HttpServletRequest request){
String fromstr="<form name='request' method='POST'>";
Enumeration requestKeys = request.getParameterNames();
Map requestValues=UtilTool.getParameterMap(request);
String rkey = null;
for(;requestKeys.hasMoreElements();){
rkey = (String) requestKeys.nextElement();
fromstr+="<input name='"+rkey+"' value='"+requestValues.get(rkey)+"' type='hidden'>";
}
fromstr+="</form><script>function reload(){request.submit()}</script>";
return fromstr;
}
}
Jsp调用Q?/p>
<%=UtilTool.requestParameter(request)%>
q样当需要调用弹出窗口ƈh当前|如:(x)
针对当前늚h
window.location.reload();
改ؓ(f)
reload();
2. codeZoo http://www.codezoo.com/
q是O'Reily旗下的,除了(jin)Java之外Q还有Ruby、Python?br>
3. Java学习(fn)源代码检索系l?nbsp; http://www.chinaitlab.com/www/school/codesearch/index.html
隑־看见国的,好歹也要支持一下,分类也算清楚?br>
4. Koders http://www.koders.com/
是个l合查询的网站,不过它好像是从代码中查找关键词,包含的语a挺多的?br>
5. Resources for Java server-side developers http://www.java201.com/
切的说Q它是一个资源收集的|站Q代码查询ƈ不多。不q它分类相当l,如Articles、Books、Examples、Extensions、Frameworks{类Q你可以输入Spring或Hibernate作ؓ(f)关键词搜索一下看看?br>
存货不多Q以后有?jin)再补充?
1.使用StringBuffer代替String
String是用来存储字W串帔R的,如果要执?#8220;+”的操作,pȝ?x)生成一些(f)时的对象Qƈ对这些对象进行管理,造成不必要的开销?
如果字符串有q接的操作,替代的做法是用StringBuffercȝappendҎ(gu)?
当字W串的大超q缺?6Ӟ代码实现?jin)容量的扩充Qؓ(f)?jin)避免对象的重新扩展其容量,那么最好用StringBuffer sb=new StringBufferQ?0Q?
2.优化循环?
Vector vect = new Vector(1000);
for( inti=0; iQvect.size(); i++){
...
}
for循环部分改写成:(x)
int size = vect.size();
for( int i=0; iQsize; i++){
...
}
如果size=1000Q就避免?000ơ的sizeQ)(j)调用开销Q避免了(jin)重复调用.
3.对象的创?
量用new来初始化一个类的实例,当一个对象是用newq行初始化时Q其构造函数链的所有构造函数都被调用到Q所以new操作W是很消耗系l资源的Qnew一个对象耗时往往是局部变量赋D时的上千倍。同Ӟ当生成对象后Q系l还要花旉q行垃圾回收和处理?
当new创徏对象不可避免Ӟ注意避免多次的用new初始化一个对象?
量在用时再创对象?
NewObject object = new NewObject();
int value;
if(iQ? )
{
value =object.getValue();
}
可以修改为:(x)
int value;
if(iQ? )
{
NewObject object = new NewObject();
Value =object.getValue();
}
4.慎用异常处理
异常是Java的一U错误处理机Ӟ对程序来说是非常有用的,但是异常Ҏ(gu)能不利。抛出异帔R先要创徏一个新的对象,q进行相关的处理Q造成pȝ的开销Q所以异常应该用在错误处理的情况Q不应该用来控制E序程Q流E尽量用whileQif{处理?/p>
在不是很影响代码健壮性的前提下,可以把几个try/catch块合成一个?
讨论Q需要处理的异常处理和不需要处理的异常处理在捕捉异常类型上应该采取什么策略?
5.变量的?
量使用局部变量,调用Ҏ(gu)时传递的参数以及(qing)在调用中创徏的(f)时变量都保存在栈QStackQ?中,速度较快。其他变量,如静(rn)态变量、实例变量等Q都在堆QHeapQ中创徏Q速度较慢?
量使用?rn)态变量,卛_修饰WstaticQ如果类中的变量不会(x)随他的实例而变化,可以定义ؓ(f)?rn)态变量,从而他所有的实例都共享这个变量?
Q但是静(rn)态变量不能滥用,如果q个变量用的比较?yu)而声明成?rn)态变量,不仅效率不会(x)提高Q还?sh)(x)?jing)响性能Q?
6.I/O操作
输入/输出QI/OQ包括很多方面,我们知道Q进行I/O操作是很费系l资源的。程序中应该量用I/O操作。用时可以注意Q?. 合理控制输出函数System.out.println()对于大多时候是有用的,特别是系l调试的时候,但也?x)生大量的信息出现在控制台和日志上Q同时输出时Q有序列化和同步的过E,造成?jin)开销?
特别是在发行版中Q要合理的控制输出,可以在项目开发时Q设计好一个Debug的工L(fng)Q在该类中可以实现输出开养I输出的别,Ҏ(gu)不同的情况进行不同的输出的控制?
我们在调试程序的时候,我们喜欢用System.out.println()q样的打印语句来跟踪我们的错误。但在程序发布的时候我们却没有把这L(fng)语句都删除掉Q在目的运行中Q也?x)?jing)响效能?
7.使用~存
d内存要比d文g要快很多Q应可能用缓册Ӏ?
可能用带有Buffer的类代替没有Buffer的类Q如可以用BufferedReader 代替ReaderQ用BufferedWriter代替Writer来进行处理I/O操作?
同样可以用BufferedInputStream代替InputStream都可以获得性能的提高?
8.Servlet的效率问?
Servlet采用h——响应模式提供Web服务Q通过ServletResponse以及(qing)ServletRequestq两个对象来输出和接收用户传递的参数Q在服务器端处理用户的请求,Ҏ(gu)h讉K数据库、访问别的ServletҎ(gu)、调用EJB{等Q然后将处理l果q回l客L(fng)?
·量不用同?
Servlet是多U程的,以处理不同的hQ基于前面同步的分析Q如果有太多的同步就失去?jin)多U程的优势了(jin)?
同步大多C用在一个完整的事务中,避免事务中多Ҏ(gu)作而引L(fng)数据不同步现象。能用逻辑控制的尽量的用逻辑控制?
·不用保存太多的信息在HttpSession?
很多时候,存储一些对象在HttpSession中是有必要的Q可以加快系l的开发,如网上商店系l会(x)把购物R信息保存在该用户的Session中,但当存储大量的信息或是大的对象在?x)话中是有害的,特别是当pȝ中用L(fng)讉K量很大,对内存的需求就?x)很高?
具体开发时Q在q两者之间应作好权衡?
我们在写web应用Ӟl常只需要request的地方而用了(jin)sessionQ这样会(x)是效率大大的降低的。但是我们用C(jin)sessionQ在目的开发中又不能很好的利用sessionQ这样对效率都是有媄(jing)响的。比如说Q我们把用户信息攑֜?jin)session中,但是我们有时候在判断用户是否d的时候,我们們L据库里查q个是否有这个用P又是用了(jin)requestQ但是这h没有必要的,因ؓ(f)我们只需要判断sessionp?jin)。如果ƈ发数量比较大的时候,服务器的负蝲׃(x)q重?
·清除Session
通常情况Q当辑ֈ讑֮的超时时间时Q同时有些Session没有?jin)活动,服务器?x)释放q些没有zd的SessionQ?. 不过q种情况下,特别是多用户q访Ӟpȝ内存要维护多个的无效Session?
当用户退出时Q应该手动释放,回收资源Q实现如下:(x)..
HttpSession theSession = request.getSession();
// 获取当前Session
if(theSession != null){
theSession.invalidate(); // 使该Session失效
}
9.数据库的操作
在J2EE开发的应用pȝ中,数据库访问一般是个必备的环节。数据库用来存储业务数据Q供应用E序讉K?
在Java技术的应用体系中,应用E序是通过JDBCQJava Database ConnectivityQ实现的接口来访问数据库的,JDBC支持“建立q接、SQL语句查询、处理结?#8221;{基本功能。在应用JDBC接口讉K数据库的q程中,只要Ҏ(gu)规范来实玎ͼ可以达到要求的功能?
但是Q有些时候进行数据查询的效率着实让开发h员(sh)如所愿,明明Ҏ(gu)规范~写的程序,q行效果却很差,造成整个pȝ的执行效率不高?
·使用速度快的JDBC驱动
JDBC API包括两种实现接口形式Q一U是UJava实现的驱动,一U利用ODBC驱动和数据库客户端实玎ͼ具体有四U驱动模式ƈ各有不同的应用范_(d)针对不同的应用开发要选择合适的JDBC驱动Q在同一个应用系l中Q如果选择不同的JDBC驱动Q在效率上会(x)有差别?
例如Q有一个企业应用系l,不要求支持不同厂商的数据库,q时可以选择模式4的JDBC驱动Q该驱动一般由数据库厂商实现的Z本地协议的驱动,直接调用数据库管理系l用的协议Q减了(jin)模式3中的中间层?
·使用JDBCq接?
Z(jin)提高讉K数据库的性能Q我们还可以使用JDBC 2.0的一些规范和Ҏ(gu),JDBC是占用资源的Q在使用数据库连接时可以使用q接池Connection PoolingQ避免频J打开、关闭Connection。而我们知道,获取Connection是比较消耗系l资源的?
Connection~冲池是q样工作的:(x)当一个应用程序关闭一个数据库q接Ӟq个q接q不真正释放而是被@环利用,建立q接是消耗较大的操作Q@环利用连接可以显著的提高性能Q因为可以减新q接的徏立?
一个通过DataSource获取~冲池获得连接,q连接到一个CustomerDB数据源的代码演示如下Q?
Context ctx = new InitialContext();
DataSource dataSource = (DataSource) ctx.lookup("jdbc/CustomerDB");
Connection conn = dataSource.getConnection("password","username");
·~存DataSource
一个DataSource对象代表一个实际的数据源。这个数据源可以是从关系数据库到表格形式的文Ӟ完全依赖于它是怎样实现的,一个数据源对象注册到JNDI名字服务后,应用E序可以从JNDI服务器上取得该对象,q用之和数据源建立q接?
通过上面的例子,我们知道DataSource是从q接池获得连接的一U方式,通过JNDI方式获得Q是占用资源的?
Z(jin)避免再次的JNDI调用Q可以系l中~存要用的DataSource?
·关闭所有用的资源
pȝ一般是q发的系l,在每ơ申请和使用完资源后Q应该释放供别h使用Q数据库资源每个模式的含义可以参考SUN JDBC的文档,不同是比较宝늚Q用完成后应该保证d的释放?
L(fng)下面的代码段Q?
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
DataSource dataSource = getDataSource();
// 取的DataSource的方法,实现略?br> conn = datasource.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT * FROM ...");
... // 其他处理
rs.close();
stmt.close();
conn.close();
}catch (SQLException ex) {
... // 错误处理
}
_看g没有什么问题,也有关闭相关如Connection{系l资源的代码Q但当出现异常后Q关闭资源的代码可能q不被执行,Z证资源的实已被关闭Q应该把资源关闭的代码放到finally块:(x)
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
DataSource dataSource = getDataSource();
// 取的DataSource的方法,实现略?br> conn = datasource.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT * FROM ...");
... // 其他处理
}catch (SQLException ex) {
... // 错误处理
}finally{
if (rs!=null) {
try {
rs.close(); // 关闭ResultSet}
catch (SQLException ex) {
... // 错误处理
}
}
if (stmt!=null){
try {
stmt.close(); // 关闭Statement}
catch (SQLException ex) {
... // 错误处理
}
}
if (conn!=null){
try {
conn.close(); // 关闭Connection}
catch (SQLException ex) {
... // 错误处理
}
}
}
·大型数据量处?
当我们在d诸如数据列表、报表等大量数据Ӟ可以发现使用EJB的方法是非常慢的Q这时可以用直接访问数据库的方法,用SQL直接存取数据Q从而消除EJB的经常开支(例如q程Ҏ(gu)调用、事务管理和数据序列化,对象的构造等Q?
·~存l常使用的数?
对于构徏的业务系l,如果有些数据要经常要从数据库中读取,同时Q这些数据又不经常变化,q些数据可以在pȝ中缓存v来,使用时直接读取缓存,而不用频J的讉K数据库读取数据?
~存工作可以在系l初始化时一ơ性读取数据,特别是一些只ȝ数据Q当数据更新时更新数据库内容Q同时更新缓存的数据倹{?
一个例子是Q在一套企业应用系l中Q企业的信息数据Q如企业的名Uͼ(j)在多个业务应用模块中使用Q这时就可以把这些数据缓存v来,需要时直接d~存的企业信息数据?
我们l常使用Hibernateq样的持久数据层的框Ӟ很好的利用?jin)缓存的作用Q所以在一定程度上弥补?jin)封装而带来的效率丢失问题。但是在使用~存的时候应该注意,因ؓ(f)讉K的内存数据而不是真实的数据库数据,所以会(x)出现脏读的情c(din)同时也q不是所有的东西都应该放在缓存(sh)Q不l常用到的我们就没有必要攑֜~存?sh)。有时候我们配合xml文g来用,也不׃U好的方法?
一般意义上_(d)参与pȝq行的代码都?x)对性能产生影响Q实际应用中应该L良好的编E规范、编写高质量的代码,当系l性能出现问题Ӟ要找C要媄(jing)响性能的瓶颈所在,然后集中_֊优化q些代码Q能辑ֈ事半功倍的效果?
J2EE性能的优化包括很多方面的Q要辑ֈ一个性能优良的系l,除了(jin)x(chng)代码之外Q还应该Ҏ(gu)pȝ实际的运行情况,从服务器软硬件环境、集技术、系l构架设计、系l部|环境、数据结构、算法设计等斚wl合考虑?
一、从1.X升?.X需要做以下事情Q?br />1、改变(sh)的taglib声明中的URI?br /> (tng)<% at taglib uri="http://struts-menu.sf.net/tag" prefix="menu" %>
2、改?lt;plug-in>,使用新的包名"net.sf.navigator." ?br /> (tng)<plug-in className="net.sf.navigator.menu.MenuPlugIn">
3、改变(sh)的menu-config.xml文gQ用新的包?net.sf.navigator." ?br /> (tng)<Displayer name="Simple"
(tng) (tng) type="net.sf.navigator.displayer.SimpleMenuDisplayer"/>
二、快速开始:(x)
1、下载最新的struts-menu版本Q?br />2、解包到本地目录Q?br />3、下载Tomcat或者其它Servlet容器Q?br />4、把struts-menu.war包放入Tomcat安装目录的wabapps目录下,q启Tomcat服务?br />5、打开htpp://localhost:8080/struts-menu/
三、把Struts Menu整合C的应用程序中Q?br />Struts Menu能够被轻易的整合C的Struts应用E序中,它也可以整合C个非Struts的应用程序中Q但是我不喜Ƣ这样做Q所以在此没有提供相应的教程。这里将一步步的带你整合这个标{ֺ?br />你需要把struts-menu.jar攑ֈ你的WEB-INF/lib目录下。然后用URI标签声明你的JSP文g中想使用的这个标{ֺ?br />如果使用Struts Menu 2.1Q你q需?Jakarta's Standard Tag Library JAR包放入你的WEB-INF/lib目录下。下载地址Q?a >http://ibiblio.org/maven/taglibs/jars/standard-1.0.4.jarQ这个文件包括例EWAR包文件和二进制发布包?br />1、放入struts-menu.jar包到你的应用E序的WEB-INF/lib目录中?br />2、在你的struts-config.xml文g中加入plug-in讄?br /> (tng)<plug-in className="net.sf.navigator.menu.MenuPlugIn">
(tng) (tng) <set-property property="menuConfig"
(tng) (tng) (tng) (tng) value="/WEB-INF/menu-config.xml"/>
(tng)</plug-in>
3、你需要在你的应用E序?WEB-INF/menu-config.xml文g中定义你的菜单,q里提供一个简单的片断Q?br /> (tng)<Menu name="contactMenu" title="Contact" location="?Contact">
(tng) (tng) <Item name="email" title="E-Mail" location="?EMail"/>
(tng) (tng) <Item name="phone" title="Phone" location="?Phone"/>
(tng)</Menu>
更多全面的例E,h看应用程序的web/WEB-INF目录中的menu-config.xml文gQ你可以截取一D作Z需要的菜单。完整的属性列表,可以查看MenuBase class's javadocsQ?a >http://struts-menu.source......avigator/menu/MenuBase.htmlQ?br />4、在你的JSP文g的顶部加入taglib声明Q?br /> (tng)<% at taglib uri="http://struts-menu.sf.net/tag" prefix="menu" %>
5、在你的JSP文g中要攄菜单的位|加入taglib代码Q?br /> (tng)<menu:useMenuDisplayer name="TabbedMenu"
(tng) (tng) bundle="org.apache.struts.action.MESSAGE">
(tng) (tng) <menu:displayMenu name="Home"/>
(tng) (tng) <menu:displayMenu name="About"/>
(tng)</menu:useMenuDisplayer>
属性name="TabbedMenu"被定义在menu-config.xml文g的顶部:(x)
(tng)<Displayer name="TabbedMenu"
(tng) (tng) type="net.sf.navigator.displayer.TabbedMenuDisplayer"/>
(译注Q其实到此步卛_在你的JSP文g中添加相应的菜单?jin),只不q是没有l合Velocity。在menu-config.xml文g的头部可以定义多个DisplayerQ每个Displayer都有name和type属性,name属性与JSP文g中menu:useMenuDisplayer标签的name属性相对应Q即表明使用何种样式Q具体的样式定义便在type属性中定义Qtype属性中是一个class。在menu-config.xml文g中的菜单定义中的name属性则与JSP文g中的menu:displayMenu标签的name属性相对应?
使用定制的Velocity模版实施你的菜单Q你需要整合VelocityC的WEB应用E序中。如果需要这样做的话Q请完成下面的步骤:(x)
1、确定你的menu-config.xml文g有“Velocity”的displayer定义Q?br /> (tng)<Displayer name="Velocity"
(tng) (tng) (tng) (tng) type="net.sf.navigator.displayer.VelocityMenuDisplayer"/>
2、加入Velocity的JARs包到你的WEB-INF/lib目录中,下蝲velocity-1.4-rc1.jarQ?a >http://www.ibiblio.org/ma......y/jars/velocity-1.4-rc1.jarQ和velocity-tools-view-1.0.jarQ?a >http://www.ibiblio.org/ma......velocity-tools-view-1.0.jarQ?
3、加入globalMacros.vmQ?a >http://cvs.sourceforge.net/viewcvs.py/*checkout*/struts-menu/navigator/web/WEB-INF/classes/globalMacros.vm?content-type=text%2Fplain&rev=1.1Q右键另存(sh)ؓ(f)Q)(j)C的WEB-INF/lib目录中?br />4、改变(sh)的JSP文g中displayer的gؓ(f)“Velocity”,“config”属性指向一个文Ӟ如config="/templates/tabs.html"Q或者如果tabs.htm在你的WEB-INF/classes目录中的话,则可设config="tabs.html"?/p>
q里提供?jin)一些用Velocity的displayer例子Q可在sample applicationQ?a >http://demo.raibledesigns.com/struts-menu/index.jspQ中查看。它L在你的菜单需要的时候显CCSSQJavaScript和图像文件。下面有一些在当前的Struts Menu中用到的Velocity模版的例子的链接Q?br /> (tng)CoolMenus: DemoQ?a >http://demo.raibledesigns......menu/velocity-coolmenu4.jspQ?
(tng) (tng) TemplateQ?a >http://struts-menu.sourceforge.net/templates/coolmenus.htmlQ?
(tng)NiceTabs: Demo, Template
(tng)Tabs: Demo, Template
(tng)XTree: Demo, Template
所有相关的有用的文件如果你需要的话都可以在下面的站点上下载:(x)
(tng)I(yng)mages Q?a >http://struts-menu.sourceforge.net/menu-images/Q?br /> (tng)Stylesheets Q?a >http://struts-menu.sourceforge.net/styles/Q?br /> (tng)Scripts Q?a >http://struts-menu.sourceforge.net/scripts/Q?br /> (tng)Templates Q?a >http://struts-menu.sourceforge.net/templates/Q?/p>
更多的基于roles的显C?隐藏菜单的信息,h看FAQsQ?a >http://struts-menu.sourceforge.net/faq.htmlQ?/p>
四、在Struts之外使用Struts Menu:
?.2版中QMenu Repository能够使用MenuContextListener载入Q?br /> (tng)<!--
(tng) (tng) (tng) - Loads the menu-config.xml for struts-menu at startup,
(tng) (tng) (tng) - by default from "/WEB-INF/menu-config.xml".
(tng) (tng) (tng) - To override this, add a context-param named "menuConfigLocation"
(tng) (tng) (tng) - web.xml file.
(tng) (tng) (tng) -->
(tng)<listener>
(tng) (tng) (tng) (tng) <listener-class>net.sf.navigator.menu.MenuContextListener</listener-class>
(tng)</listener>
或者如果你使用SpringQ甚x(chng)Ҏ(gu)。仅仅需要加入下面的部分C的applicationContext.xml文g中:(x)
(tng)<bean id="menu" class="net.sf.navigator.menu.MenuLoader">
(tng) (tng) <property name="menuConfig">
(tng) (tng) (tng) (tng) <value>/WEB-INF/menu-config.xml</value>
(tng) (tng) </property>
(tng)</bean>
(tng)<!-- The menuConfig property is an optional attribute. (tng) It is set to
(tng) (tng) (tng) (tng) /WEB-INF/menu-config.xml by default. -->
感谢Dan Luputan提供MenuLoadercȝ源代码?/p>
五、从源文件编译:(x)
要从源文件编译这个项目,执行下面的步骤:(x)
1、下载ƈ安装MavenQ?a >http://maven.apache.org/Q;
2、创Z个环境变量MAVENQHOME指出你的Maven的安装目录,然后d$MAVEN_HOME/binC的PATH变量中;
3、操U这个目录你可以扩展源代码,执行“maven.jar”创建target/struts-menu.jar?/p>
要展开struts-menu例程Q需要下面的步骤Q?br />1、下载和安装TomcatQ?br />2、创Z个环境变量CATALINAQHOME指出你的Tomcat的安装目录;
3、执行“maven deploy”把应用E序展开到Tomcat中;
4、打开http://localhost:8080/struts-menu在你喜爱的浏览器中?/p>
如果你喜Ƣ用Eclipse开发项目,请参考此份开发向|http://struts-menu.sourceforge.net/devguide.htmlQ?
如果你用win
/tomcat/bin/catalina.bat 加上下面的命?
set JAVA_OPTS=-Xms32m -Xmx256m
如果你用unix/linux
/tomcat/bin/catalina.sh 加上下面的命?
JAVA_OPTS="-Xms32m -Xmx256m"
(tng)其中, -Xms128m指Java使用的最内存(sh)ؓ(f)32MQ最大用内存(sh)ؓ(f)256M
q里以tomcat环境ZQ其它WEB服务器如jboss,weblogic{是同一个道理?br />一、java.lang.OutOfMemoryError: PermGen space
PermGen space的全U是Permanent Generation space,是指内存的永久保存区?
q块内存?sh)要是被JVM存放Class和Meta信息?Class在被Loader时就?x)被攑ֈPermGen space?
它和存放cd?Instance)的Heap区域不同,GC(Garbage Collection)不会(x)在主E序q行期对
PermGen spaceq行清理Q所以如果你的应用中有很多CLASS的话,很可能出现PermGen space错误,
q种错误常见在web服务器对JSPq行pre compile的时候。如果你的WEB APP下都用了(jin)大量的第三方jar, 其大?br />过?jin)jvm默认的大?4M)那么׃(x)产生此错误信息了(jin)?br />解决Ҏ(gu)Q?手动讄MaxPermSize大小
修改TOMCAT_HOME/bin/catalina.sh
在“echo "Using CATALINA_BASE: (tng) (tng) $CATALINA_BASE"”上面加入以下行Q?br />JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
Q将相同的第三方jar文gUȝ到tomcat/shared/lib目录下,q样可以辑ֈ减少jar 文档重复占用内存的目的?/p>
二、java.lang.OutOfMemoryError: Java heap space
Heap size 讄
JVM堆的讄是指javaE序q行q程中JVM可以调配使用的内存空间的讄.JVM在启动的时候会(x)自动讄Heap size的|
其初始空??Xms)是物理内存的1/64Q最大空?-Xmx)是物理内存的1/4。可以利用JVM提供?Xmn -Xms -Xmx{选项?br />q行讄。Heap size 的大是Young Generation 和Tenured Generaion 之和?br />提示Q在JVM中如?8Q的旉是用于GC且可用的Heap size 不2Q的时候将抛出此异怿息?br />提示QHeap Size 最大不要超q可用物理内存的80Q,一般的要将-Xms?Xmx选项讄为相同,?Xmn?/4?Xmx倹{?
解决Ҏ(gu)Q手动设|Heap size
修改TOMCAT_HOME/bin/catalina.sh
在“echo "Using CATALINA_BASE: (tng) (tng) $CATALINA_BASE"”上面加入以下行Q?br />JAVA_OPTS="-server -Xms800m -Xmx800m (tng) (tng) -XX:MaxNewSize=256m"
三、实例,以下l出1G内存环境下java jvm 的参数设|参考:(x)
JAVA_OPTS="-server -Xms800m -Xmx800m (tng) -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "
2?font color="#000000">Tomcat启动时报filterStart出错(Error filterStart)
试着把tomat/server/lib目录下的commons-digester.jar,commons-beanutils.jar拯到common/lib/目录
q种Ҏ(gu)也许可以帮助解决此问题?/p>
选项Q?br />-c 创徏新的存档
-t 列出存档内容的列?
-x 展开存档中的命名的(或所有的〕文?
-u 更新已存在的存档
-v 生成详细输出到标准输Z
-f 指定存档文g?
-m 包含来自标明文g的标明信?
-0 只存储方式;未用ZIP压羃格式
-M 不生所有项的清单(manifest〕文?
-i 为指定的jar文g产生索引信息
-C 改变到指定的目录Qƈ且包含下列文Ӟ(x)
如果一个文件名是一个目录,它将被递归处理?br />清单Qmanifest〕文件名和存档文件名都需要被指定Q按'm' ?'f'标志指定的相同顺?
CZ1Q将两个class文g存档C个名?'classes.jar' 的存档文件中Q?
jar cvf classes.jar Foo.class Bar.class
CZ2Q用一个存在的清单QmanifestQ文?'mymanifest' ?foo/ 目录下的所有文件存档到一个名?'classes.jar' 的存档文件中Q?
jar cvfm classes.jar mymanifest -C foo/ .
来个例子试试看Q?
我们只有一个HelloWorldQ如下:(x)
public class HelloWorld{
(tng) (tng) (tng) public static void main(String[] args){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) System.out.println("Hi, Hello World!");
(tng) (tng) (tng) }
}
我将q个java文g存到C盘跟目录下,okQ接下来Q?
在先前打开的命令提C符?跌{到C盘提C符?Q我们输入javac HelloWorld.javaQ然后l输入:(x)jar cvf hello.jar HelloWorld.classQ回车后M的C盘看看,多了(jin)什么,没错 hello.jar ?
基本的步骤我们现在都知道?jin),你可以自己去试一下随着jar后面的参数的不同Q结果有什么变化?
紧接着我们看看如何q行我们的jar包?
在进入正题(sh)前,你要先打开我们刚刚做好的jar包看看,多了(jin)什么呢QMETA-INF目录Q再看看里面是什么,q有一个MANIFEST.MF文g是不是?用文本编辑器(我这里是UltraEdit)打开它看看:(x)
Manifest-Version: 1.0
Created-By: 1.4.2 (Sun Microsystems Inc.)
是q样。这里我们对它进行修改,加一句:(x)Main-Class: HelloWorld (在第三行)。这个就是我们之前写的那个类Q也是我们的入口类。也卻I
Manifest-Version: 1.0
Created-By: 1.4.2 (Sun Microsystems Inc.)
Main-Class: HelloWorld
接下来,我们在命令提C符里执行:(x)
jar umf MANIFEST.MF app.jar
q样我们使用?jin)我们自qMANIFEST.MF文g对原来默认的q行?jin)更新。你不妨可以再进ȝ看是不是M?jin)Main-Class: HelloWorldq一句?
OkQ这个最后的一步了(jin)Q来验证我们做的一切,在命令提C符中输入:(x)
java -jar hello.jar(执行)
出现?jin)什么,――Hi, Hello World!
我们再来看看jar文g在tomcat中发布,注意Q在tomcat中我们就不能再用jarq种格式Q而改war格式Q它是专门用于web应用的,其实整个q程下来基本上和jar是类似的Q?
先准备我们要打包的资源?
扑ֈ存放tomcat的webapps目录Q进到其中,新徏一个文件夹Q这里命名ؓ(f)helloQ再q去新徏WEB-INF文g夹,再进L?classes文g夹,此时我们也将我们唯一的servletQHelloWorld.java攑ֈq里Q在与classes目录同下徏立一文g web.xml。OkQ目前我们初步徏立了(jin)一个简单的web应用?
在命令提C符下进到先前创制的hello目录下,执行 jar cvf hello.war * Q我们便得到hello.war。将它拷贝至webapps目录下,okQ来看最后一步,打开tomcat的目录conf中的server.xmlQ加入:(x)
reloadable="true"/>
大功告成Q运行它Q启动tomcatQ后在浏览器中输?a href="http://localhost:8080/hello/HelloWorld">http://localhost:8080/hello/HelloWorldQ有?jin)吗Q?
好了(jin)Q就q么多,希望对你有点帮助?/p>
补充Q?
############
jar基本操作Q?
############
1. 创徏jar文g
jar cf jar-file input-file(s)
c---want to Create a JAR file.
f---want the output to go to a file rather than to stdout.
eg: 1)jar cf myjar.jar query_maintain_insert.htm
2)jar cvf myjar.jar query_maintain_insert.htm
v---Produces verbose(详细? output.
3)jar cvf myjar.jar query_maintain_insert.htm mydirectory
4)jar cv0f myjar.jar query_maintain_insert.htm mydirectory
0---don't want the JAR file to be compressed.
5)jar cmf MANIFEST.MF myjar.jar yahh.txt
m---Used to include manifest information from an existing manifest file.
6)jar cMf MANIFEST.MF myjar.jar yahh.txt
M---the default manifest file should not be produced.
7)jar cvf myjar.jar *
*---create all contents in current directory.
2. 察看jar文g
jar tf jar-file
t---want to view the Table of contents of the JAR file.
eg: 1)jar vft yahh.jar
v---Produces verbose(详细? output.
3. 提取jar文g
jar xf jar-file [archived-file(s)]
x---want to extract files from the JAR archive.
eg: 1)jar xf yahh.jar yahh.txt(仅提取文件yahh.txt)
2)jar xf yahh.jar alex/yahhalex.txt(仅提取目录alex下的文gyahhalex.txt)
3)jar xf yahh.jar(提取该jar包中的所有文件或目录)
4. 修改Manifest文g
jar cmf manifest-addition jar-file input-file(s)
m---Used to include manifest information from an existing manifest file.
5. 更新jar文g
jar uf jar-file input-file(s)
u---want to update an existing JAR file.
-->生成exe:<--
W一E:(x)在jbuilder中:(x) (tng) (tng) (tng) (tng) (tng)
首先你要保证Run菜单-->Run (tng) (tng) (tng) Project能顺利运行?tng) (tng) (tng) (tng)?
然后Wizards菜单-->Native (tng) (tng) (tng) Executable (tng) (tng) (tng) Builder (tng) (tng) (tng) (tng) (tng)
选中Compress (tng) (tng) (tng) the (tng) (tng) (tng) contents (tng) (tng) (tng) of (tng) (tng) (tng) the (tng) (tng) (tng) archive(产生jar文g的话) (tng) (tng) (tng) (tng) (tng)
Next-->Next-->选中Always (tng) (tng) (tng) include (tng) (tng) (tng) all (tng) (tng) (tng) classes (tng) (tng) (tng) and (tng) (tng) (tng) resources再Next-->Next-->Next (tng) (tng) (tng) (tng) (tng)
选中Windows (tng) (tng) (tng) GUI"exe"(产生EXE文g的话)-->Finish (tng) (tng) (tng) (tng) (tng)
再在目的文件列表中的Native (tng) (tng) (tng) Executable叛_-->Make可以了(jin) (tng) (tng) (tng) (tng) (tng)
(tng) (tng)
W二E:(x)在cmd (tng) (tng) (tng) 下生成jar文g (tng) (tng) (tng) (tng) (tng)
abc.txt内容如下Q?tng) (tng) (tng) (tng)?
Manifest-Version: (tng) (tng) (tng) 1.0 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
Main-Class: (tng) (tng) (tng) main-class-name(回車) (tng) (tng) (tng) (tng) (tng)
在cmd下:(x) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
javac (tng) (tng) (tng) *.java (tng) (tng) (tng) (tng) (tng)
jar (tng) (tng) (tng) cvfm (tng) (tng) (tng) abc.jar (tng) (tng) (tng) abc.txt (tng) (tng) (tng) *.class (tng) (tng) (tng) (tng) (tng)
CZ——生成能通过鼠标双击执行的.jar文g (tng) (tng) (tng) (tng) (tng)
一、?tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)?~写Java源程序Test.java如下Q?tng) (tng) (tng) (tng)?
// (tng) (tng) (tng) Test.java (tng) (tng) (tng) (tng) (tng)
import (tng) (tng) (tng) javax.swing.*; (tng) (tng) (tng) (tng) (tng)
/** (tng) (tng) (tng) (tng) (tng)
* (tng) (tng) (tng) @(#) (tng) (tng) (tng) Test.java (tng) (tng) (tng) (tng) (tng)
* (tng) (tng) (tng) Copyleft (tng) (tng) (tng) (c) (tng) (tng) (tng) 2002 (tng) (tng) (tng) RatKing (tng) (tng) (tng) (tng) (tng)
* (tng) (tng) (tng) @author (tng) (tng) (tng) <a (tng) (tng) (tng) href="ratking@ynet.com">RatKing</a> (tng) (tng) (tng) (tng) (tng)
* (tng) (tng) (tng) @version (tng) (tng) (tng) 0.1, (tng) (tng) (tng) 2002-11-7 (tng) (tng) (tng) (tng) (tng)
* (tng) (tng) (tng) 描述Q一?nobr>试用的Java (tng) (tng) (tng) Application (tng) (tng) (tng) (tng) (tng)
*/ (tng) (tng) (tng) (tng) (tng)
public (tng) (tng) (tng) class (tng) (tng) (tng) Test (tng) (tng) (tng) extends (tng) (tng) (tng) JFrame (tng) (tng) (tng) { (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) public (tng) (tng) (tng) Test(String (tng) (tng) (tng) title) (tng) (tng) (tng) { (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) super(title); (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) this.getContentPane().add(new (tng) (tng) (tng) JLabel("试Q?, (tng) (tng) (tng) JLabel.CENTER), (tng) (tng) (tng) SwingConstants.CENTER); (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) this.pack(); (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) } (tng) (tng) (tng) (tng) (tng)
(tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) public (tng) (tng) (tng) static (tng) (tng) (tng) void (tng) (tng) (tng) main(String[] (tng) (tng) (tng) args) (tng) (tng) (tng) { (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) try (tng) (tng) (tng) { (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) //UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) } (tng) (tng) (tng) catch(Exception (tng) (tng) (tng) e) (tng) (tng) (tng) { (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) e.printStackTrace(); (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) } (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) Test (tng) (tng) (tng) t (tng) (tng) (tng) = (tng) (tng) (tng) new (tng) (tng) (tng) Test("Test (tng) (tng) (tng) - (tng) (tng) (tng) 试"); (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) t.setVisible(true); (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) } (tng) (tng) (tng) (tng) (tng)
} (tng) (tng) (tng) (tng) (tng)
(tng) (tng)
二、编译Test.java为Test.classQ当然假设你事先已经讄好了(jin)JDK的环境变量PATH和CLASSPATHQ?tng) (tng) (tng) (tng)?
在命令行执行~译命o(h)Q?tng) (tng) (tng) (tng)?
javac (tng) (tng) (tng) Test.java (tng) (tng) (tng) (tng) (tng)
(tng) (tng)
三、用文本~辑器(比如C?UltraEdit{?tng) (tng)?- (tng) (tng) (tng) 甚至用ECHO命o(h)加管道?gt;>”)(j)~写如下manifest文gQƈ保存?sh)abc.txt (tng) (tng) (tng) (tng) (tng)
(tng) (tng)
Manifest-Version: (tng) (tng) (tng) 1.0 (tng) (tng) (tng) (tng) (tng)
Main-Class: (tng) (tng) (tng) Test (tng) (tng) (tng) (tng) (tng)
(tng) (tng)
【注意】文件abc.txt内必L3行文本:(x) (tng) (tng) (tng) (tng) (tng)
W一行的内容依次是:(x)“Manifest”、英文减受“Version”、英文冒受英文空根{数字?”、英文句受数字?”?tng) (tng) (tng) (tng)?
W二行的英文冒号与Test之间必须要有一个英文空|Q! (tng) (tng) (tng) (tng) (tng)
W三行是一个空行,也就是说Q你要在Test之后键入一个回车,然后才可以存盘退出!Q! (tng) (tng) (tng) (tng) (tng)
如果冒号后面没有I格Q可以生成jar文g但不能执行;如果Test后没有回车符Q则生成jar文g时会(x)报错。?tng) (tng) (tng) (tng)?
(tng) (tng)
四、将Test.class打包?jar文gQƈ使用abc.txt指明哪一个是带有public (tng) (tng) (tng) static (tng) (tng) (tng) void (tng) (tng) (tng) main()的“主函数”?tng) (tng) (tng) (tng)?
在命令行执行~译命o(h)Q?tng) (tng) (tng) (tng)?
jar (tng) (tng) (tng) cvfm (tng) (tng) (tng) Test.jar (tng) (tng) (tng) abc.txt (tng) (tng) (tng) *.class (tng) (tng) (tng) (tng) (tng)
(tng) (tng)
你可以用WinZip之类的解?nobr>软g看一看刚刚生成的Test.jar文g里到底有什么。?tng) (tng) (tng) (tng)?
(tng) (tng)
五、用鼠标双击Test.jar的图标,应该可以看到Test执行后的H口。?tng) (tng) (tng) (tng)?
(tng) (tng)
〖说明〗如果你正确地安装了(jin)Javaq行环境QJREQ,那么.jar的图标应该是象一늺q有一个A的ŞӞ如同写字板的图标。?tng) (tng) (tng) (tng)?
如果你的.jar文g默认的打开兌不对Q可以重新设|:(x) (tng) (tng) (tng) (tng) (tng)
我的
q按“确定”、“关闭”退出对.jar文g兌的编辑。?tng) (tng) (tng) (tng)?
Q你的javaw.exe文g是不是位于C:\Program (tng) (tng) (tng) Files\Java\j2re1.4.1\bin\路径下,视你自己?sh)脑的情况而定Q?tng) (tng) (tng) (tng)?
我这也是|上的脓(chung)子?
--------------------------------------------------------------- (tng)
JB中生?exe文g (tng)
1、菜单中选择【Wizards】-【Native (tng) Executable (tng) Builder....】弹出对话框 (tng)
2、在弹出的对话框中第一步(Step (tng) 1 (tng) of (tng) 7Q的【Name】输入一个名Uͼq取消【Always (tng) create (tng) archive (tng) when (tng) building (tng) the (tng) project】点凅RNext】?
3、根据需要?zhn)着需要的c,再选择【Include (tng) class (tng) dependencies】,点击【Next】?
4、根据需要?zhn)着需要的库文Ӟ再选择下面?个单?反复所有的需要的库,点击【Next】?
5、默认点凅RNext】?
6、在QStep (tng) 5 (tng) of (tng) 7Q的时候选择一个主c运行点凅RNext】?
7、在QStep (tng) 6 (tng) of (tng) 7Q的时候选择q行q_【Next】?
8、默认点凅RFinish】,q时候在工程的目录窗口出C(jin)一个在QStep (tng) 1 (tng) of (tng) 7Q输入的【Name】目录?
9、右击这个目录,选择【Rebuild....】,Jbuilder开始编译和创徏执行文g或是Jar文g?jin)?
10、等完成之后Q该目录下右几个文gQ一般是有至一个jar文gQ或是一个exe文g (tng)
11、在Window打开工程所在的目录Q就可以看到里面的有几个刚才~译的文件?
12、执行jar是用java (tng) -jar (tng) ***.jar、执行exe直接双击 (tng)
--------------------------------------------------------------- (tng)
1、不使用jb因ؓ(f)打包后,可执行文件的图标改不?jin)且jb的可执行文g实际上是可执行的jar文gQ可以将其exe扩展名改为jar一样可执行。?
2、还是用jsmooth较好Q首先编写menifest文g目的指明mainc,使用jar命o(h)打包成可执行jar文gQ让后用开源的jsmooth做成exe?
使用javamail发送html邮g比较复杂
http://www.52z.com/soft/1644.html
http://down.jdxz.net/downinfo/8080.html
http://www.skycn.com/soft/10940.html
package org.tatan.mail;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import javax.mail.Session;
import javax.mail.MessagingException;
import javax.mail.Transport;
public class SendHtmlMail {
(tng) (tng) (tng) public static void sendMessage(String smtpHost,
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) String from, String to,
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) String subject, String messageText)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) throws MessagingException,java.io.UnsupportedEncodingException {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) // Step 1: (tng) Configure the mail session
(tng) (tng) (tng) (tng) (tng) (tng) (tng) System.out.println("Configuring mail session for: " + smtpHost);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) java.util.Properties props = new java.util.Properties();
(tng) (tng) (tng) (tng) (tng) (tng) (tng) props.setProperty("mail.smtp.auth", "true");//指定是否需要SMTP验证
(tng) (tng) (tng) (tng) (tng) (tng) (tng) props.setProperty("mail.smtp.host", smtpHost);//指定SMTP服务?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) props.put("mail.transport.protocol", "smtp");
(tng) (tng) (tng) (tng) (tng) (tng) (tng) Session mailSession = Session.getDefaultInstance(props);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) mailSession.setDebug(true);//是否在控制台昄debug信息
(tng) (tng) (tng) (tng) (tng) (tng) (tng) // Step 2: (tng) Construct the message
(tng) (tng) (tng) (tng) (tng) (tng) (tng) System.out.println("Constructing message - (tng) from=" + from + " (tng) to=" + to);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) InternetAddress fromAddress = new InternetAddress(from);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) InternetAddress toAddress = new InternetAddress(to);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) MimeMessage testMessage = new MimeMessage(mailSession);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) testMessage.setFrom(fromAddress);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) testMessage.addRecipient(javax.mail.Message.RecipientType.TO, toAddress);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) testMessage.setSentDate(new java.util.Date());
(tng) (tng) (tng) (tng) (tng) (tng) (tng) testMessage.setSubject(MimeUtility.encodeText(subject,"gb2312","B"));
(tng) (tng) (tng) (tng) (tng) (tng) (tng) testMessage.setContent(messageText, "text/html;charset=gb2312");
(tng) (tng) (tng) (tng) (tng) (tng) (tng) System.out.println("Message constructed");
(tng) (tng) (tng) (tng) (tng) (tng) (tng) // Step 3: (tng) Now send the message
(tng) (tng) (tng) (tng) (tng) (tng) (tng) Transport transport = mailSession.getTransport("smtp");
(tng) (tng) (tng) (tng) (tng) (tng) (tng) transport.connect(smtpHost, "webmaster", "password");
(tng) (tng) (tng) (tng) (tng) (tng) (tng) transport.sendMessage(testMessage, testMessage.getAllRecipients());
(tng) (tng) (tng) (tng) (tng) (tng) (tng) transport.close();
(tng) (tng) (tng) (tng) (tng) (tng) (tng) System.out.println("Message sent!");
(tng) (tng) (tng) }
(tng) (tng) (tng) public static void main(String[] args) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) String smtpHost = "localhost";
(tng) (tng) (tng) (tng) (tng) (tng) (tng) String from = "webmaster@mymail.com";
(tng) (tng) (tng) (tng) (tng) (tng) (tng) String to = "mfc42d@sohu.com";
(tng) (tng) (tng) (tng) (tng) (tng) (tng) String subject = "html邮g试"; //subject javamail自动转码
(tng) (tng) (tng) (tng) (tng) (tng) (tng) StringBuffer theMessage = new StringBuffer();
(tng) (tng) (tng) (tng) (tng) (tng) (tng) theMessage.append("<h2><font color=red>q倒霉孩子</font></h2>");
(tng) (tng) (tng) (tng) (tng) (tng) (tng) theMessage.append("<hr>");
(tng) (tng) (tng) (tng) (tng) (tng) (tng) theMessage.append("<i>q年失望q年?lt;/i>");
(tng) (tng) (tng) (tng) (tng) (tng) (tng) try {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SendHtmlMail.sendMessage(smtpHost, from, to, subject, theMessage.toString());
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) catch (javax.mail.MessagingException exc) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) exc.printStackTrace();
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) catch (java.io.UnsupportedEncodingException exc) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) exc.printStackTrace();
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) }
}
邮g?参见RFC822QRFC2047)只能包含US-ASCII字符?br />邮g头中M包含非US-ASCII字符的部分必进行编码,使其只包含US-ASCII字符?br />但是java mail可以Ҏ(gu)JVM发送中文邮件自行编码,Q用它自带的MimeUtilitycȝencodeTextҎ(gu)对中文信息进行编码也可以?br />邮g正文必须有charset=gb2312否则?br />Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit
打开邮gZؕ?讄charset=gb2312?br />Content-Type: text/html;charset=gb2312
Content-Transfer-Encoding: quoted-printable
它不能用MimeUtility里的Ҏ(gu)来编码?br />邮g正文的编码方式的信息是要攑֜Content-Transfer-Encodingq个邮g头参C的,
而MimeUtility里面的方法是编码方式的信息攑֜~码后的正文内容中?br />所以如果你Ҏ(gu)文也用MimeUtilityq行处理Q那么其他邮件程序就不会(x)正常昄你编码的邮gQ?br />因ؓ(f)其他邮g软g如outlook,foxmail只会(x)Ҏ(gu)Content-Transfer-Encodingq个里面的信息来寚w件正文进行解码?/p>
import javax.mail.Session;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import javax.activation.FileDataSource;
import javax.activation.DataHandler;
public class SendAttachMail {
(tng) (tng) (tng) public static void sendMessage(String smtpHost,
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) String from, String to,
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) String subject, String messageText,
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) String fileName)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) throws MessagingException {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) // Step 1: (tng) Configure the mail session
(tng) (tng) (tng) (tng) (tng) (tng) (tng) java.util.Properties props = new java.util.Properties();
(tng) (tng) (tng) (tng) (tng) (tng) (tng) props.setProperty("mail.smtp.auth", "true");//指定是否需要SMTP验证
(tng) (tng) (tng) (tng) (tng) (tng) (tng) props.setProperty("mail.smtp.host", smtpHost);//指定SMTP服务?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) props.put("mail.transport.protocol", "smtp");
(tng) (tng) (tng) (tng) (tng) (tng) (tng) Session mailSession = Session.getDefaultInstance(props);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) mailSession.setDebug(true);//是否在控制台昄debug信息
(tng) (tng) (tng) (tng) (tng) (tng) (tng) // Step 2: (tng) Construct the message
(tng) (tng) (tng) (tng) (tng) (tng) (tng) System.out.println("Constructing message - (tng) from=" + from + " (tng) to=" + to);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) InternetAddress fromAddress = new InternetAddress(from);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) InternetAddress toAddress = new InternetAddress(to);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) MimeMessage testMessage = new MimeMessage(mailSession);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) testMessage.setFrom(fromAddress);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) testMessage.addRecipient(javax.mail.Message.RecipientType.TO, toAddress);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) testMessage.setSentDate(new java.util.Date());
(tng) (tng) (tng) (tng) (tng) (tng) (tng) testMessage.setSubject(subject);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) // (tng) Step 3: (tng) Create a body part to hold the "text" portion of the message
(tng) (tng) (tng) (tng) (tng) (tng) (tng) System.out.println("Constructing 'text' body part");
(tng) (tng) (tng) (tng) (tng) (tng) (tng) MimeBodyPart textBodyPart = new MimeBodyPart();
(tng) (tng) (tng) (tng) (tng) (tng) (tng) textBodyPart.setContent(messageText,"text/html;charset=gb2312");
(tng) (tng) (tng) (tng) (tng) (tng) (tng) // (tng) Step 4: (tng) Create a body part to hold the "file" portion of the message
(tng) (tng) (tng) (tng) (tng) (tng) (tng) System.out.println("Attaching 'file' body part: " + fileName);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) MimeBodyPart fileBodyPart = new MimeBodyPart();
(tng) (tng) (tng) (tng) (tng) (tng) (tng) FileDataSource fds = new FileDataSource("c:\\a.rar");
(tng) (tng) (tng) (tng) (tng) (tng) (tng) fileBodyPart.setDataHandler(new DataHandler(fds));
(tng) (tng) (tng) (tng) (tng) (tng) (tng) fileBodyPart.setFileName(fds.getName());
(tng) (tng) (tng) (tng) (tng) (tng) (tng) System.out.println("Finished attaching file");
(tng) (tng) (tng) (tng) (tng) (tng) (tng) // Step 5: (tng) Create a Multipart/container and add the parts
(tng) (tng) (tng) (tng) (tng) (tng) (tng) Multipart container = new MimeMultipart();
(tng) (tng) (tng) (tng) (tng) (tng) (tng) container.addBodyPart(textBodyPart);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) container.addBodyPart(fileBodyPart);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) // Step 6: (tng) Add the Multipart to the actual message
(tng) (tng) (tng) (tng) (tng) (tng) (tng) testMessage.setContent(container);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) System.out.println("Message constructed");
(tng) (tng) (tng) (tng) (tng) (tng) (tng) // Step 7: (tng) Now send the message
(tng) (tng) (tng) (tng) (tng) (tng) (tng) Transport transport = mailSession.getTransport("smtp");
(tng) (tng) (tng) (tng) (tng) (tng) (tng) transport.connect(smtpHost, "webmaster", "password");
(tng) (tng) (tng) (tng) (tng) (tng) (tng) transport.sendMessage(testMessage, testMessage.getAllRecipients());
(tng) (tng) (tng) (tng) (tng) (tng) (tng) transport.close();
(tng) (tng) (tng) (tng) (tng) (tng) (tng) System.out.println("Message sent!");
(tng) (tng) (tng) }
(tng) (tng) (tng) public static void main(String[] args) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) String fileName = "a.rar";
(tng) (tng) (tng) (tng) (tng) (tng) (tng) String smtpHost = "localhost";
(tng) (tng) (tng) (tng) (tng) (tng) (tng) String from = "webmaster@mymail.com";
(tng) (tng) (tng) (tng) (tng) (tng) (tng) String to = "mfc42d@sohu.com";
(tng) (tng) (tng) (tng) (tng) (tng) (tng) String subject = "html邮g附g试"; //subject javamail自动转码
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) StringBuffer theMessage = new StringBuffer();
(tng) (tng) (tng) (tng) (tng) (tng) (tng) theMessage.append("<h2><font color=red>q倒霉孩子</font></h2>");
(tng) (tng) (tng) (tng) (tng) (tng) (tng) theMessage.append("<hr>");
(tng) (tng) (tng) (tng) (tng) (tng) (tng) theMessage.append("<i>q年失望q年?lt;/i>");
(tng) (tng) (tng) (tng) (tng) (tng) (tng) try {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SendAttachMail.sendMessage(smtpHost, from, to, subject, theMessage.toString(), fileName);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) catch (javax.mail.MessagingException exc) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) exc.printStackTrace();
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) }
}
强烈推荐proxoolQ因Z不但可以监控后台。还可以有效的释放连接。在connection closeӞ也就是归qconnectionQ?br>关闭所有的statementQƈ且判断是否autocommitQ如果不行,rollbackQƈ且设|trueQ?br>可以参考proxool的org.logicalcobwebs.proxool.ConnectionResetterc?br>connection pool把connection reset|回initial state?br>dbcp的配|?br><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${db.driverClassName}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
<property name="validationQuery">
<value>SELECT 1</value>
</property>
<property name="testOnBorrow">
<value>true</value>
</property>
</bean>
c3p0的配|, 注意?'driverClass' , 'jdbcUrl', 'user' , 'password'
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="jdbcUrl">
<value>jdbc:oracle:thin:@218.202.151.179:58580:ORA9I</value>
</property>
<property name="user">
<value>oa</value>
</property>
<property name="password">
<value>XXXX</value>
</property>
<property name="minPoolSize">
<value>15</value>
</property>
<property name="acquireIncrement">
<value>5</value>
</property>
<property name="maxPoolSize">
<value>25</value>
</property>
?/p>
<bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass">
<value>${db.driverClass}</value>
</property>
<property name="jdbcUrl">
<value>${db.url}</value>
</property>
<!--
<property name="user">
<value>${db.user}</value>
</property>
<property name="password">
<value>${db.pass}</value>
</property>
-->
<property name="properties">
<props>
<prop key="c3p0.acquire_increment">5</prop>
<prop key="c3p0.idle_test_period">100</prop>
<prop key="c3p0.max_size">100</prop>
<prop key="c3p0.max_statements">0</prop>
<prop key="c3p0.min_size">10</prop>
<prop key="user">${db.user}</prop>
<prop key="password">${db.pass}</prop>
</props>
</property>
</bean>
xapool的配|?br> <bean id="dataSource" class="org.enhydra.jdbc.pool.StandardPoolDataSource" destroy-method="stopPool">
<constructor-arg index="0">
<bean class="org.enhydra.jdbc.standard.StandardConnectionPoolDataSource">
<property name="driverName"><value>com.mysql.jdbc.Driver</value></property>
<property name="url"><value>jdbc:mysql://localhost/dbname</value></property>
</bean>
</constructor-arg>
<property name="user"><value>root</value></property>
<property name="password"><value>mypass</value></property>
<property name="minSize"><value>1</value></property>
<property name="maxSize"><value>5</value></property>
<property name="jdbcTestStmt"><value>select 1</value></property>
</bean>
c-jdbc的配|?br><bean id="dataSource" class="org.objectweb.cjdbc.driver.DataSource">
<property name="url"><value>jdbc:cjdbc://127.0.0.1:25322/vdb?user=vuser</value></property>
</bean>
weblogic的连接池解决办法:Test Reserved Connections: 如果选择?jin)这个选项Q服务器?x)在把连接提供给客户端之?br>对其q行试?Test Created Connections: 如果选择?jin)这个选项Q就?x)在创徏一个JDBC
q接之后和在把它d到JDBCq接池中的可用连接列表之前,对该JDBCq接q行试?/p>
tomcat的jndi关于dbcp的配|?
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>com.sybase.jdbc2.jdbc.SybDriver</value>
</parameter>
<parameter>
<name>url</name>
<value>xyz</value>
</parameter>
<parameter>
<name>username</name>
<value>xyz</value>
</parameter>
<parameter>
<name>password</name>
<value>xyz</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>5</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>5</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>-1</value>
</parameter>
<parameter>
<name>removeAbandoned</name>
<value>true</value>
</parameter>
<parameter>
<name>validationQuery</name>
<value>select count(*) from sometable where 1 = 0</value>
</parameter>
<parameter>
<name>testOnBorrow</name>
<value>true</value>
</parameter>
=================================================================
<hibernate-configuration>
<session-factory>
<!-- 是否运行期生成的SQL输出到日志以供调?-->
<property name="hibernate.show_sql">
true
</property>
<!-- SQL 方言-->
<property name="hibernate.dialect">
org.hibernate.dialect.SQLServerDialect
</property>
<!-- 数据库用?-->
<property name="hibernate.connection.username">
sa
</property>
<!-- 数据库密?-->
<property name="hibernate.connection.password">
123456
</property>
<!-- 数据?JDBC 驱动-->
<property name="hibernate.connection.driver_class">
com.microsoft.jdbc.sqlserver.SQLServerDriver
</property>
<!-- 数据?URL -->
<property name="hibernate.connection.url">
jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=hbdb
</property>
<!-- 事务理cd -->
<!-- Hibernate 3 对包名做?jin)修?Q?net.sf.hibernate => org.hibernate Q?->
<property name="hibernate.transaction.factory_class">
org.hibernate.transaction.JDBCTransactionFactory
</property>
<!-- c3p0 q接?-->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.max_size">2</property>
<property name="hibernate.c3p0.min_size">2</property>
<property name="hibernate.c3p0.timeout">50000</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.validate">false</property>
<!-- 映射的配|文Ӟ对应数据库表 KELA_STUDENT 的映文Ӟ在后面将看到q个文g的配|?-->
<mapping resource="com/kela/hb/pojo/KelaStudent.hbm.xml"/>
</session-factory>
</hibernate-configuration>