自定义一个简单的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进行展示。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

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

友情链接更多精彩内容