先搭建一个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 风格 的设计 由原来的基于操作的设计 转换成了基于 资源的设计
对HTTP 协议请求方式做了规范 get 请求对应 查询 post 请求添加 put 对应修改 delete 请求删除
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/>
@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"
开发顺序就如下图顺序所示: