day14_8-MVC-WEB_CRUD

一、 MVC思想

MVC

M:Model:模型对象(封装业务操作,算法,可重复使用,JavaBean).DAO Domain
V:View:视图(界面,JSP,HTML)
C:Controler:控制器(控制界面跳转,Servlet)

    以Servlet为中心(所有请求都发送给Servlet):
    JSP + Servlet + JavaBean .

servlet/JSP/JavaBean的职责:
JSP:    界面输出.
Servlet:
    1:接受请求参数
    2:调用业务方法,处理请求
    3:控制界面跳转.
JavaBean:
      封装业务操作,可重复使用.

目的:

责任分离,把业务代码从视图中剥离出来.

二、 三层架构

含义

分层开发模式(技术层面的"分而治之")

  • 三层架构(3-tier architecture) :

通常意义上的三层架构就是将整个业务应用划分为:表现层、业务逻辑层、数据访问层。

三层架构

目的:

区分层次的目的即为了“高内聚低耦合”的思想

三、 WEB CRUD

1.目录结构

mybatis crud的基础上添加了以下内容


WEB CRUD目录结构

2.请求分发

在service方法中,想要去区分开到底是哪个请求,可以增加一个参数来区分

  • 通过地址栏的参数来进入不同的业务
  • EmployeeServlet.java
//引入业务层
    private IEmployeeService empService = new EmployeeServiceImpl();

    // http://localhost/emp?cmd=list                做查询操作
    // http://localhost/emp?cmd=saveOrUpdate        做保存或修改
    // http://localhost/emp?cmd=delete              做删除操作
    // http://localhost/emp?cmd=edit                跳转到编辑页面

    // 请求分发
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        // 获取cmd的值 ,去判断是做什么操作
        String cmd = req.getParameter("cmd");
        if ("delete".equals(cmd)) {
            delete(req,resp);
        } else if ("edit".equals(cmd)) {
            edit(req,resp);
        } else if ("saveOrUpdate".equals(cmd)) {
            saveOrUpdate(req,resp);
        } else{
            list(req,resp);
        }
            
    }

    protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    ....
    }
    protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    ....
    }
    protected void edit(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    ....        
    } 
    protected void saveOrUpdate(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        
    ....    
    }
    
    // 请求数据转化为employee对象
    private void req2emp(HttpServletRequest req,Employee emp){
        String name = req.getParameter("name");
        String strAge = req.getParameter("age");
        String strSalary = req.getParameter("salary");
        
        emp.setName(name);
        // 判断字符串是否为空
        if(StringUtil.hasLength(strAge)){
            emp.setAge(Integer.valueOf(strAge));
        }
        if(StringUtil.hasLength(strSalary)){
            emp.setSalary(new BigDecimal(strSalary));
        }
    }

3.查询商品

  • 流程:


    查询商品
protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1.接受请求参数,封装成对象
        // 2.调用业务方法处理请求
        List<Employee> list = empService.listAll();
        // 设置共享参数
        req.setAttribute("list", list);
        // 3.控制页面的跳转
        req.getRequestDispatcher("/WEB-INF/view/employee/list.jsp").forward(req, resp);
    }

4.删除请求

  • 流程


    删除请求
protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1接受id的值
        String strId = req.getParameter("id");
        // 判断id不为空,把字符串的id转化为Long类型
        if(StringUtil.hasLength(strId)){
            Long id = Long.valueOf(strId);
            // 2调用业务方法处理请求
            empService.delete(id);
        }
        // 3.重定向跳转到列表页
        resp.sendRedirect("/emp");
    }

5.编辑界面

  • 流程

使用getRequestDispatcher为可以共享参数

编辑界面
protected void edit(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取id的值
        String strId = req.getParameter("id");
        // 判读id是否有值,来辨别是    添加   or  编辑 操作
        if(StringUtil.hasLength(strId)){
            Employee employee = empService.get(Long.valueOf(strId));
            // 设置共享参数
            req.setAttribute("emp", employee);
        }
        // 页面的跳转,跳转到input.jsp
        req.getRequestDispatcher("/WEB-INF/view/employee/input.jsp").forward(req, resp);
    } 

6.保存添加 或 更新

  • 流程:


    保存添加 或 更新
protected void saveOrUpdate(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        
        // 1.接受请求参数,封装成对象
        // 获取id的值
        String strId = req.getParameter("id");
        Employee emp = new Employee();
        req2emp(req, emp);
        // 2.调用业务方法处理请求
        if(StringUtil.hasLength(strId)){
            emp.setId(Long.valueOf(strId));
            empService.update(emp);
        }else{
            empService.save(emp);
        }
        // 3.控制跳转
        resp.sendRedirect("/emp");
    }
    
    // 请求数据转化为employee对象
    private void req2emp(HttpServletRequest req,Employee emp){
        String name = req.getParameter("name");
        String strAge = req.getParameter("age");
        String strSalary = req.getParameter("salary");
        
        emp.setName(name);
        // 判断字符串是否为空
        if(StringUtil.hasLength(strAge)){
            emp.setAge(Integer.valueOf(strAge));
        }
        if(StringUtil.hasLength(strSalary)){
            emp.setSalary(new BigDecimal(strSalary));
        }
    }

四、 WEB CRUD——user表

1.主要注意的地方

UserServlet需要添加请求,来获取user新增的传递参数hiredate,并判断是否为空

  • UserServlet
// 请求数据转化为user对象
    private void req2user(HttpServletRequest req,User user){
        String name = req.getParameter("name");
        String strAge = req.getParameter("age");
        String strSalary = req.getParameter("salary");
        String strHiredate = req.getParameter("hiredate");
        
        user.setName(name);
        // 判断字符串是否为空
        if(StringUtil.hasLength(strAge)){
            user.setAge(Integer.valueOf(strAge));
        }
        if(StringUtil.hasLength(strSalary)){
            user.setSalary(new BigDecimal(strSalary));
        }
        
        if(StringUtil.hasLength(strHiredate)){
            user.setHiredate(Date.valueOf(strHiredate));
        }
    }

表现层的jsp也要新增入职时间(hiredate)列,
添加标签库
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
以格式为中国的时间格式渲染到页面
<fmt:formatDate value="${user.hiredate}" pattern="yyyy-MM-dd"/>

  • list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>list用户列表</title>
</head>
<body>
    <%-- ${list}<br/> --%>
    <table border="1" cellpadding="0" cellspacing="0" width="80%" align="center" style="border-color: red;">
    <caption style="text-align:left">
            <a href="/user?cmd=edit" >添加</a>
    </caption>
        <tr>
            <th>序号</th>
            <th>ID</th>
            <th>姓名</th>
            <th>年龄</th>
            <th>工资</th>
            <th>入职时间</th>
            <th>操作</th>
        </tr>
        <c:forEach items="${list}" var="user" varStatus="vs">
            <tr align="center">
                <td style="color: red;">${vs.count}</td>
                <td>${user.id}</td>
                <td>${user.name}</td>
                <td>${user.age}</td>
                <td>${user.salary}</td>
                <td>
                        <fmt:formatDate value="${user.hiredate}" pattern="yyyy-MM-dd"/>
                </td>
                <td>
                    <a href="/user?cmd=delete&id=${user.id}">删除 </a> 
                    <a href="/user?cmd=edit&id=${user.id}">编辑</a>
                </td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

同样要修改input.jsp 编辑保存页,格式化为yyyy-MM-dd的中国时间,这样date类型的input才能正确识别显示出用-分开的yyyy-MM-dd 格式时间字符串。

  • input.jsp


    input.jsp编辑保存页入职时间
input.jsp编辑保存页入职时间渲染
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>input</title>
</head>
<body>
    <h3>${empty user ? '添加' : '编辑'}用户信息</h3>
    <form action="/user?cmd=saveOrUpdate" method="post">
        <input type="hidden" name="id" value="${user.id}">
        <p>姓名: <input type="text" name="name" value="${user.name}"> </p>
        <p>年龄: <input type="number" name="age" value="${user.age}"> </p>
        <p>薪资: <input type="number" step="0.01" name="salary" value="${user.salary}"> </p>
        <p>入职时间: 
            <input style="font-family:sans-serif;" type="date" name="hiredate" 
            value="<fmt:formatDate value="${user.hiredate}" pattern="yyyy-MM-dd"/>"> 
        </p>
        <input type="submit" value="${empty user ? '添加' : '修改'}">
    </form>
</body>
</html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容

  • 三层架构和MVC是有明显区别的,MVC应该是展现模式(三个加起来以后才是三层架构中的UI层) 三层架构(3-tie...
    李大西瓜阅读 355评论 0 0
  • 又看到有人在问三层架构和MVC的关系,感觉这种问题有点教条化了。因为它们都在逻辑上将应用程序划为三块,凑了一个数字...
    Ludiwgbet阅读 1,883评论 1 12
  • ASP.NET MVC 是一个全新的Web应用框架 ASP.NET 代表支撑应用框架的技术平台,表明ASP.NET...
    JunChow520阅读 1,243评论 0 1
  • 三层架构和MVC 三层架构 (3-tier application) 是将整个业务应用划分为:表现层(UI)、业务...
    hnscdg阅读 1,772评论 0 8
  • 丁香医生显示下载确诊的病例有20471,疑似的23214,死亡425,治愈632人。感觉好吓人啊。希望疫情赶快过去...
    偲儿阅读 534评论 0 0