您的位置:首页 > 编程语言 > Java开发

从零开始搭建maven+springmvc+mybatis web项目(3)---springmvc流程测试

2016-12-09 13:52 816 查看
前面的文章已经讲过了如何搭建一个maven+springmvc+mybatis的web项目环境。现在我们需要写一些实体类来跑一下springmvc的整体流程。


上面的图片是整个java后台的结构,用红线框出来的部分你们不用理会,首先,在java目录下面我新建了一个com.zhengtx的包,然后在包里面分了一个小模块,controller,dao,entity,service.

我们先看一下当一个请求过来的后台具体流程,url–>controller–>service–>serviceImpl–>dao–>sqlmap.xml.

这是后台执行的一个整体流程,当一个请求进来,它会被引流到TestController类里面,我们一般在TestController类调用TestService中声明的方法,TestService是一个接口,这个接口和接口中具体的方法在TestServiceImpl类中被实现了,而在TestServiceImpl类中,调用的是TestDao中声明的方法,TestDao也是一个接口,但是这个接口不需要被实现,这个接口中的方法名,和test-sqlmap.xml中的sql 语句的id必须是对应的,这样当调用TestDao中声明的方法的时候,它就会去对应的test-sqlmap.xml中寻找相应的sql语句同名的id,然后执行对应的sql语句。

我们先来看一下entity层,也就是实体层我新建了一个实体类,TestEntity,这个实体类中有连个元素,name,grade,对应的,在我在数据库建立的表中也有这两个字段,

public class TestEntity{
private static final long serialVersionUID = 1L;
private String name;
private String grade;
public String getName() {return name; }
public void setName(String name) {this.name = name;}
public String getGrade() {return grade;}
public void setGrade(String grade) {this.grade = grade;}
}


我们再从dao层来看,我在dao层写了一个TestDao接口,在里面声明了自己需要用到的方法,新增方法和查询方法。该方法不需要具体实现。只需要声明即可。

package com.zhengtx.dao;
import com.zhengtx.entity.TestEntity;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface TestDao {
public List<TestEntity> search(TestEntity testEntity);
public void add(TestEntity testEntity);
}


然后我们看一下和dao层对应的sqlmap.xml文件。我把sqlmap.xml文件方法app-web/src/main/resources/sqlmap目录下,新建了一个test-sqlmap.xml文件。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhengtx.dao.TestDao">
<select id="search" resultType="TestEntity">
select name,grade from test
where 1 = 1
<if test="name != null and name != ''">
and name = #{name}
</if>
<if test="grade != null and grade != ''">
and grade = #{grade}
</if>
</select>

<insert id="add" >
INSERT into test(
name,grade
)
values(
#{name},
#{grade}
)
</insert>

</mapper>


这个sqlmap.xml文件,首先我们需要把所有的sql语句都配置在
<mapper></mapper>
标签里面,在 mapper标签中,我们需要配置一个namespace属性,这个属性及其重要,这个属性是指明我们需要将这个sqlmap.xml和dao包中的哪一个dao接口对应,这里我们设置的是和dao包中的TestDao接口对应,在TestDao接口中我们声明了两个方法,add,search,那么,如果我们需要用到这两个方法,我们就需要在相应的test-sqlmap.xml文件中写入两个sql语句,这里我们写的是一个

public interface TestService {
public List<TestEntity> search(TestEntity testEntity);
public void add(TestEntity testEntity);
}


在TestService中声明的方法是需要被实现才可以使用的,在TestServiceImpl类中,我们实现了add和search方法。在add方法的实现中我们调用了TestDao的add方法,在search方法的实现中我们调用了TestDao的search方法,这样,在TestController中调用TestService中声明的方法时,它会在TestServiceImpl中找到具体的方法实现并调用它,然后调用TestDao中声明的方法,通过dao与sqlmap.xml的关联,找到sqlmap.xml中的具体sql语句,然后对数据库进行读写。

@Service
public class TestServiceImpl implements TestService{
@Resource
private TestDao testDao;

public List<TestEntity> search(TestEntity testEntity){
return testDao.search(testEntity);
}

public void add(TestEntity testEntity){
testDao.add(testEntity);
}
}


最后,我们来看一个Controller层的编写。先上代码。

@Controller
public class TestController {
@Resource
private TestService testService;

@RequestMapping("/search")
@ResponseBody
public TestBack searchTest(TestForm form){
TestBack back = new TestBack();
TestEntity entity = new TestEntity();
entity.setName(form.getName());
entity.setGrade(form.getGrade());
back.setData_list(testService.search(entity));
back.setError_no(0);
back.setError_info("ok");
return back;
}

@RequestMapping("/add")
@ResponseBody
public TestBack addTest(TestForm form){
TestBack back = new TestBack();
TestEntity entity = new TestEntity();
entity.setName(form.getName());
entity.setGrade(form.getGrade());
testService.add(entity);
back.setError_no(0);
back.setError_info("ok");
return back;
}
}


我们先来看一下方法声明的入参,和返回值,都是两个对象,

public TestBack addTest(TestForm form)


入参是一个TestForm对象,返回值是一个TestBack对象,

public class TestForm {
private String name;
private String grade;
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public String getGrade() {return grade;}
public void setGrade(String grade) {this.grade = grade;}
}


这里面有两个变量name和grade,springmvc可以对请求中的包含的数据进行分析,并把变量名相同的数据封装到TestForm对象中,

public TestBack addTest(TestForm form)
,这个方法,当请求的url的这个方法的RequestMapping的属性匹配的时候,springmvc将会执行这个addTest方法,并从请求中获取数据,将对应的变量注入到TestForm对象的form实例中。

然后,我们可以通过TestForm的get方法,得到请求体中的数据。

我们再来看一下addTest接口的返回值。TestBack,

public class TestBack<T>{
private int error_no;
private String error_info;
private T data_list;
public int getError_no() {
return error_no;
}

public void setError_no(int error_no) {
this.error_no = error_no;
}

public String getError_info() {
return error_info;
}

public void setError_info(String error_info) {
this.error_info = error_info;
}

public T getData_list() {
return data_list;
}

public void setData_list(T data_list) {
this.data_list = data_list;
}
}


这个类中有三个变量,error_no错误号,error_info错误信息,data_list返回数据实体。

back.setData_list(testService.search(entity));
back.setError_no(0);
back.setError_info("ok");


在获取到数据库数据之后,我们可以将返回的数据放到data_list中,并返回相应的错误号和错误信息,错误号0表示执行成功。我们接口返回的是一个对象,但是因为我们配置中配置了fastjson,可以将返回的对象自动转换成json格式传给前端,所以我们在前端调用该接口的时候获取到的是json格式的数据。

最后,我们来测试一下接口,我们配置好tomcat服务器(具体方法可以网上找,这个很多的),然后打开浏览器 输入add接口的地址
http://localhost:8888/add?name=test&grade=100
;并传入两个参数name,grade。回车,然后可以看到服务器返回的信息
{"error_info":"ok","error_no":0}
,数据库中也已经有了数据了,


然后我们来测试一个search接口,打开浏览器输入
http://localhost:8888/search
不传入任何参数,可以看到服务器给我们返回的信息,
{"data_list":[{"grade":"100","name":"test"}],"error_info":"ok","error_no":0}


可以看到,我们刚刚插入的数据已经给我们返回了。到这里,maven+spring+mybatis框架的搭建和测试就已经完成了。如果有不对的地方或者任何疑问,欢迎大家指出。

(有关于注解部分,如@Controller,@Service,@Repository,@Resource,@RequestMapping(“/search”),@ResponseBody这些注解的作用我就不在这里解释了,大家可以上网查一下。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring mvc mybatis maven