水仁博客

上善若水,仁恕载物
随笔 - 11, 文章 - 0, 评论 - 4, 引用 - 0
数据加载中……

2008年1月13日

SpringMVC 2.5 的HelloWorld

首先,写一个Bean

package springmvc.one.web;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/hellOne.act")
public class HelloOneAction { 

@RequestMapping
public String handleRequest(String user,Model model) { 
System.out.println("用户名:"+user); //GET/POST的入参
model.addAttribute("user", user); //通过Session返回到界面的出参
model.addAttribute("helloWord", "Hello");

return "hellouser";

}


再写一个JSP页面hellouser.jsp,此页面放在 WEB-INF/jsp 目录下,代码如下:

<html> 
<head><title>HelloPage</title></head> 
<body> 
Test this sample!
<H1> ${helloWord}, ${user}!</H2> 
</body>
</html>


接着看看web.xml的配置

<?xml version="1.0" encoding="ISO-8859-1"?> 

<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<description>Spring 2.5 App</description> 
<display-name>Spring App Examples</display-name> 

<servlet> 
<servlet-name>annomvc</servlet-name> 
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup> 
</servlet> 

<servlet-mapping> 
<servlet-name>annomvc</servlet-name> 
<url-pattern>*.act</url-pattern> 
</servlet-mapping> 

</web-app>


最后就是,annomvc.xml 文件了。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">

<context:component-scan base-package="springmvc.one.web"/>

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>

</beans>


好了,见一个Tomcat工程,在 tomcat 中运行,访问下面连接,就可以运行了。

http://localhost:8080/TOMCAT-PROJECT/hellOne.act?user=gjhuai

posted @ 2008-09-27 14:31 水仁圭 阅读(3472) | 评论 (1)编辑 收藏

[专业]JS一些知识-0806081757


JS的日期加减函数:

function dateAdd(date,dayNum){
var a = date.valueOf();
a = a + dayNum * 24 * 60 * 60 * 1000;
a = new Date(a);
return a;
}


JS把字符串装载到DOM对象:
var doc = new ActiveXObject("MSxml2.DOMDocument");
doc.loadXML( xmlStr);


当JS的正则表达式的pattern需要动态构造时,需要使用RegExp类:
patt=new RegExp(today.replace(/\-/g,"\\-")+"((.|\n|\r|\t)+)"+yesterday.replace(/\-/g,"\\-"),"gm");
//patt=new RegExp("2008\-5\-26((.|\n)+)2008\-5\-25","gm");
h = h.replace(patt,yesterday);
而不能使用/dd/gm之类简单的pattern




posted @ 2008-06-08 17:58 水仁圭 阅读(226) | 评论 (0)编辑 收藏

[专业]Python读gbk编码的xml问题-0806072220


Python读xml时,如果编码不是utf-8或utf-16,就出错,如下:


...

解析这个xml文件代码如下:
from xml.dom import minidom
f = minidom.parse('f:\\temp\\protocol.xml')
print f.toxml()

出现这个错误:
xml.parsers.expat.ExpatError: unknown encoding:


解决办法:

由于xml协会规定,所有xml解析器均需要支持utf-8和utf-16两种编码而不要求别的编码,所以我估计python提供的xml处理模块就是不支持gb2312的。而windows下的文件,大部分均为gb2312编码的,因此处理的时候,就会带来不方便的地方。

解1:利用UltraEdit等工具,将xml文件转换成UTF-8的,然后encoding="utf-8"即可
转换工具如果没有,用python可以简单写一个,比如
(以下代码转自 http://tenyears.cn/?cat=6 )
----------
# -*- coding: mbcs -*-
import codecs
f = codecs.open(‘D:\\normal.txt’, ‘rb’, ‘mbcs’)
text = f.read().encode(‘utf-8′)
f.close
f = open(‘d:\\utf8.txt’, ‘wb’)
f.write(text)
f.close()
print text.decode(‘utf-8′).encode(‘gb2312′)
-----------------

解2:xml文件里面不要写入encoding,保持为gb2312本地编码,然后程序解析的时候,采用语句
unicode(file('f:\\temp\\a.txt', 'r', 'gb2312').read(),'gb2312').encode('utf-8')
将整个文件转成utf-8的 String 来处理,处理结束后,利用
unicode(string,'utf-8').encode('gb2312')
换成本地的gb码,再将结果写回文件。

另外,python2.4的普通函数处理字符串的时候,好像已经支持各种编码了。


posted @ 2008-06-07 22:22 水仁圭 阅读(3161) | 评论 (0)编辑 收藏

[专业]代码阅读的经验-0806072109


由于工作上的原因,我不得不看大量别人写的代码,这是一件很痛苦的事,尤其是看既少文档注释,又无良好命名和结构的代码.

有本书叫Code Reading,中文译作代码阅读方法与实践, 简单浏览了一遍电子文档, 感觉还是隔靴搔痒, 对提高代码阅读效率并无太大的帮助. 自己感觉还是以下方法有些帮助:
1. 把对代码阅读的认识用笔或wiki记下来, 最好根据功能结构分类,可画些辅助理解的框图或思维导图
2. 利用UML工具反向生成些类图,包图, 还可自己动手画一些流程图,时序图和协作图
3. 利用调试工具,通过设断点,单步调试,设观察哨等手段看看到底它是怎么运行的
4. 写一些简单的测试程序,通过断言,日志来验证自己的判断
5. 如有可能,和代码的原作者或其他维护者一起做Code Review


posted @ 2008-06-07 21:11 水仁圭 阅读(233) | 评论 (0)编辑 收藏

Spring 集成测试

8.3.1. Context管理和缓存


Spring 中的包 spring-mock.jar 为集成测试提供了一流的支持。所有相关的API在包 org.springframework.test 中,它们不依赖于任何应用服务器或者其他部署环境。

test包里的各种抽象类提供了如下的功能:
  • 各测试案例执行期间的Spring IoC容器缓存。
  • 测试fixture自身的依赖注入。
  • 适合集成测试的事务管理。
  • 继承而来的对测试有用的各种实例变量。

test包对加载的Context提供缓存,缓存功能是通过 AbstractDependencyInjectionSpringContextTests 类的一个方法(如下)实现的,此方法提供contexts xml的位置,且实现这个方法的类必须提供一个包含XML配置文件位置数组。缺省情况下,一旦加载后,这些配置将被所有的测试案例重用。

protected abstract String[] getConfigLocations();

当配置环境受到破坏,AbstractDependencyInjectionSpringContextTests 的 setDirty() 方法可以用来重新加载配置,并在执行下一个测试案例前重建application context。

8.3.2. 测试fixture的依赖注入

AbstractDependencyInjectionSpringContextTests 类将从getConfigLocations()方法指定的配置文件中自动查找你要测试的类, 并通过Setter注入该类的实例。

简单例子

public class HibernateTitleDaoTests extends AbstractDependencyInjectionSpringContextTests {

// 被测试类的实例将被(自动的)依赖注入
private HibernateTitleDao titleDao;

// 一个用来实现'titleDao'实例变量依赖注入的setter方法
public void setTitleDao (HibernateTitleDao titleDao) {
this.titleDao = titleDao;
}

public void testLoadTitle() throws Exception {
Title title = this.titleDao.loadTitle(new Long10));
assertNotNull(title);
}

//指定Spring配置文件加载这个fixture
protected String[] getConfigLocations() {
return new String[] { "classpath:com/foo/daos.xml" };
}

}

getConfigLocations() 使用的是 根据类型的自动装配(autowire byType)来注入的,所以如果你有多个bean都定义为一个类型,则对这些bean你不能用这个方法。在这种情况下你要使用 applicationContext 实例变量,并且使用 getBean() 来进行显式查找。

如果你的测试案例不使用依赖注入,只要不定义任何setters方法即可; 或者你可以继承 org.springframework.test.AbstractSpringContextTests 类,它只包括用来加载Spring Context的便利方法,并且在测试fixture中不进行依赖注入。

8.3.3. 事务管理

测试对持久存储的数据会有改动。类 AbstractTransactionalDataSourceSpringContextTests 在缺省情况下,对每一个测试案例,他们创建并且回滚一个事务。所以使用这个类就不用担心数据被修改;它依赖于Application Context中定义的一个bean PlatformTransactionManager。

如果你确实想在测试时修改数据,可以用这个类的 setComplete() 方法,这将提交而不是回滚事务。另外, endTransaction() 方法可以在测试结束前中止事务。

8.3.4. 方便的变量

AbstractDependencyInjectionSpringContextTests 类提供了两个保护属性性实例变量:

  • applicationContext (a ConfigurableApplicationContext): 可以利用它进行显式bean查找,或者作为一个整体来测试这个Context的状态。
  • jdbcTemplate : 对确定数据状态的查询很有用。

8.3.5. 示例

Spring的PetClinic实例展示了这些测试超类的用法

public abstract class AbstractClinicTests extends AbstractTransactionalDataSourceSpringContextTests {

protected Clinic clinic;

public void setClinic(Clinic clinic) {
this.clinic = clinic;
}

public void testGetVets() {
Collection vets = this.clinic.getVets();
assertEquals('JDBC query must show the same number of vets',
jdbcTemplate.queryForInt('SELECT COUNT(0) FROM VETS'),
vets.size());
Vet v1 = (Vet) EntityUtils.getById(vets, Vet.class, 2);
assertEquals('Leary', v1.getLastName());
assertEquals(1, v1.getNrOfSpecialties());
assertEquals('radiology', ((Specialty) v1.getSpecialties().get(0)).getName());
Vet v2 = (Vet) EntityUtils.getById(vets, Vet.class, 3);
assertEquals('Douglas', v2.getLastName());
assertEquals(2, v2.getNrOfSpecialties());
assertEquals('dentistry', ((Specialty) v2.getSpecialties().get(0)).getName());
assertEquals('surgery', ((Specialty) v2.getSpecialties().get(1)).getName());
}

JdbcTemplate 变量用于验证被测试的代码是否正确。JdbcTemplate 让测试更严密,且减少了对测试数据的依赖。例如,可以在不中止测试的情况下在数据库里增加额外的数据行。

PetClinic应用支持四种数据访问技术--JDBC、Hibernate、TopLink和JPA ,因此 AbstractClinicTests 类不指定Context位置,这个操作在子类中实现:

例如,用Hibernate实现的PetClinic测试包含如下方法:

public class HibernateClinicTests extends AbstractClinicTests {

protected String[] getConfigLocations() {
return new String[] {
'/org/springframework/samples/petclinic/hibernate/applicationContext-hibernate.xml'
};
}
}

8.3.6. 运行集成测试

集成测试比单元测试更依赖于测试环境,它是测试的一个补充,而不是代替单元测试的。这种依赖主要指完整数据模型的数据库。也可以通过DbUnit或者数据库工具来导入测试数据。

posted @ 2008-01-13 21:57 水仁圭 阅读(1443) | 评论 (0)编辑 收藏