java小技巧随记

1.hibernate,update属性:

更新用户信息时,因为不含修改password,所以每次更新数据库时,都抛出password列不能为空的异常。

我们可以使用属性update=”false“,应用在property上,该列在update操作中将永远不会更新。

例子:<property name=”password” column=”password” update=”false” />

还有一个属性dynamic-update=”true“,应用在class上,这样在更新该实例时将生成动态的update语句,如果更新时某属性值未发生变化,就不会加入到update语句中。

例子:<class name=”com.opzoon.license.domain.User” table=”t_user” dynamic-update=”true”>…</class>

但此属性用在这里不能实现我的目的。还在研究中。。。

注:hibernate中还有insert跟update类似,但dynamic-insert是忽略null值,将是null的属性不添加到insert语句中。

2.spring,@RequestBody:

使用@RequestBody时,要引入org.codehaus.jackson。否则不能转换json类型的参数,而且不会提示缺少该jar包。

另外,要将json转换bean时,http的Content-Type为application/json。

3.spring,@PostConstruct:

(1)tomcat启动时会调用标有该注解的方法。

(2)该方法的类上要有@Service,并且该方法为public。

4.java不常用到得关键字:

1.transient:标记为transient的变量,在对象存储时,这些变量状态不会被持久化。当对象序列化的保存在存储器上时,不希望有这些字段数据被保存,为了保证安全性,可以把这些字段声明为transient。

2.volatile:在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。

5.jsp配置异常页面:

<error-page>
    <exception-type>xxx.xxx.xxx.xxx.Exception</exception-type>
    <location>/error.jsp</location>
</error-page>

6.spring.xml配置文件的命名空间:

在spring.xml配置文件中,有主要命名空间和普通命名空间之分。

主要命名空间的配置为xmlns=”…”。配置之后,下面的配置文件中用到该命名空间,都可以省略。

普通命名空间的配置为xmlns:param=”…”。配置之后,配置文件中用到该命名空间时不可省略,使用方式为<param:tag>…</param:tag>。其中,param可任意起名。

例如:主要命名空间为beans的话:

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:beans="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd">
    <security:http>
        ...
    </security:http>
</beans>

主要命名空间为security的话:

<bean:beans xmlns="http://www.springframework.org/schema/security" xmlns:bean="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd">
    <http>
        ...
    </http>
</bean:beans>

7.maven项目打包时,不打包*.hbm.xml文件:

解决方法:

<build>
    <finalName>xxx</finalName>
    <resources>
      <resource>
          <directory>src/main/java</directory>
          <includes>
              <include>**/*.hbm.xml</include>
          </includes>
      </resource>
      <resource>
          <directory>src/main/resources</directory>
          <includes>
              <include>**/*.xml</include>
              <include>**/*.properties</include>
          </includes>
      </resource>
  </resources>
</build>

8.CDATA:

xml文件中,用CDATA可以放入非法的字符:

<![CDATA[ ]]>

9.Spring读取.properties文件的方法:

<!-- 1 -->
<bean id="propertyConfiger" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
     <property name="location" value="database.properties"></property>
</bean>
<!-- 2 -->
<context:property-placeholder location="classpath:database.properties" />
<!-- 3 -->
<bean id="propertyConfiger" class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
     <property name="location" value="database.properties"></property>
</bean>
<!-- 4 -->
<context:property-override location="classpath:database.properties" />

以上的方式可以用以下方法读取配置的属性:

<property name="username" value="${username}" />

还有一种方式如下:

<!-- 5 -->
<util:properties id="database" location="classpath:database.properties" />

读取方式也与上面不同:

<property name="username" value="#{database['username']}" />

10.servlet接收js传递的数组:

String[] names = request.getParameterValues(“names[]”);

[]表示的是接收的是一个数组,必须写。如果不写,则接收到的只有一个元素,是所有数组连接成的字符串。

11.java中的正则表达式:

在正则表达式中,\表示的是转义字符,如果要匹配真正的字符串’\’,需要将其转义,用\\来匹配字符串”\”。

而在java中,\也是转义字符,所以字符串中的\要写成”\\”。

所以,正则表达式中的\\表示\,java字符串中的\\表示\。以此类推,java字符串表示的正则表达式中\\\\表示\。

例如:我要把字符串中的单斜线替换成双斜线:

str.replaceAll("\\\\", "\\\\\\\\");

12.tomcat支持带中文的url:

在tomcat中的server.xml中的Connector中添加两个设置:

useBodyEncodingForURI=”true” //设置POST和GET使用相同编码

URIEncoding=”UTF-8″ //对URI使用utf-8编码处理

13.spring获取web根目录:

在web.xml中的<web-app>节点内加入:

<context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>XXXX</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.util.WebAppRootListener</listener-class>
</listener>

然后就可以用System.getProperty(“XXXX”)获取了web根目录了。

14.占位符的使用:

MessageFormat.format(“aaa{0}bbb{1}ccc{2}”, “this is 0”, “this is 1”, “this is 2”);

15.maven配置jdk的版本:

(1)修改settings.xml,全局修改

<profiles>
    <profile>
        <id>jdk-1.8</id>
        <activation>
            <activeByDefault>true</activeByDefault>
            <jdk>1.8</jdk>
        </activation>
        <properties>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
            <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
        </properties>
    </profile>
</profiles>

(2)修改pom.xml,单个项目修改

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.2</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
    </configuration>
</plugin>

16.java保留两位小数的4种方法

public class RoundOff {
    double num = 111231.5585;
    public void m1() {
        BigDecimal bg = new BigDecimal(num);
        System.out.println(bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
    }
    /**
     * DecimalFormat转换最简便
     */
    public void m2() {
        DecimalFormat df = new DecimalFormat("#.00");
        System.out.println(df.format(num));
    }
    /**
     * String.format打印最简便
     */
    public void m3() {
        System.out.println(String.format("%.2f", num));
    }
    public void m4() {
        NumberFormat nf = NumberFormat.getNumberInstance();
        nf.setMaximumFractionDigits(2);
        System.out.println(nf.format(num));
    }
    public static void main(String[] args) {
    	RoundOff ro = new RoundOff();
    	ro.m1();
    	ro.m2();
    	ro.m3();
    	ro.m4();
    }
}

17.java获取时间段内所有日期

public class DateUtils {
    public static List<Date> findDates(Date dBegin, Date dEnd) {
        List<Date> lDate = new ArrayList<Date>();
        lDate.add(dBegin);
        Calendar calBegin = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calBegin.setTime(dBegin);
        Calendar calEnd = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calEnd.setTime(dEnd);
        // 测试此日期是否在指定日期之后
        while (dEnd.after(calBegin.getTime())) {
            // 根据日历的规则,为给定的日历字段添加或减去指定的时间量
            calBegin.add(Calendar.DAY_OF_MONTH, 1);
            lDate.add(calBegin.getTime());
        }
        return lDate;
    }
    public static void main(String[] args) throws Exception {
        String start = "2014-02-01";
        String end = "2014-03-02";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date dBegin = sdf.parse(start);
        Date dEnd = sdf.parse(end);
        List<Date> lDate = findDates(dBegin, dEnd);
        for (Date date : lDate) {
            System.out.println(sdf.format(date));
        }
    }
}

18.java生成指定范围内的随机数

public class NumberUtils {
	public static int random(int min, int max) {
		Random random = new Random();
		return random.nextInt(max+1) % (max-min+1) + min;
	}
	public static void main(String[] args) {
		System.out.println(random(10, 20));
	}
}

19.maven install 跳过单元测试

方法一:
mvn install -DskipTests 这种不执行测试用例,但会编译测试用例。相当于pom里的如下配置:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <skip>true</skip>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

方法二:
mvn install -Dmaven.test.skip=true 这种不会执行测试用例,也不会编辑测试用例。相当于pom里的如下配置:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <skip>true</skip>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <skip>true</skip>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

20.给int数字前补0,生成字符串

String.format(“%08d”, i):在int i前补0,生成八位数字的字符串

21.System.exit(status)

结束正在运行的java虚拟机。System.exit(0)表示正常退出程序,status非0表示非正常退出,多用于catch中。

22.Java集合转成Scala集合

import scala.collection.JavaConversions._

23.Java Daemon Thread(守护线程)

所谓守护线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。将线程转换为守护线程可以通过调用Thread对象的setDaemon(true)方法来实现。

24.下载maven项目的依赖jar包

mvn dependency:copy-dependencies -DoutputDirectory=lib

 

1 Reply to “java小技巧随记”

发表评论