案例实现

133 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情

综合案例

image.png

1.查询所有

image.png 后端代码:

1.在BrandMapper接口中定义方法

@Select表示sql查询语句

@ResultMap是对结果的映射集,即将实体类中的属性与数据库中的列名对应上

//查询所有
@Select("select*from tb_brand")
@ResultMap("brandResultMap")
List<Brand> selectAll();

2.在BrandService接口中定义方法

public interface BrandService {
    //查询所有
    List<Brand> selectAll();
}

3.在BrandServiceImpl中

//1.创建SqlSessionFactory工厂对象
SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory();
@Override
public List<Brand> selectAll() {
    //2.获取SqlSessionFactory工厂对象
    SqlSession sqlSession = factory.openSession();
    //3.获取BrandMapper
    BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
    //4.调用方法
    List<Brand> brands = mapper.selectAll();
    //5.释放资源
    sqlSession.close();

    return brands;
}

4.在selectAllServlet中重写get,post方法

@WebServlet("/selectAllServlet")
public class selectAllServlet extends HttpServlet {
    private BrandService brandService = new BrandServiceImpl();

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.调用service查询
        List<Brand> brands = brandService.selectAll();
        //2.转为json
        String jsonString = JSON.toJSONString(brands);
        //3.写数据
        response.setContentType("text/json;charset=utf-8");
        response.getWriter().write(jsonString);
    }

前端代码:

PS:记得要先找对应方法的按钮并加上绑定@click=“方法名”

var _this = this

t:上述代码在前端页面中基本都需要使用,原因是this无法在里面使用(不懂)

<script src="js/axios-0.18.0.js"></script>
<script>
    new Vue({
        el: "#app",
        mounted(){
            //当页面加载完成后,发送异步请求,获取数据
            var _this = this;
            axios({
                method:"get",
                url:"http://localhost:8080/brand-case/selectAllServlet"
            }).then(function (resp) {
                _this.tableData = resp.data;
                
            })
        },

完成上述代码后即可在页面中显示后端数据

t:html的设置只是一种形式,尽量去记住就行了。

添加品牌

image.png 后端代码:

1.BrandMapper接口中定义添加方法

@Insert("insert into tb_brand values(null,#{brandName},#{companyName},#{ordered},#{description},#{status})")
void add(Brand brand);

2.BrandService接口中定义方法

//添加
void add(Brand brand);

3.BrandServiceImpl中实现方法,记得要提交(commit)事务

@Override
public void add(Brand brand) {
    //2.获取SqlSessionFactory工厂对象
    SqlSession sqlSession = factory.openSession();
    //3.获取BrandMapper
    BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
    //4.调用方法
    mapper.add(brand);
    sqlSession.commit();//提交事务
    //5.释放资源
    sqlSession.close();
}

4.AddServlet中

注:此时getParams无法转化为json格式,因此采用下面这种方式

private BrandService brandService = new BrandServiceImpl();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //1.接收品牌数据
    BufferedReader br = request.getReader();
    String params = br.readLine();//json字符串
    //2.转为Brand对象
    Brand brand = JSON.parseObject(params, Brand.class);
    //3.调用service添加
    brandService.add(brand);
    //4.响应成功的标识
    response.getWriter().write("success");
}

前端代码:

PS:记得要先找对应方法的按钮并加上绑定@click=“方法名”

this.dialogVisible=false;

t:1.表示将窗口隐藏,一般出现在if语句中,即表示当确定为某条件时,将窗口关闭

2.需要解决新增后不用刷新就能看到新增后的内容。

:直接使用上面的selectAll方法,由于该方法使用次数多,因此直接封装成一个方法

methods: {
    //查询所有数据的方法
    selectAll() {
        //当页面加载完成后,发送异步请求,获取数据
        var _this = this;
        axios({
            method: "get",
            url: "http://localhost:8080/brand-case/selectAllServlet"
        }).then(function (resp) {
            _this.tableData = resp.data;

        })

3.添加成功后,提示添加成功的信息框

//3.定义添加成功的提示
_this.$message({
    message: '恭喜你,添加成功',
    type: 'success'
});

PS:_this真的十分重要,出错了第一时间看看是不是没有使用

完整代码如下

// 添加数据
addBrand(){
    var _this = this;
    //发送ajax请求,添加数据
    axios({
        method:"post",
        url:"http://localhost:8080/brand-case/addServlet",
        data:_this.brand
    }).then(function (resp){
        if(resp.data == "success"){
            //添加成功
            //1.关闭窗口
            _this.dialogVisible=false;
            //2.重新查询数据
            _this.selectAll();
            //3.定义添加成功的提示
            _this.$message({
                message: '恭喜你,添加成功',
                type: 'success'
            });
        }

Servlet代码优化

问题阐述:Web层的Servlet个数太多了,不利于管理和编写

解决方案:将Servlet进行归类,对于同一个实体的操作方法,写到一个Servlet中。比如: BrandServlet、UserServlet,如下图所示

image.png 1.先定义一个BaseServlet代替HttpServlet,根据请求的最后一段路径进行方法分发

t:

1.获取请求路径需要用到getRequestURI方法

2.获取最后一段路径,方法名用到2个方法

3.此时在BaseServlet中的this表示”谁调用我,我代表谁“

4.在获取方法Method对象时,由于需要传入参数,因此需要将定义过的方法都统一成传入req,resp,而这两个参数在BaseServlet中的service中的方法都有提供

5.利用反射获得到对应调用方法的Class,Class.getMethod(方法名字,HttpServletRequest.class, HttpServletResponse.class)即可获得到Method对象method

6.最后通过method.invoke(this,req,resp);执行方法

代码实现如下:

public class BaseServlet extends HttpServlet {
    //根据请求的最后一段路径进行方法分发
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取请求路径
        String uri = req.getRequestURI();//此时获取到的是/brand-case/brand/selectAll
        //2.获取最后一段路径,方法名
        int index = uri.lastIndexOf("/");
        String methodName = uri.substring(index+1);//  index:/selectAll index+1:selectAll
        //3.执行方法
        //3.1获取BrandServlet字节码对象Class,利用反射
        Class<? extends BaseServlet> cls = this.getClass();

        try {
            //3.2获取方法Method对象
            Method method = cls.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            //3.3执行方法
            method.invoke(this,req,resp);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }

还要定义一个BrandServlet继承于BaseServlet

将先前在各方法Servlet中的doGet方法体粘贴至对应方法即可

@WebServlet("/brand/*")
public class BrandServlet extends BaseServlet{
    private BrandService brandService = new BrandServiceImpl();
    public void selectAll(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        //1.调用service查询
        List<Brand> brands = brandService.selectAll();
        //2.转为json
        String jsonString = JSON.toJSONString(brands);
        //3.写数据
        response.setContentType("text/json;charset=utf-8");
        response.getWriter().write(jsonString);
    }
    public void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        //1.接收品牌数据
        BufferedReader br = request.getReader();
        String params = br.readLine();//json字符串
        //2.转为Brand对象
        Brand brand = JSON.parseObject(params, Brand.class);
        //3.调用service添加
        brandService.add(brand);
        //4.响应成功的标识
        response.getWriter().write("success");
    }

前端代码中的路径也记得一定要修改