模擬Spring mvc

1.Spring mvc

MVC
? m:model:模型,javabean

? v:view:視圖,html/jsp

? c:controller:控制器:servlet

為了提高程序的安全性,將所有的頁(yè)面都放入webapp/WEB-INF/view目錄下,index.html頁(yè)面無(wú)法直接訪問(wèn),需要專門建立一個(gè)Sevlet來(lái)訪問(wèn)該頁(yè)面,實(shí)現(xiàn)內(nèi)容請(qǐng)求轉(zhuǎn)發(fā)

index.html頁(yè)面

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
<h1>this is index.html</h1>

    <form action="/ProductDetail" method="post">
        pid:    <input type="text" name="pid"> <br>
        pname:  <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>

prodoct.jsp

<%--
  Created by IntelliJ IDEA.
  User: 91yuwenle
  Date: 2020/3/2
  Time: 20:36
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>product</title>
</head>
<body>
<h1>this is product.jsp</h1>
    <h3>pid:${pt.pid}</h3>
    <h3>pname:${pt.pname}</h3>
    <h3>price:${pt.price}</h3>
    <h3>img:${pt.img}</h3>
</body>
</html>

1.自定義一個(gè)Contorller接口 Controller.java

package com.jinFang.mvc.controller;

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

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

}

2.不同實(shí)現(xiàn)類分別實(shí)現(xiàn)Contorller接口
1.ProductInputController.java

package com.jinFang.mvc.controller;

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.html";
    }
}

2.ProductDetailController.java

package com.jinFang.mvc.controller;

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

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

public class ProductDetailController implements Controller {
    @Override
    public String handleRequest(HttpServletRequest request, HttpServletResponse response) {


        String spid=request.getParameter("pid");
        String pname=request.getParameter("pname");
        String sprice=request.getParameter("price");
        String img=request.getParameter("img");

        int pid=spid==null?0:Integer.parseInt(spid);
        Double price=sprice==null?0.0:Double.parseDouble(sprice);


        ProductForm pf=new ProductForm();

        pf.setPname(pname);
        pf.setPrice(price);
        pf.setImg(img);


        ProductValidate pv = new ProductValidate();

        List<String> errors=pv.validate(pf);

        if (errors!=null && !errors.isEmpty()){
            request.setAttribute("errors", errors);
            return "/WEB-INF/view/index.jsp";
        }else {

            Product pt=new Product();

            pt.setPid(pid);
            pt.setPname(pname);
            pt.setPrice(price);
            pt.setImg(img);

            request.setAttribute("pt",pt);

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

    }
}

3.DispatcherServlet.java 負(fù)責(zé)將多個(gè)請(qǐng)求分發(fā)給各自不同的控制器

package com.jinFang.mvc.controller;

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 = {"/ProductInput","/ProductDetail"})
public class DispatcherServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String urlPattern = request.getRequestURI();
        String action = urlPattern.substring(urlPattern.lastIndexOf("/")+1);


        Controller coll=null;

        if ("ProductInput".equalsIgnoreCase(action)){
            coll=new ProductInputController();
        }else if ("ProductDetail".equalsIgnoreCase(action)){
            coll=new ProductDetailController();
        }


        String url=coll.handleRequest(request,response);

        request.getRequestDispatcher(url).forward(request,response);

    }

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

結(jié)論:多個(gè)請(qǐng)求可以交給同一個(gè)Servlet(DispatcherServlet),然后各自不同的請(qǐng)求會(huì)交給各自的控制器。所有請(qǐng)求都叫個(gè)DispatcerServet,該角色相當(dāng)于一個(gè)前端控制器,可以大大的提高客戶的以及服務(wù)器端的工作效率。

添加一個(gè)校驗(yàn)功能

新增一個(gè)ProductForm.java,主要用來(lái)做Product校驗(yàn),struts1有專門的formbean對(duì)象用來(lái)校驗(yàn)表單數(shù)據(jù),在某些框架中將formbean與bean對(duì)象合二為一了

package com.jinFang.form;

public class ProductForm {
    private String pname;
    private Double price;
    private String img;

    public String getPname() {
        return pname;
    }

    public void setPname(String pname) {
        this.pname = pname;
    }

    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;
    }

    @Override
    public String toString() {
        return "ProductForm{" +
                "pname='" + pname + '\'' +
                ", price=" + price +
                ", img='" + img + '\'' +
                '}';
    }
}

2.ProductValidate.java,用來(lái)完成對(duì)于formbean進(jìn)行校驗(yàn),如果校驗(yàn)不通過(guò),則將錯(cuò)誤信息存儲(chǔ)起來(lái)

package com.jinFang.validate;

import com.jinFang.form.ProductForm;

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

public class ProductValidate {

    public List <String> validate(ProductForm productForm){

        List<String> errors=null;

        String pname = productForm.getPname();
        Double price = productForm.getPrice();
        String img = productForm.getImg();

        errors=new ArrayList<>();

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

        return errors;
    }
}

更新過(guò)程已在ProductDetailController.java

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 對(duì)于java中的思考的方向,1必須要看前端的頁(yè)面,對(duì)于前端的頁(yè)面基本的邏輯,如果能理解最好,不理解也要知道幾點(diǎn)。 ...
    神尤魯?shù)婪?/span>閱讀 901評(píng)論 0 0
  • 16. Web MVC 框架 16.1 Spring Web MVC 框架介紹 Spring Web 模型-視圖-...
    此魚不得水閱讀 1,158評(píng)論 0 4
  • Spring MVC一、什么是 Spring MVCSpring MVC 屬于 SpringFrameWork 的...
    任任任任師艷閱讀 3,535評(píng)論 0 32
  • IOC 控制反轉(zhuǎn)容器控制程序?qū)ο笾g的關(guān)系,而不是傳統(tǒng)實(shí)現(xiàn)中,有程序代碼之間控制,又名依賴注入。All 類的創(chuàng)建,...
    irckwk1閱讀 1,097評(píng)論 0 0
  • Spring MVC 1、簡(jiǎn)介 1.1 Web MVC 在Web開發(fā)中,通常是瀏覽器發(fā)送請(qǐng)求到服務(wù)器,由服務(wù)器接收...
    開發(fā)者如是說(shuō)閱讀 475評(píng)論 0 5

友情鏈接更多精彩內(nèi)容