本着尽量轻量级、尽量少依赖的原则选择了这一组合。主要思路是前端jquery以getJSON取得数据,然后展示,减少页面刷新,减少jsp的使用,数据层根据需要选择ibatis或hibernate什么的。
ibatis的配置就不贴了,下面是spring的主要配置,用了annotation,需要配置的也少。
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="WEB-INF/config/SqlMapConfig.xml" />
</bean>
<bean id="personDao" class="net.dao.PersonDao">
<property name="sqlMapClient" ref="sqlMapClient" />
</bean>
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" >
<property name="mediaTypes">
<map>
<entry key="json" value="application/json"/>
</map>
</property>
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
</list>
</property>
</bean>
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="order" value="1" />
</bean>
三个java类代码很简单,表达主要意思就行了
public class PersonDao extends SqlMapClientDaoSupport {
//也不想做三层,表示一下,自己取舍吧
}
@Service("personService")
public class PersonServiceImpl implements PersonService {
@Autowired
private PersonDao personDao;
//调一个定义好的查询sql
public List findByLastName(String lastName) {
return personDao.getSqlMapClientTemplate().queryForList("getPerson");
}
}
@Controller
@RequestMapping("/person/**")
public class PersonController {
@Autowired
private PersonService personService;
@RequestMapping(value = "/person/{id}", method = RequestMethod.GET)
public String show(@PathVariable("id") Long id, ModelMap modelMap) {
Assert.notNull(id, "Identifier must be provided.");
modelMap.addAttribute("person", personService.findByLastName(id.toString()));
return "person/show";
}
}
web.xml里配置DispatcherServlet 映射*.json请求,jquery请求返回json对象。imList可以生成表格、下拉列表等。jqgrid比jquery都大了,如果只是显示一下,就用这个只有几K的小插件吧。(IE8有点问题,要自己改一下)
<html>
<head>
<meta http-equiv = "content-type" content = "text/html; charset=UTF-8" />
<script language="javascript" type="text/javascript" src="jquery.js"></script>
<script id="source" language="javascript" type="text/javascript">
$(function() {
$.getJSON("person/12.json", null, function(json){
var result = json.person;
//展示数据
});
});
</script>
</head>
<body>
<div id="mytb"></div>
</body>
</html>
2010-1-26补充:
通过如下配置可以约定按首字母小写类名去掉Controller加方法名来实现url映射,不用在类里面写url了,配置进一步简化。
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
看下面的类映射common/find
@Controller
public class CommonController {
@Autowired
private CommonService commonService;
@RequestMapping
public void find(@RequestParam("sqlid") String sqlid,
WebRequest webRequest, ModelMap modelMap) {
Map map = new HashMap();
Map<String, String[]> parameter = webRequest.getParameterMap();
//把Map<String, String[]>转成Map<String, String>
Iterator<Entry<String, String[]>> it = parameter.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, String[]> pairs = it.next();
if(pairs.getValue().length > 0)
map.put(pairs.getKey(), pairs.getValue()[0]);
}
//查询
List list = commonService.find(sqlid, map);
modelMap.addAttribute("result", list);
}
}
方法参数不仅可以加WebRequest,还有其它好多可以加,比如做个服务器端验证或处理Session什么的,可方便了,加上就能用。以前听到介绍某种语言效率高,写很少可以办很多事,也不以为然。现在使用其它语言机会多了,看到一些便利的地方很是喜欢。回过头来再看java及其框架,我的要求是配置再少些,代码再少些。spring注解加默认约定,减少了配置,减少了我们要写的代码量,java开发的效率提高了。
2010-4-16:现在感觉做主要是查询的应用很爽,java代码只有二百行左右(需求不简单,五个模块,各种查询)ibatisl配置了十几个查询sql,条件与ajax发过来的对应。
var settings = {sid:"getpp",exchange:2,limit:50,cc_date:$("#date_input").val()};
$.ajax({type: "POST",url:"../find.json", data:settings, success:function(json){
//create grid
},dataType:"json",error:function () {
alert('服务器错误,请稍后重试');
}
});
<select id="getpp" parameterClass="java.util.HashMap" resultClass="java.util.HashMap">
SELECT @rownum:=@rownum+1 rownum, t.* FROM (SELECT @rownum:=0) r, (
SELECT company,SUM(amount) amount FROM XXXX WHERE
<isNotEmpty property="date">
date=#date#
</isNotEmpty>
<isEmpty property="date">
date between #start_date# and #end_date#
</isEmpty>
<isNotEmpty property="code">
and code=#code#
</isNotEmpty>
<isEmpty property="code">
and code like CONCAT('%', #name#, '%')
</isEmpty>
and EXCHANGE=#exchange#
GROUP BY company
ORDER BY amount DESC LIMIT #limit#
) t
</select>
js代码写了六七百行,用了jqgrid表格和flot画图。如果是不刷新页面的应用,要使用经过考验的组件,那些没名的小组件不能用,内存会不停的增涨。