jquery + JsonView + spring + ibatis实例

    本着尽量轻量级、尽量少依赖的原则选择了这一组合。主要思路是前端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画图。如果是不刷新页面的应用,要使用经过考验的组件,那些没名的小组件不能用,内存会不停的增涨。

你可能感兴趣的:(spring,jquery,json,ibatis,Exchange)