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

3 篇文章 0 订阅
3 篇文章 0 订阅
  1. 前面的文章已经讲过了如何搭建一个maven+springmvc+mybatis的web项目环境。现在我们需要写一些实体类来跑一下springmvc的整体流程。
  2. 上面的图片是整个java后台的结构,用红线框出来的部分你们不用理会,首先,在java目录下面我新建了一个com.zhengtx的包,然后在包里面分了一个小模块,controller,dao,entity,service.
  3. 我们先看一下当一个请求过来的后台具体流程,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语句。
  4. 我们先来看一下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;}
}
  1. 我们再从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);
}
  1. 然后我们看一下和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);
}
  1. 在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);
    }
}
  1. 最后,我们来看一个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格式的数据。

  1. 最后,我们来测试一下接口,我们配置好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这些注解的作用我就不在这里解释了,大家可以上网查一下。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值