自定义一个简单的MVC框架

1. model模型

这是一个具体的JavaBean类,该类提供了私有属性的getter和setter属性
Product.java

public class Product {
    private String pid;
    private String name;
    private String img;
    private double price;

    public String getPid() {
        return pid;
    }

    public void setPid(String pid) {
        this.pid = pid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getImg() {
        return img;
    }

    public void setImg(String img) {
        this.img = img;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

此类的四个属性分别是

  1. 商品的id
  2. 商品的名字
  3. 商品的价格
  4. 商品的图片名

2.view视图

index.jsp 用于提交用户输入的商品信息

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<c:if test="${error != null}">
    <c:forEach items="${error}" var="e">
        <ul>
            <font color="red">${e}</font>
        </ul>
    </c:forEach>
</c:if>
<form action="Detail" method="post">
    pid:<input type="text" name="id"> <br>
    name: <input type="text" name="pname">  <br>
    price: <input type="text" name="price">  <br>
    img: <input type="text" name="img">  <br>
    <input type="submit" value="submit">
</form>
</body>
</html>

该页面是一个jsp页面并且使用了jstl,所以我们必须要在pom.xml中添加对应的依赖
jsp依赖:

        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
            <scope>provided</scope>
        </dependency>

jstl依赖

       <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

product.jsp 用于展示商品的信息

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>
<head>
    <title>商品详情页</title>
</head>
<body>
pid:${product.pid} <br>
name :${product.name} <br>
price:${product.price} <br>
img: ${product.img} <br>

</body>
</html>

3.controller 控制器

本实例通过对多个请求的控制来跳转到不同的页面。
首先定义一个负责解析请求地址来分发到不同控制器的Servlet
DispatcherServlet.java

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(urlPatterns ={"/Input","/Detail"} )
public class DispatcherServlet extends HttpServlet {
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       String requestURI = request.getRequestURI();
       String url = requestURI.substring(requestURI.lastIndexOf("/")+1);
       System.out.println(url);
       Controller controller = null;
       if ("Input".equals(url)) {
          controller = new ProductInputController();
       } else if ("Detail".equals(url)) {
           controller = new ProductDetailController();
       }
       String s = controller.handleRequest(request, response);
       request.getRequestDispatcher(s).forward(request,response);
   }

   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       doPost(request,response);
   }
}

我们可以得到用户在地址栏里输入的地址并且获取到用户想要跳转到哪个页面,由于本实例有两个jsp页面,所以我们可以通过接口来定义一个处理用户输入地址的请求代码如下:
Controller.java

package com.qc.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface Controller {
    String handleRequest(HttpServletRequest request, HttpServletResponse response);
}

ProductInputController.java
处理输入商品信息请求的类
该类实现了Controller接口,重写里面的handleRequest方法

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ProductInputController implements Controller {


    @Override
    public String handleRequest(HttpServletRequest request, HttpServletResponse response) {

        return "WEB-INF/view/index.jsp";
    }
}

此类的作用就是返回一个index.jsp路径到DispatcherServlet.java类中,并通过此类来转发到index.jsp页面

ProductDetailController.java
处理显示商品信息请求的类
该类实现了Controller接口,重写里面的handleRequest方法


import com.qc.bean.Product;
import com.qc.form.ProductForm;
import com.qc.validate.ProductValidate;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

public class ProductDetailController implements Controller {

    @Override
    public String handleRequest(HttpServletRequest request, HttpServletResponse response) {
        //验证传过来的值是否合法
        //首先获取值
        String name = request.getParameter("pname");
        String p = request.getParameter("price");
        String img = request.getParameter("img");
        ProductForm form = new ProductForm();

        double price = p == null? 0.0 :Double.parseDouble(p);
        form.setName(name);
        form.setPrice(price);
        form.setImg(img);

        ProductValidate pv = new ProductValidate();
        List<String> error = pv.validate(form);
        if (error.size() != 0) {
            request.setAttribute("error", error);
            return "WEB-INF/view/index.jsp";
        }
        String pid = request.getParameter("id");
        Product product = new Product();
        product.setPid(pid);
        product.setName(name);
        product.setPrice(price);
        product.setImg(img);
        request.setAttribute("product",product);
        return "WEB-INF/view/product.jsp";
    }
}

此类的目地是处理从页面传过来的商品信息,当传过来的商品信息合规时就会返回展示商品信息的jsp页面(product.jsp),如果不合规时就会跳转到输入商品信息的页面(index.jsp)同时显示不合理的信息内容。

在处理之前我们需要创建一个ProductForm.java,主要⽤来做商品信息的校验。

ProductForm.java

public class ProductForm {
    private String name;
    private double price;
    private String img;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String getImg() {
        return img;
    }

    public void setImg(String img) {
        this.img = img;
    }
}

和JavaBean差不多,目地是把有可能出现不合理信息属性的内容放到一个java对象中

下面是处理不合理的商品信息的类

ProductValidate.java

import com.qc.form.ProductForm;

import java.util.ArrayList;
import java.util.List;

public class ProductValidate {


    public List<String> validate(ProductForm pf) {
        List<String> error = new ArrayList<>();
        String name = pf.getName();
        double price = pf.getPrice();
        String img = pf.getImg();

        if (name == null || name.length() == 0) {
            error.add("product name must not be empty.");
        }
        if(img == null || img.length() == 0){
            error.add("product image must not be empty.");
        }

        if(price < 0){
            error.add("the price of product must be a positive number.");
        }
        return error;
    }
}

此类通过定义一个List集合来存储错误信息,这些错误信息通过判断传过来的商品信息内容(商品名是否为null或者不存在,商品图片名是否为null或者不存在,输入的商品价格是否小于零)来存储的,返回的是一个List集合到ProductDetailController.java类中,在该类中通过判断返回的List集合里是否有值来跳转到不同页面。

  1. List集合有值:输入的商品信息不合理,不能显示在页面中因此跳转到index.jsp页面并显示错误信息
  2. List集合没有值:说明输入的商品信息正确,把正确的商品信息放到对象中并保存在request域然后跳转到显示商品信息的页面product.jsp进行展示。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容

  • JSP总结(经典) day1 JSP 定义: 1)Java Server Page, Java EE 组件,本...
    java日记阅读 3,421评论 0 13
  • 对于java中的思考的方向,1必须要看前端的页面,对于前端的页面基本的逻辑,如果能理解最好,不理解也要知道几点。 ...
    神尤鲁道夫阅读 806评论 0 0
  • 一. Java基础部分.................................................
    wy_sure阅读 3,805评论 0 11
  • 原文链接:blog.ouyangsihai.cn >> jsp看这篇文章就够了 一、JSP基础语法 1、JSP模板...
    程序员欧阳阅读 1,973评论 0 33
  • 1.学习内容 JSP技术入门和常用指令 JSP的内置对象&标签介绍 EL表达式&EL的内置对象 2.JSP技术入门...
    WendyVIV阅读 2,128评论 1 18