在公司实习已经有一周了,都在学Spring MVC。师傅让我在离线项目上自己做个按钮,跳转到一个新的页面,再创个新表,把基础的增删改查都做一遍。一个星期的学习,成了!
下面开始正题:
这是我写的demo页面,主要就是玩玩增删改查。
Dao
层负责数据库语句相关。这里我就新建了一个demoDao.java
,这是个接口类,数据库语句是在一个demo-mapper.xml
的映射文件里配置的。因此这个接口类前要加上@Repository
注解用于标注数据访问组件。在映射文件里,通过
这样子和demoDao.java
绑定。具体在后面后详细介绍。Service
层有两个:DemoService.java
和DemoServiceImpl.java
。前者是接口类,后者实现前者。实现类里返回的是Dao
层的对应方法,并且在类前要加上@Service
注解用于自动注册到Spring容器。对了,在DemoServiceImpl
初始化Dao
层要在前面加上@Resource
,默认安照名称进行装配。这里可以对Dao
层拿到的数据进行处理,通常是写个拦截器Interceptor
,比如我这里用到的分页拦截器,把拿到的数据分页显示在前端。Controller
层我理解成处理前端数据并返回结果给前端。这层我新建了个DemoController.java
,在类名前要加上@Controller
注解也是用于自动注册到Spring容器,还有@RequestMapping("/demo")
这个是相当于定义了这个项目下的路径,我这里是demo,那么这个控制器下的所有方法在访问前都是"项目名/demo"
。这里的方法中,参数是前端传来的,返回的值也是给前端的,其中就用到Service
层的方法(不说了,定义的时候也要用到@Resource
)来实现访问数据库并得到想要的结果。Jsp
页面,这里就是前端了。主要需要关心的是如何取值、传值并用什么方法请求数据,后端传来的数据如何显示。还是挺重要的,下面具体例子也会说一点。
Hi! ${name}
姓名:
年龄:
性别:
手机:
增加记录
现在有这么个东西在这边,是不是好想做点什么?
好吧,here we go!
1.首先得想着我在哪边把数据库语句写了,来喽,就是它:demo-mapper.xml
insert into demo_wb (id, name, age, sex, tel)
values ((s_country.nextval), #{name}, #{age}, #{sex}, #{tel})
这里的id="add"
中的add
,就对应着demoDao
里对应的add
方法:public int add(Map
这个parameterType="map"
也不难理解,就是说入参是map
类型的嘛,上面的接口也可以看出来,都是对应的。那么到此,Dao
层的就写好了。
这里还顺带提一句,#{}
一般比${}
更常用。解释:${}
会直接注入,即变量是什么就注入什么,适用于模糊查询等情况;#{}
表示的变量无论有没有双引号都会给加上。
2.接下来就是Service
层了,我这个功能简单就没必要多说啥了,写好接口,实现类再自动生成,返回个Dao
层对应的方法,ok下一位。
3.接下来Controller
层,需要考虑入参是什么,要返回啥。稍加思索发现,入参就那四个框里的值嘛,先不考虑前端怎么获取,反正到这里它必须出现在入参里。那么你会怎么写?
(String name, String age, String sex, String tel)
这样?
对,我一开始就是这么写的,被师傅看到后教我一招:(HttpServletRequest request)
,想要啥就request.getParameter("啥")
。emmm,好用好用!但是问题来了,要是前端传过来几十几百个参数,你咋办?
这时候就建个Model
类吧,写好具体变量,get()
、set()
后就可以用了,比如什么demoModel.getName().toString()
,虽说好像长度没啥变化,但是方便管理啊…
方法里做的事情就是收集前端数据再通过Service
层通过Dao
层操作数据库。哇,好绕,反正最后通过数据库返回结果就完事了。贴个代码:
@RequestMapping("/add")
public @ResponseBody int add(HttpServletRequest request) throws Exception{
Map params = new HashMap();
params.put("name", new String(request.getParameter("name").getBytes("iso-8859-1"),"utf-8"));
params.put("age", request.getParameter("age"));
params.put("sex", new String(request.getParameter("sex").getBytes("iso-8859-1"),"utf-8"));
params.put("tel", request.getParameter("tel"));
return demoService.add(params);
}
这里也看到了,因为name
字段和sex
字段都会有汉字,所以要转个码。
(3月13日更新:昨天写完后对比了一下增和改,突然发现都是要从前端取值,为啥我写的改没有转码呢?查了资料才知道:因为ajax
请求时我这里传值是通过地址传的,而地址栏的编码格式是iso-8859-1
,因此在处理时就要转码;而下面的改,是放在json
里传过来的,所以就不用转码。)
4.终于来到了最后一个环节:
/* 增加数据 */
function add(){
var name = $('#name').textbox('getValue');
var age = $('#age').textbox('getValue');
var sex = $('#sex').textbox('getValue');
var tel = $('#tel').textbox('getValue');
$.ajax({
type:'post',
url:'/ImmovableProperty/demo/add.do?name='+name+'&age='+age+'&sex='+sex+'&tel='+tel,
sync:false,
dataType:'json',
success:function(data){
if (data > 0) {
alert("添加成功!");
showTable();
} else {
alert("添加失败!");
}
},
error:function(){
alert("检查网络再试!");
}
});
}
用的是ajax
,还可以用form
表单的方式提交,适合参数较多的时候,举个栗子:
$('#updateUserRoleInfoForm').form('submit', {
url:'/ImmovableProperty/systemManage/updateUserRoleInfo.do',
onSubmit: function(param){
param.staffId=staffId;
param.roleId=roleId;
var isValid = $(this).form('validate');
return isValid;
},
success:function(data){
$.messager.confirm('确认','您确认保存吗?',function(r){
if (r){
if(data>0){
jQuery("#saveInfo").html('保存成功!');
$('#updateUserRoleInfo').dialog('close');
createTable();
}else{
jQuery("#saveInfo").html('修改失败!');
}
} //噫...不知道谁写的代码,迷之缩进
});
}
});
demo-mapper.xml
delete from demo_wb where ID in (${id})
DemoDao.java
public int delete(Map params);
DemoService.java
public int delete(Map params);
//写到这里才发现和上面是一模一样啊...
DemoServiceImpl.java
public int delete(Map params) {
return demoDao.delete(params);
}
DemoController.java
@RequestMapping("/delete")
public @ResponseBody int delete(String id) {
int effect = 0;
Map params = new HashMap();
params.put("id", id);
effect = demoService.delete(params);
return effect;
}
demo.jsp
//获取数据
var arr = new Array();
for ( var i = 0; i < row.length; i++) {
var value = row[i].ID;
arr[arr.length] = value;
}
//关键代码
$.post("/ImmovableProperty/demo/delete.do?id="+arr, ......
demo-mapper.xml
update demo_wb set
name = #{name},
age = #{age},
sex = #{sex},
tel = #{tel}
where id = #{id}
DemoDao.java
public int update(Map params);
DemoService.java
public int update(Map params);
DemoServiceImpl.java
public int update(Map params) {
return demoDao.update(params);
}
DemoController.java
@RequestMapping("/update")
public @ResponseBody int update(HttpServletRequest request) throws Exception{
Map params = new HashMap();
params.put("id", request.getParameter("id"));
params.put("name", request.getParameter("nameUpdate"));
params.put("age", request.getParameter("ageUpdate"));
params.put("sex", request.getParameter("sexUpdate"));
params.put("tel", request.getParameter("telUpdate"));
return demoService.update(params);
}
demo.jsp
//获取数据
var row = $('#table').datagrid('getSelected');
var id = row.ID;
var nameUpdate = $('#nameUpdate').textbox('getValue');
var ageUpdate = $('#ageUpdate').combobox('getValue');
var sexUpdate = $('#sexUpdate').combobox('getValue');
var telUpdate = $('#telUpdate').textbox('getValue');
var params = {
"id":id,
"nameUpdate":nameUpdate,
"ageUpdate":ageUpdate,
"sexUpdate":sexUpdate,
"telUpdate":telUpdate
};
//ajax请求
url:'/ImmovableProperty/demo/update.do',
data: params,
demo-mapper.xml
DemoDao.java
public List
DemoService.java
public Page searchName(Map params, Integer pageNum, Integer pageSize);
//这里就不一样了,因为这里的Service层是写了分页拦截器,所以参数不一样
DemoServiceImpl.java
public Page searchName(Map params, Integer pageNum, Integer pageSize) {
PageInterceptor.startPage(pageNum, pageSize);
List
DemoController.java
@RequestMapping("searchName")
public @ResponseBody Page searchName(HttpServletRequest request, int page, int rows){
Map params = new HashMap();
params.put("name", request.getParameter("name"));
return demoService.searchName(params, page, rows);
}
demo.jsp
function searchName() {
var name = $('#name').textbox('getValue');
$('#table').datagrid({
url:'/ImmovableProperty/demo/searchName.do',
pagination:true,
rownumbers:true,
pageList:[20,30,40,50],
fit:true,
queryParams:{'name':name},
toolbar:"#tb",
columns:[[
{field:'ID',title:'id',checkbox:true},
{field:'NAME',title:'姓名',width:150,align:'center'},
{field:'AGE',title:'年龄',width:150,align:'center'},
{field:'SEX',title:'性别',width:150,align:'center'},
{field:'TEL',title:'电话',width:300,align:'center'},
]],
onLoadSuccess:function(data){
$('#table').datagrid('fixRowHeight');
}
});
}
全文完。