REST代码架构在Spring中的支持

先搭建一个DAO和MVC结合的基本Spring环境

a.搭建 DAO 环境 
  1.建立表和对应的序列 
  2.建立一个项目 导入jar包(ioc aop dao 数据库驱动 连接池) 拷贝配置文件到src下 
  3.根据表设计一个实体类 
  4.设计DAO 接口  
  5.实现DAO 接口  不继承JdbcDaoSupport 
    开启组件扫描   把dao放入容器    注入JdbcTemplate   
    在容器中创建JdbcTemplate --- 创建DataSource
    使用API 完成 查询 --- RowMapper       //直接复制
  6.包装一个Service 测试  

b.搭建MVC环境 
  1.建项目  导入jar (mvc)   拷贝配置文件  WEB-INF下建立页面 
  2.在web.xml 中配置DispatcherServlet
  3.开启组件扫描  和 开启标注形式mvc
  4.编写控制器类  设计方法 使用@Controller  和 @RequestMapping
  5.配置视图处理器  

c.DAO  和 MVC  结合 

配置实现一个返回一个银行列表!!注意配置信息和实体类和原来实体类一摸一样。

DAO接口方法
public interface XdlBankAccountDAO { 
    List<XdlBankAccount> getAccountList();
}
DAO接口方法的实现
@Repository("accountDao")
public class XdlBankAccountDAOImpl implements XdlBankAccountDAO {
	@Resource
	private JdbcTemplate jdbcTemplate;
	@Override
	public List<XdlBankAccount> getAccountList() {
		String sql = "select * from xdl_bank_account";
		return jdbcTemplate.query(sql,new XdlBankAccountMapper());
	}
}
XdlBankAcoountController.java
@Controller
public class XdlBankAccountController {
	@Autowired
	private XdlBankAccountService accountService;
	@RequestMapping("/toAccountList.do")
	public String toAccountList(){
		return "account_list";
	}
	@RequestMapping("/accountList.do")
	@ResponseBody
	public List<XdlBankAccount> accountList(){
		return accountService.accountList();
	}
}
account_list.jsp
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/bootstrap.min.js"></script>
<link type="text/css" rel="stylesheet" href="css/bootstrap.min.css">
<script type="text/javascript">
	$(function(){
		$.ajax({
			url:"accountList.do",
			type:"post",
			success:function(accounts){
				var $datas = $("#datas");
				for(var i=0;i<accounts.length;i++){
					var obj = accounts[i];
					var trStr = "<tr><td>"+obj.id+"</td><td>"+obj.acc_no+"</td><td>"+
					obj.acc_password+"</td><td>"+obj.acc_money+"</td></tr>";
					$datas.append($(trStr));
				}
			},
			dataType:"json"
		});
	});
	
</script>
</head>
<body>
	<table id="datas" class="table table-striped table-bordered">
		<tr><td>ID</td><td>ACC_NO</td><td>ACC_PASSWORD</td><td>ACC_MONEY</td></tr>
	</table>
</body>

2.REST代码架构的简介

REST即表述性状态传递(英文:Representational State Transfer,简称REST)
它是一种抽象的软件架构风格 
这种软件设计风格 主要针对两个方面 做了规范 
对URL 风格 的设计 由原来的基于操作的设计  转换成了基于 资源的设计 

定位资源的URL风格,例如
http://itxdl.com/customers/1234
http://itxdl.com/orders/2007/10/776654

对HTTP 协议请求方式做了规范    get 请求对应 查询  post 请求添加   put 对应修改  delete 请求删除

如何对资源操作
采用HTTP协议规定的GETPOSTPUTDELETE动作
处理资源的增删改查操作

3.restful

 符合rest 约束风格的应用程序就是restful架构

4.Spring  MVC  对 restful 做了哪些支持呢?
 4.1 在@RequestMapping 上做了支持 

@RequestMapping(value="/account/{id}",method=RequestMethod.POST)
  public  String   add(@PathVariable("路径变量名") int  id){
  }

@PathVariable作用是将URI请求模板中的变量解析出来映射到处理方法的参数上
 4.2 请求路径 没有后缀了 ***
 需要改变 DispatcherServlet 的<url-parttern> 为  /
 这样的话 问题是 静态资源被拦截   需要一套规范 对静态资源放行 
 <mvc:default-servlet-handler/>  

需要注意的是restful架构完全基于ajax必须返回JSON,不然返回给视图处理器处理不了!
@ResponseBody
	@RequestMapping(value="/account/{id}",method=RequestMethod.GET)
	public XdlBankAccount getXdlBankAccount(@PathVariable("id")int id) {
		System.out.println("id:"+id);
		return null;
	}

请求:http://localhost:8080/spring-mvc-day07/account/123 页面一片空白不往123.jsp跑就不会报404错误。若id存在则

 

查询   并在输入框中显示查询到的信息。

1.现在dao接口中添加查询的方法。 //根据id查询银行账户   XdlBankAccount getAccountById(int id);

2.在实现类中实现添加的方法。这两步完成dao编程。

//根据银行id查信息
	@Override
	public XdlBankAccount getAccountById(int id) {
		String sql = "select * from xdl_bank_account where id=?";
		List<XdlBankAccount> accounts = jdbcTemplate.query(sql, new XdlBankAccountMapper(),id);
		return accounts.isEmpty()?null:accounts.get(0);
	}

3.包装service,再写控制器。

service中添加	
public XdlBankAccount accountById(int id) {
		return accountDao.getAccountById(id);
	}
控制器中添加
	@ResponseBody
	@RequestMapping(value="/account/{id}",method=RequestMethod.GET)
	public XdlBankAccount getXdlBankAccount(@PathVariable("id")int id) {
		System.out.println("id:"+id);
		return accountService.accountById(id);
	}

4.写jsp页面发送ajax请求实现前端页面的显示。jQuery val() 方法val() 方法返回或设置被选元素的 value 属性。遗忘知识。

<script type="text/javascript">
function  getAccount(){
	   var id = $("#id").val();
	   // 清空原来的数据 
	   $("#acc_no").val("");
	   $("#acc_password").val("");
	   $("#acc_money").val("");
	   $.ajax({
		   url:"account/"+id,
		   type:"get",
		   success:function(account){  
			   $("#acc_no").val(account.acc_no);
			   $("#acc_password").val(account.acc_password);
			   $("#acc_money").val(account.acc_money);
		   },
		   dataType:"json",
		   cache:false
	   });
}  
</script>
<body>
	ID:<input type="text" id="id"><br>
	NO:<input type="text" id="acc_no"><br>
	PW:<input type="password" id="acc_password"><br>
	MN:<input type="text" id="acc_money"><br>
	<input type="button" value="增加">
	<input type="button" value="删除">
	<input type="button" value="修改">
	<input type="button" value="查询" onclick="getAccount()">
	<table id="datas" class="table table-striped table-bordered">
		<tr><td>ID</td><td>ACC_NO</td><td>ACC_PASSWORD</td><td>ACC_MONEY</td></tr>
	</table>
</body>

增加

1。在DAO接口中增加方法

        //实现增加。
	 int insertAccount(XdlBankAccount account);

2。DAO的实现类中实现增加的方法

@Override
	public int insertAccount(XdlBankAccount account) {
		String sql = "insert into xdl_bank_account values(?,?,?,?)";
		try {
			return jdbcTemplate.update(sql,account.getId(),account.getAcc_no(),
					account.getAcc_password(),account.getAcc_money());
		} catch (DataAccessException e) {
			e.printStackTrace();
		}
		return 0;
	}

3.包装service和控制器

service中
public Boolean regisetr(XdlBankAccount account) {
		return accountDao.insertAccount(account)==0?false:true;
	}
控制器中
@ResponseBody
	@RequestMapping(value="/account/{id}",method=RequestMethod.POST)
	public boolean addBankAccount(XdlBankAccount account) {
		return accountService.regisetr(account);
	}

4.jsp页面实现ajax加载

<script type="text/javascript">
	function addAccount() {
		var id = $("#id").val();
		var acc_no = $("#acc_no").val();
		var acc_password = $("#acc_password").val();
		var acc_money = $("#acc_money").val();
		$.ajax({
			url : "account/" + id,
			type : "post",
			success : function(f) {
				if (f) {
					var trStr = "<tr id='"+id+"'> <td>" + id + "</td><td>"
							+ acc_no + "</td><td>" + acc_password + "</td><td>"
							+ acc_money + "</td></tr>";
					$("#datas").append($(trStr));
				} else {
					alert('增加失败');
				}
			},
			dataType : "json",
			cache : false,
			data : {
				id : id,
				acc_no : acc_no,
				acc_password : acc_password,
				acc_money : acc_money
			}
		});
	}
</script>

删除

1.在DAO中添加根据id删除的方法 int deleteAccountByid(int id);

2.在DAO的实现类中实现此方法

@Override
	public int deleteAccountByid(int id) {
		// TODO Auto-generated method stub
		String sql = "delete from xdl_bank_account where id=?";
		try {
			return jdbcTemplate.update(sql,id);
		} catch (DataAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return 0;
	}

3.包装service 和 控制器

service中
public Boolean remove(int id) {
		return accountDao.deleteAccountByid(id)==0?false:true;
	}
控制器中,需要处理这个id
@ResponseBody
	@RequestMapping(value="/account/{id}",method=RequestMethod.DELETE)
	public boolean removeBankAccount(@PathVariable("id")int id) {
		return accountService.remove(id);
	}

4.jsp页面实现ajax请求

<script type="text/javascript">
	function deleteAccount() {
		var id = $("#id").val();
		$.ajax({
			url : "account/" + id,
			type : "delete",
			success : function(f) {
				if (f) {
					$("#datas tr[id='" + id + "']").remove();
				}
			},
			dataType : "json",
			cache : false
		});

	}
</script>

更新 注意更新是增删查改中最难的一点

1.在dao中新增根据对象更新的方法。     int updateAccount(XdlBankAccount account);

2.在dao的实现类中实现此方法

@Override
	public int updateAccount(XdlBankAccount account) {
		// TODO Auto-generated method stub
		String sql = "update xdl_bank_account set acc_no=?,acc_password=?,"
				+ "acc_money=? where id=?";
		try {
			return jdbcTemplate.update(sql,account.getAcc_no(),account.getAcc_password(),
					account.getAcc_money(),account.getId());
		} catch (DataAccessException e) {
			e.printStackTrace();
		}
		return 0;
	}

3.包装service和控制器

service中
public boolean update(XdlBankAccount account) {
		return accountDao.updateAccount(account)==0?false:true;
	}
控制器中
        @RequestMapping(value="/account/{id}",method=RequestMethod.PUT)
	@ResponseBody
	public boolean removeBankAccount(@RequestBody XdlBankAccount account) {
		System.out.println("account="+account);
		return accountService.update(account);
	}

注意:  @RequestBody   把json字符串 解析成java对象 put请求必须要注意

4.jsp中实现ajax请求

<script type="text/javascript">
	function updateAccount() {
		var id = $("#id").val();
		var acc_no = $("#acc_no").val();
		var acc_password = $("#acc_password").val();
		var acc_money = $("#acc_money").val();
		$.ajax({
			url : "account/" + id,
			type : "put",
			success : function(f) {
				if (f) {
					/* var trStr = " <td>"+id+"</td><td>"+acc_no+"</td><td>"+
					acc_password+"</td><td>"+acc_money+"</td>";
					$("#datas tr[id='"+id+"']").html(trStr); */
					var trStr = "<tr id='"+id+"'> <td>" + id + "</td><td>"
							+ acc_no + "</td><td>" + acc_password + "</td><td>"
							+ acc_money + "</td></tr>";
					$("#datas tr[id='" + id + "']").replaceWith($(trStr));
				} else {
					alert('更新失败');
				}
			},
			dataType : "json",
			cache : false,
			data : JSON.stringify({
				id : id,
				acc_no : acc_no,
				acc_password : acc_password,
				acc_money : acc_money
			}),
			contentType : "application/json"
		});
	}
</script>

注意:  完成更新请求发送put请求 要求ajax的参数必须以 json字符串传递 
  把json对象转换成 json字符串  JSON.stringify(json对象)   并告知 ajax引擎  contentType:"application/json"

开发顺序就如下图顺序所示:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章