浏览 6561 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2014-01-08
上次,散仙给了一个关于Sping MVC注解简单的小例子,那么本次呢,给出一个稍微复杂的基于增加改查的小项目,下面先介绍下此项目对应的一些信息。
<table class="bbcode"><tr><td>名称</td><td>描述<tr><td>Web容器</td><td>Tomcat6.0<tr><td>IDE工具</td><td>Myeclipse10.1<tr><td>平台</td><td>Windows<tr><td>语言</td><td>JAVA<tr><td>JDK</td><td>1.6<tr><td>数据库</td><td>MySQL5.1<tr><td>Sping</td><td>3.2(非Myeclipse自带,需要下载)<tr><td>Hibernate</td><td>3.3(IDE自带)<tr><td>Jquery</td><td>1.7.1<tr><td>人力道具</td><td>屌丝软件工程师一名</table> 项目背景概况,此项目为了模拟开发中的实际场景,使用了2张表,具有主外键关系,一个是主表Person,另一个从表Country,比上一次的单表的增删改查骚加复杂,实为新手练手的一个好例子。 下面是功能描述: <table class="bbcode"><tr><td>功能</td><td>描述<tr><td>查询功能</td><td>默认情况下显示所有Person信息,需含有外键表的Country的name信息<tr><td>增加功能</td><td>在首页上点击添加信息,跳转页面,Country信息需用下拉框显示,后台添加成功后,需要用以ajax的形式,返回响应,提示添加成功<tr><td>修改功能</td><td>可以对对应的Person信息进行修改,注意下拉框与修改的Person的对应<tr><td>删除功能</td><td>可以在首页上对对应的Person信息进行删除</table> 截图,如下: spring的配置文件: <pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;beans default-autowire="byName" xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd "&gt; &lt;!-- 注解扫描包 --&gt; &lt;context:component-scan base-package="controller" /&gt; &lt;!-- 开启注解 --&gt; &lt;mvc:annotation-driven /&gt; &lt;!-- &lt;bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"&gt; &lt;property name="supportedMediaTypes"&gt; &lt;list&gt; &lt;value&gt;application/json;charset=UTF-8&lt;/value&gt; &lt;value&gt;text/plain;charset=UTF-8&lt;/value&gt; &lt;/list&gt; &lt;/property&gt; &lt;/bean&gt; &lt;bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"&gt; &lt;property name="messageConverters"&gt; &lt;list&gt; &lt;ref bean="mappingJacksonHttpMessageConverter" /&gt; &lt;/list&gt; &lt;/property&gt; &lt;/bean&gt; --&gt; &lt;!-- &lt;bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"&gt; &lt;property name="mediaTypes"&gt; &lt;map&gt; &lt;entry key="atom" value="application/atom+xml"/&gt; &lt;entry key="html" value="text/html"/&gt; &lt;entry key="json" value="application/json"/&gt; &lt;/map&gt; &lt;/property&gt; &lt;property name="viewResolvers"&gt; &lt;list&gt; &lt;bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/&gt; &lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt; &lt;property name="prefix" value="/WEB-INF/jsp/"/&gt; &lt;property name="suffix" value=".jsp"/&gt; &lt;/bean&gt; &lt;/list&gt; &lt;/property&gt; &lt;property name="defaultViews"&gt; &lt;list&gt; &lt;bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" /&gt; &lt;/list&gt; &lt;/property&gt; &lt;/bean&gt; --&gt; &lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt; &lt;property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/&gt; &lt;property name="prefix" value="/WEB-INF/jsp/"/&gt; &lt;property name="suffix" value=".jsp"/&gt; &lt;/bean&gt; &lt;!-- 处理器映射 --&gt; &lt;!-- &lt;bean class="com.qin.annocontroller.HelowWorld" &gt;&lt;/bean&gt; --&gt; &lt;!-- 注解使用的 HandlerMapping --&gt; &lt;bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"&gt;&lt;/bean&gt; &lt;!-- 注解使用的 HandlerAdapter --&gt; &lt;bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"&gt; &lt;!-- 支持json返回 --&gt; &lt;/bean&gt; &lt;!-- 声明DispatcherServlet不要拦截下面声明的目录 --&gt; &lt;mvc:resources location="/jquery/" mapping="/jquery/**" /&gt; &lt;!-- &lt;mvc:resources location="/jsp/" mapping="/jsp/**" /&gt; --&gt; &lt;/beans&gt; </pre> web.xml的配置文件: <pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"&gt; &lt;display-name&gt;&lt;/display-name&gt; &lt;!-- 配置上下文参数 --&gt; &lt;context-param&gt; &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; &lt;param-value&gt;classpath:ac*.xml&lt;/param-value&gt; &lt;/context-param&gt; &lt;!-- 配置监听器 --&gt; &lt;listener&gt; &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt; &lt;/listener&gt; &lt;servlet&gt; &lt;!-- 第一个首先调用的前端控制器,注意与WEB-INFO下servlet的xml相对应 --&gt; &lt;servlet-name&gt;qin&lt;/servlet-name&gt; &lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;qin&lt;/servlet-name&gt; &lt;url-pattern&gt;/&lt;/url-pattern&gt; &lt;/servlet-mapping&gt; &lt;servlet&gt; &lt;servlet-name&gt;forwarding&lt;/servlet-name&gt; &lt;servlet-class&gt;com.qin.sanxian.ForwardServlet&lt;/servlet-class&gt; &lt;/servlet&gt; &lt;!-- 处理post提交的乱码解决 --&gt; &lt;filter&gt; &lt;filter-name&gt;CharacterEncodingFilter&lt;/filter-name&gt; &lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter&lt;/filter-class&gt; &lt;init-param&gt; &lt;param-name&gt;encoding&lt;/param-name&gt; &lt;param-value&gt;utf-8&lt;/param-value&gt; &lt;/init-param&gt; &lt;/filter&gt; &lt;!-- 配置Session --&gt; &lt;filter&gt; &lt;filter-name&gt;osiv&lt;/filter-name&gt; &lt;filter-class&gt;org.springframework.orm.hibernate3.support.OpenSessionInViewFilter&lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;osiv&lt;/filter-name&gt; &lt;url-pattern&gt;/*&lt;/url-pattern&gt; &lt;/filter-mapping&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;CharacterEncodingFilter&lt;/filter-name&gt; &lt;url-pattern&gt;/*&lt;/url-pattern&gt; &lt;/filter-mapping&gt; &lt;welcome-file-list&gt; &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt; &lt;/welcome-file-list&gt; &lt;/web-app&gt; </pre> ac.xml的配置: <pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;beans default-autowire="byName" 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:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"&gt; &lt;!-- 配置数据源 --&gt; &lt;bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" &gt; &lt;property name="driverClassName" value="com.mysql.jdbc.Driver"&gt; &lt;/property&gt; &lt;property name="url" value="jdbc:mysql://localhost:3306/test"&gt;&lt;/property&gt; &lt;property name="username" value="root"&gt;&lt;/property&gt; &lt;property name="password" value="ninemax"&gt;&lt;/property&gt; &lt;/bean&gt; &lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt; &lt;property name="dataSource"&gt; &lt;ref bean="dataSource" /&gt; &lt;/property&gt; &lt;property name="hibernateProperties"&gt; &lt;props&gt; &lt;prop key="hibernate.dialect"&gt; org.hibernate.dialect.MySQLDialect &lt;/prop&gt; &lt;/props&gt; &lt;/property&gt; &lt;property name="mappingResources"&gt; &lt;list&gt; &lt;value&gt;entity/Country.hbm.xml&lt;/value&gt; &lt;value&gt;entity/Person.hbm.xml&lt;/value&gt;&lt;/list&gt; &lt;/property&gt;&lt;/bean&gt; &lt;!-- 配置hibernate事务管理器 --&gt; &lt;bean id="tx" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt; &lt;/bean&gt; &lt;!-- 定义事务通知 --&gt; &lt;tx:advice id="txAdvice" transaction-manager="tx"&gt; &lt;tx:attributes&gt; &lt;tx:method name="*" propagation="REQUIRED" /&gt; &lt;tx:method name="get*" propagation="SUPPORTS" /&gt; &lt;tx:method name="find*" read-only="true" /&gt; &lt;/tx:attributes&gt; &lt;/tx:advice&gt; &lt;!-- 定义AOP切面 --&gt; &lt;aop:config&gt; &lt;aop:pointcut expression="execution(* commons.*.*(..))" id="pc" /&gt; &lt;aop:advisor advice-ref="txAdvice" pointcut-ref="pc" /&gt; &lt;/aop:config&gt; &lt;!-- 注入父类 --&gt; &lt;bean name="basedao" class="commons.BaseDao" abstract="true"&gt; &lt;/bean&gt; &lt;/beans&gt;</pre> ac.Dao的配置文件: <pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;beans default-autowire="byName" 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:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"&gt; &lt;bean id="personDao" class="dap.impl.PersonDaoImpl" parent="basedao"&gt;&lt;/bean&gt; &lt;bean id="countryDao" class="dap.impl.CountryDaoImpl" parent="basedao"&gt;&lt;/bean&gt; &lt;/beans&gt; </pre> 控制器的核心代码: <pre name="code" class="java">package controller; import java.util.ArrayList; import java.util.List; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import com.google.gson.Gson; import dao.CountryDao; import dao.PersonDao; import entity.Country; import entity.Person; /** * @author 秦东亮 * 技术群:324714439 * * * */ @Controller public class PersonController { @Resource(name="personDao") private PersonDao personDao; public PersonDao getPersonDao() { return personDao; } public void setPersonDao(PersonDao personDao) { this.personDao = personDao; } @Resource(name="countryDao") private CountryDao countryDao; public CountryDao getCountryDao() { return countryDao; } public void setCountryDao(CountryDao countryDao) { this.countryDao = countryDao; } /** * 输出所有的用户信息 * * **/ @RequestMapping( value="/showAll") public String showAll(HttpServletRequest request)throws Exception{ request.setAttribute("plist", personDao.find(" from Person ")); return "showAll"; } /** * 输出所有的国家信息 * * **/ @RequestMapping( value="/add") public String add(HttpServletRequest request)throws Exception{ request.setAttribute("clist", countryDao.find(" from Country ")); return "adda"; } /** * 删除的方法 * */ @RequestMapping( value="/delete") public String delete(HttpServletRequest request)throws Exception{ int id=Integer.parseInt(request.getParameter("id")); personDao.delete(personDao.get(id)); return "redirect:/showAll"; } /** * 删除的方法 * request域的写法 * */ @RequestMapping( value="/update") public String update(HttpServletRequest request)throws Exception{ int id=Integer.parseInt(request.getParameter("id")); request.setAttribute("p", personDao.get(id)); request.setAttribute("clist", countryDao.find(" from Country ")); return "update"; } /** * 更新的操作 * 封装成实体类的写法 * */ @RequestMapping( value="/sup",method=RequestMethod.POST) public String sup(Person person,HttpServletRequest request){ try{ personDao.update(person); // System.out.println("111"); // System.out.println(person.getName()); //System.out.println(person.getCountry().getId()); //System.out.println(request.getParameter("name")); }catch (Exception e) { e.printStackTrace(); } return "redirect:/showAll"; } /** * 保存一条数据 * 没有使用实体类自动封装的功能 * * **/ @RequestMapping( value="/save",method=RequestMethod.POST) public void save(HttpServletRequest request,HttpServletResponse response)throws Exception{ // personDao.save(person);//保存成功 Person person=new Person(); person.setAge(Integer.parseInt(request.getParameter("age"))); person.setName(request.getParameter("name")); Country c=new Country(); c.setId(Integer.parseInt(request.getParameter("cid"))); person.setCountry(c); personDao.save(person); //System.out.println("cid : "+request.getParameter("cid")); Gson g=new Gson(); // List&lt;String&gt; list=new ArrayList&lt;String&gt;(); // list.add("A"); // list.add("B"); // list.add("C"); // list.add("D"); response.setCharacterEncoding("UTF-8"); response.setContentType("application/json;charset=utf-8"); //response.getWriter().write(g.toJson(list)); response.getWriter().write(g.toJson("添加成功!")); // response.getWriter().write("1"); } /** * 保存一条数据 * 基于ajax的json自动封装的 * 实体类 * 注意有嵌套类时的 * 写法"county.id" * * **/ @RequestMapping( value="/savetwo",method=RequestMethod.POST) public void savetwo(Person person,HttpServletRequest request,HttpServletResponse response)throws Exception{ personDao.save(person);//保存成功 // System.out.println(person); //System.out.println("cid : "+request.getParameter("cid")); Gson g=new Gson(); // List&lt;String&gt; list=new ArrayList&lt;String&gt;(); // list.add("A"); // list.add("B"); // list.add("C"); // list.add("D"); response.setCharacterEncoding("UTF-8"); response.setContentType("application/json;charset=utf-8"); //response.getWriter().write(g.toJson(list)); response.getWriter().write(g.toJson("添加成功!")); // response.getWriter().write("1"); } } </pre> 添加的JSP页面的代码 : <pre name="code" class="html">&lt;%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%&gt; &lt;%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %&gt; &lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;My JSP 'add.jsp' starting page&lt;/title&gt; &lt;meta http-equiv="pragma" content="no-cache"&gt; &lt;meta http-equiv="cache-control" content="no-cache"&gt; &lt;meta http-equiv="expires" content="0"&gt; &lt;meta http-equiv="keywords" content="keyword1,keyword2,keyword3"&gt; &lt;meta http-equiv="description" content="This is my page"&gt; &lt;!-- &lt;link rel="stylesheet" type="text/css" href="styles.css"&gt; --&gt; &lt;script type="text/javascript" src="jquery/jquery-1.7.1.min.js"&gt;&lt;/script&gt;&lt;/head&gt; &lt;script type="text/javascript"&gt; /* $(function(){ $("#btn").bind('click',function(){ alert('123'); var name=$("#name").val(); var age=$("#age").val(); var cid=$("#cid").val(); $.ajax({ type:"post", url:"save", data:{name:name,age:age,country.id=cid}, dataType:"json", success: function(msg) { alert(msg) } }); }); }); */ function qin(){ var name=$("#name").val(); var age=$("#age").val(); var cid=$("#cid").val(); $.ajax({ type:"post", url:"savetwo", data:{name:name,age:age,"country.id":cid}, // data:{name:name,age:age,cid:cid}, dataType:"json", success: function(msg) { alert(msg) location.href = "showAll"; } }); } &lt;/script&gt; &lt;body&gt; 名字: &lt;input id="name" name="name"&gt;&lt;br&gt; 年龄:&lt;input id="age" name="age"&gt;&lt;br&gt; 请选择国家: &lt;select id="cid" name="cname" &gt; &lt;c:forEach items="${clist }" var="c"&gt; &lt;option value="${c.id}" &gt;${c.cname} &lt;/option&gt; &lt;/c:forEach&gt; &lt;/select&gt; &lt;button id="btn" onclick="qin()" &gt;提交&lt;/button&gt; &lt;/body&gt; &lt;/html&gt; </pre> 最后,散仙先总结下自己写这个小项目的最大的2个收获之处: 1,关于Sping MVC的json问题,因为在项目中使用到了Ajax传参以及返回参数,所以就避免不了与json打交道,所以就需要配置Sping MVC支持json的转换,这个问题比较蛋疼,可能也是散仙还不够熟练吧,Sping MVC内置支持的json需要下载什么jakson的包,但是经过一番折腾,老是启动报错,可能是版本不一致问题,最后弃用Sping MVC的内置json功能,使用流的形式的返回json,然后进行处理,包括在Struts2里面散仙也弃用了其自身携带的json功能,而是结合json工具,比如gson,fastgson,来完成ajax的一些问题,这样以来,就很简单,而且不容易出错的出色的完成某些功能。 2,第二个收获之处,关于Sping MVC提交的数据,怎么跟后台的实体类相绑定的问题,或者实体类里面又嵌套了一个实体类这样应该如何绑定参数? 其实这些问题在struts2里面还是比较好解决的,都以后台的(Action)里面实体类的属性名绑定就OK了,简单类型person.name就在表单的name里写一致就OK了,ajax无表单情况下也是如此,如果含有嵌套类需要类似使用person.country.name这样写即可,ajax无表单提交情况一样。在Spring MVC里如果是表单提交则写name就可以,如果是ajax无表单的异步提交则需要加上双引号"country.name",类似这样,另外一点关于多选框提交时,&lt;option&gt;标签里一定要有值,否则获取select标签时,会出现类似400错误,而Sping后台却无任何异常,所以这一点需要重点注意一下。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2014-01-14
转载的?这排版太次了吧
|
|
返回顶楼 | |
发表时间:2014-01-14
xiaohuafyle 写道 转载的?这排版太次了吧
原创的,点我头像,去我博客上看吧,这里好像对排版支持不好! |
|
返回顶楼 | |