标签归档:java

Tomcat生产优化

1 建立JNDI;打开$TOMCAT_HOME/conf/context.xml,添加如下

<!--MySQL-->
    <Resource 
           name="jdbc/market" 
           auth="Container" 
           type="javax.sql.DataSource"
           maxActive="100" 
           maxIdle="30" 
           maxWait="10000"
           username="develop" 
           password="xxxxxx" 
           driverClassName="com.mysql.jdbc.Driver"
           url="jdbc:mysql://mysql:3306/market"
    />

<!--SQL Server-->

    <Resource 
           name="jdbc/market" 
           auth="Container" 
           type="javax.sql.DataSource"
           maxActive="100" 
           maxIdle="30" 
           maxWait="10000"
           username="sa" 
           password="xxxxxx" 
           driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
           url="jdbc:sqlserver://sqlserver:1433;DatabaseName=market"
    />

2 优化连接数及压缩选项;打开$TOMCAT_HOME/conf/server.xml,替换如下代码:

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8"
               maxThreads="250" maxHttpHeaderSize="8192"
               disableUploadTimeout="true"
               acceptCount="440" emptySessionPath="true"
               enableLookups="false"
               compression="500" compressableMimeType="text/html,text/xml,text/plain,application/octet-stream"/>

3 优化JVM;打开$TOMCAT_HOME/bin/catalina.cmd(catalina.sh),在最上面添加如下

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8
-server -Xms2048m -Xmx2048m
-XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m
-XX:MaxPermSize=512m -XX:+DisableExplicitGC"

4 修改Spring的连接,打开applicationContext.xml,修改如下:

<jee:jndi-lookup jndi-name="jdbc/market" id="dataSource"></jee:jndi-lookup>

Java正则类

之前一直研究正则的内容,一直忽略java的类,最近由于需要经常用到,把代码记录下来:

 

String line = “This order was placed( iOS 10.3.1;) for QT3000! OK?”;
String pattern = “iOS ([^;]*);”;

Pattern r = Pattern.compile(pattern);

Matcher m = r.matcher(line);
if (m.find()) {
System.out.println(“Found value: ” + m.group(0));
System.out.println(“Found value: ” + m.group(1));
} else {
System.out.println(“NO MATCH”);
}

Struts 获取request中inputStream的问题

问题:如果使用了Struts2,如下代码提交的http post请求会获取不到数据

    ...
    url = new URL(path);
    conn = (HttpURLConnection) url.openConnection();
    conn.setDoOutput(true);
    OutputStream os = conn.getOutputStream();
    os.write(param.getBytes(charsetName));
    os.flush();
    os.close();
    input = conn.getInputStream();
    ...

Struts2中的读取代码如下:

    ...
    ServletInputStream is = request.getInputStream();
    String result = TohoursUtils.inputStream2String(is);
    super.printToHtml("result:" + result);
    ...

这样调用一直会出现空白,但使用POSTMAN调用会打出结果,什么原因?

于是使用wireshark查了一下,http请求默认使用Content-Type: application/x-www-form-urlencoded,而POSTMAN由于提交的都字符串,所以使用的是Content-Type: plain/text,于是在OutputStream write前,增加conn.setRequestProperty("Content-Type", "plain/text");就可以了

原因:是由于Struts拦截了所有的http请求,如果是x-www-form-urlencoded则要处理成Action变量;这就是说Struts框架中已经将inputStream读走了,而inputStream只能读一次,所以后面就读取不到了

Tomcat 7内存配置

网上查的到配置都是需要找catalina,然后在里面的JAVA_OPTS=”-Xms512m -Xmx1024m”进行设置,但我使用了service.bat将tomcat安装成了服务,在哪里设置?

其实查看service.bat就有了发现,service.bat是运行的tomcat7.exe,而我们知道,tomcat7.exe执行是靠tomcat7w.exe来设置JVM变量的

image于是,双击tomcat7w.exe,将对应的memory pool设置成相应的值就可以了;这里可以看出,Java Option也是在这里设置的

image

win7程序开发时连ftp时出错

一直以为是自己的机器不好,然后,就没有再解决的心情了。

今天帮另一朋友装了机器,新系统,新开发环境,新ftp,同样的代码,连接起来没什么问题,感觉很爽。但为什么我的一直有问题呢,然后想想自己装系统又遥遥无期,于是就想把这个问题解决一下,一定有症结所在。果然,今天一试,连接本地的ftp也会报同样的错误,这就让我相信不是网络的问题,应该是本机上的某个软件的问题,但第一次解决的时候已经将防火墙都禁用过了,好像也没什么效果。但今天还是再试一次,禁用所有防火墙,结果竟然可以了。于是苦苦找防火墙哪条规则跟我的ftp访问冲突了,结果没人能回答

java.net.SocketException: Software caused connection abort: recv failed

果然最后解决我问题的还是stackoverflow,竟然是win7防火墙的一个BUG http://stackoverflow.com/questions/10166337/ftp-error-while-downloading-uploading-with-ftp4j-library-in-java-application

执行下列两项操作的任一一项就可以了:

  • 以管理员身份在cmd下运行如下命令:netsh advfirewall set global StatefulFtp disable
  • 以如下参数运行JVM : -Djava.net.preferIPv4Stack=true

NanoHTTPD.java

在使用jquery.validationEngine的时候,看到其github上有相关java测试的代码,包括了一个NanoHTTPD.java来模拟http响应,虽然里面的原来还不是太清楚,但无疑,如果弄明白他可以让我们更进一步了解http和socket程序的关系,能够看清http的原理

github地址:https://github.com/posabsolute/jQuery-Validation-Engine

(待续)

struts标签include页面不能显示

使用struts2标签<s:include value=”bottom.jsp” />始终不能显示,但上面的<s:include value=”top.jsp” />能够正常显示,让我查了好久,原来是在bottom.jsp使用了一个标签,但语法错了,将value写成了vlaue,所以不能正常加载

这个错误浪费了我至少30分钟时间

convention-plugin struts2 零配置

相对于是其他语言来说,java的轮子实在太多了,好用的不好用的一股脑的全部上来。能用的不能用了,只要你用在了你的项目里面,就说明你牛B。struts + spring + hibernate虽然已经成为现在java开发的主流,但我却一点也不敢苟同,其学习成本高,开发效率低下,开发出来的东西速度没保证,安全性也不能得到明示提高,实在搞不明白,因为一个小功能,其他语言一天能搞定的事情,要花一周的时间拱框架,再花一周的时间开发,开发出来的功能经过测试性能又达不到!

我们现在关注的地方应该有所转变了,我认为主要有两点需要提高,中间跳来跳去的环节都免了吧:

1、提高安全性,无论数据库注入的安全性,还是XSS跨站的安全性,在开发中应该让我们多注意这些方面的东西。

2、提高用户使用的舒适度,UI的提升也是必不可少的一个环节。

也许很多人会说,没框架不能协同,没框架不能很好完成大型项目开发,但我觉得,只要有一套良好的代码规范,并且所有开发人员都按照这个规范去做,无论用什么语言,开发多么大型的项目,所得到的结果都是良好的。为了代码的安全性与可回溯性,版本控制软件也必不可少。

今天接后一同事的项目,要在这个项目上改造成另外一个项目,并提供给别人使用,SSH框架,理论上来说整个开发过程应该还是比较熟悉的,唯一不知道的是他使用了convention-plugin实现struts的零配置,0配置就代码你使用默认配置,这就导致了我在配置文件里面找不到他页面跳转的路径。当然,查看他的jsp主目录很快就能看出其中的规律,但不知道他的默认配置写到那个地方还是让我心里有点不舒服。

于是google了一下其默认路径WEB-INF/content才知道,原来这是convention-plugin的功能,其配置当然在其jar包里,对开发人员是透明的,当然你也可以在struts.xml里面修改其默认配置。

java编译总结

环境配置
java_home           c:\Program Files\Java\jdk1.6.0\
classpath             %java_home%\lib\tools.jar;.;
path                    %java_home%\bin;

命令编译
javac -d . *.java //按包编译
java com.wondersgroup.Test //带包名执行
java -classpath D:\class12.jar; com.wondersgroup.Test //引入其他包执行

在我的备忘记录里面一直保存着这样的几个用法,当然我们谈论的都是windows的用法;今天在学习sphinx中java示例代码的时候,又有新的发现,更加自动的生成jar文件和更加自动的生成javadoc的方法,非常的简单,将代码贴在下面分析:

mk.cmd
@echo off
javac -cp . -d . *.java
jar cfm sphinxapi.jar MANIFEST.MF org/sphx/api

mkdoc.cmd
@javadoc *.java -d doc

其中javac –cp . –d . *.java跟我记录的java –classpath D:\class12.jar com.wondersgroup.Test中的classpath是一样的,只不过,这里是在编译阶段,将本包中的所有类作为classpath,带包名编译后放在本目录中;

jar cfm sphinxapi.jar MANIFEST.MF org/sphx/api最终目的是生成sphinxapi.jar;,其中已知条件是MANIFEST.MF和org/sphx/api,将其封装成sphinxapi.jar再执行;参数c表示创建新的归档文件;参数f指定归档文件名;m包含MANIFEST.MF;

MF文件如下(最后一行有回车):

Manifest-Version: 1.0
Main-Class: org.sphx.api.test

这样在执行的时候,就能找到入口地址了;jar包的执行方法

java –jar sphinx.jar test

最后一个test是作为参数传递给入口函数的;

当然,根据上次提到的服务,也可以把最后一条命令做成服务,且在开机时就启动;