MyMVC模擬實現(xiàn)(#千鋒#)

一. 階段一

1.index.html頁面

<!DOCTYPE html>

<html lang="en">

<head>

? ? <meta charset="UTF-8">

? ? <title>index</title>

</head>

<body>

? ? <h1>this is index page.</h1>

? ? <form method="post" action="ProductServlet">

? ? ? ? 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" /><br />

? ? </form>

</body>

</html>

2.ProductServlet.java

package com.zy.controller;

import com.qfedu.bean.Product;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

@javax.servlet.annotation.WebServlet(urlPatterns = "/ProductServlet")

public class ProductServlet extends HttpServlet {

? ? protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

? ? ? ? //System.out.println(123);

? ? ? ? String pid = request.getParameter("pid");

? ? ? ? String pname = request.getParameter("pname");

? ? ? ? String sprice = request.getParameter("price");

? ? ? ? String img = request.getParameter("img");

? ? ? ? double price = sprice == null ? 0.0 : Double.parseDouble(sprice);

? ? ? ? System.out.println("pid : " + pid);

? ? ? ? System.out.println("price : " + sprice);

? ? ? ? System.out.println("pname : " + pname);

? ? ? ? System.out.println("img : " + img);

? ? ? ? Product p = new Product();

? ? ? ? p.setPid(pid);

? ? ? ? p.setPname(pname);

? ? ? ? p.setImg(img);

? ? ? ? p.setPrice(price);

? ? ? ? request.setAttribute("p", p);

? ? ? ? request.getRequestDispatcher("product.jsp").forward(request,response);

? ? }

? ? protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

? ? ? ? doPost(request, response);

? ? }

}

3.Product.jsp

<%--

? Created by IntelliJ IDEA.

? User: james

? Date: 2020/3/2

? Time: 2:52 PM

? 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 detail page.</h1>

? ? <%--

? ? ? ? ognl: 對象導航語言

? ? ? ? ? ? user.addr.province;

? ? --%>

? ? <h3>pid : ${p.pid}</h3>

? ? <h3>pname : ${p.pname}</h3>

? ? <h3>price : ${p.price}</h3>

? ? <h3>img : ${p.img}</h3>

</body>

</html>

可以實現(xiàn)頁面的跳轉以及數(shù)據(jù)的展示

問題:頁面都在webapp下,安全性不高

二. 階段二


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

新建一個Servlet來實現(xiàn)內(nèi)部轉發(fā)?

4.ProductInputServlet.java

package com.zy.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 = "/ProductInputServlet")

public class ProductInputServlet extends HttpServlet {

? ? protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

? ? ? ? request.getRequestDispatcher("/WEB-INF/view/index.html").forward(request, response);

? ? }

? ? protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

? ? ? ? doPost(request, response);

? ? }

}

webapp下的WEB-INF/view/index.html頁面可以直接訪問,更新ProductServlet.java

package com.zy.controller;

import com.qfedu.bean.Product;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

@javax.servlet.annotation.WebServlet(urlPatterns = "/ProductServlet")

public class ProductServlet extends HttpServlet {

? ? protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

? ? ? ? //System.out.println(123);

? ? ? ? String pid = request.getParameter("pid");

? ? ? ? String pname = request.getParameter("pname");

? ? ? ? String sprice = request.getParameter("price");

? ? ? ? String img = request.getParameter("img");

? ? ? ? double price = sprice == null ? 0.0 : Double.parseDouble(sprice);

? ? ? ? System.out.println("pid : " + pid);

? ? ? ? System.out.println("price : " + sprice);

? ? ? ? System.out.println("pname : " + pname);

? ? ? ? System.out.println("img : " + img);

? ? ? ? Product p = new Product();

? ? ? ? p.setPid(pid);

? ? ? ? p.setPname(pname);

? ? ? ? p.setImg(img);

? ? ? ? p.setPrice(price);

? ? ? ? request.setAttribute("p", p);

? ? ? ? //request.getRequestDispatcher("product.jsp").forward(request,response);

? ? ? ? request.getRequestDispatcher("/WEB-INF/view/product.jsp").forward(request,response);

? ? }

? ? protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

? ? ? ? doPost(request, response);

? ? }

}

三. 階段三,模擬Spring MVC的具體實現(xiàn)

1.Controller.java

package com.zy.mvc.controller;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

/**

* 自定義接口,實現(xiàn)管理多個請求,在模擬Spring MVC中的控制器

*/

public interface Controller {

? ? String handleRequest(HttpServletRequest request, HttpServletResponse response);

}

2.ProductInputController.java

package com.zy.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";

? ? }

}

3.ProductDetailController.java

package com.zy.mvc.controller;

import com.zy.bean.Product;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class ProductDetailController implements Controller {

? ? @Override

? ? public String handleRequest(HttpServletRequest request, HttpServletResponse response) {

? ? ? ? String pid = request.getParameter("pid");

? ? ? ? String pname = request.getParameter("pname");

? ? ? ? String sprice = request.getParameter("price");

? ? ? ? String img = request.getParameter("img");

? ? ? ? double price = sprice == null ? 0.0 : Double.parseDouble(sprice);

? ? ? ? System.out.println("pid : " + pid);

? ? ? ? System.out.println("price : " + sprice);

? ? ? ? System.out.println("pname : " + pname);

? ? ? ? System.out.println("img : " + img);

? ? ? ? Product p = new Product();

? ? ? ? p.setPid(pid);

? ? ? ? p.setPname(pname);

? ? ? ? p.setImg(img);

? ? ? ? p.setPrice(price);

? ? ? ? request.setAttribute("p", p);

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

? ? }

}

4.DispatcherServlet.java負責將多個請求分發(fā)給各自不同的控制器

package com.zy.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 requestURI = request.getRequestURI();

? ? ? ? //System.out.println(requestURI);

? ? ? ? String action = requestURI.substring(requestURI.lastIndexOf("/") + 1);

? ? ? ? //System.out.println(action);

? ? ? ? Controller controller = null;

? ? ? ? if("ProductInput".equalsIgnoreCase(action)){

? ? ? ? ? ? controller = new ProductInputController();

? ? ? ? }else if("ProductDetail".equalsIgnoreCase(action)){

? ? ? ? ? ? controller = new ProductDetailController();

? ? ? ? }

? ? ? ? String url = controller.handleRequest(request, response);

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

? ? }

? ? protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

? ? ? ? doPost(request, response);

? ? }

}

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

四.階段四

給階段三的功能之上添加一個校驗功能

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

package com.zy.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;

? ? }

}

2.ProductValidate.java,用來完成對于formbean進行校驗,如果校驗不通過,則將錯誤信息存儲起來

package com.zy.validate;

import com.zy.form.ProductForm;

import java.util.ArrayList;

import java.util.List;

public class ProductValidate {

? ? /**

? ? * 校驗給定的ProductForm對象

? ? * @param pf 要校驗的對象

? ? * @return 表單校驗不成功,則將錯誤信息存儲

? ? */

? ? public List<String> validate(ProductForm pf){

? ? ? ? List<String> errors = null;

? ? ? ? String pname = pf.getPname();

? ? ? ? String img = pf.getImg();

? ? ? ? double price = pf.getPrice();

? ? ? ? errors = new ArrayList<>();

? ? ? ? if(pname == null || pname.length() == 0){

? ? ? ? ? ? errors.add("product name must not be empty.");

? ? ? ? }

? ? ? ? if(img == null || img.length() == 0){

? ? ? ? ? ? errors.add("product image must not be empty.");

? ? ? ? }

? ? ? ? if(price < 0){

? ? ? ? ? ? errors.add("the price of product must be a positive number.");

? ? ? ? }

? ? ? ? return errors;

? ? }

}

3.更新ProductDetailController.java

package com.zy.mvc.controller;

import com.zy.ProductValidate;

import com.zy.bean.Product;

import com.zy.form.ProductForm;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.util.List;

public class ProductDetailController implements Controller {

? ? @Override

? ? public String handleRequest(HttpServletRequest request, HttpServletResponse response) {

? ? ? ? String pid = request.getParameter("pid");

? ? ? ? String pname = request.getParameter("pname");

? ? ? ? String sprice = request.getParameter("price");

? ? ? ? String img = request.getParameter("img");

? ? ? ? double price = sprice == null ? 0.0 : Double.parseDouble(sprice);

? ? ? ? System.out.println("pid : " + pid);

? ? ? ? System.out.println("price : " + sprice);

? ? ? ? System.out.println("pname : " + pname);

? ? ? ? System.out.println("img : " + img);

? ? ? ? ProductForm pf = new ProductForm();

? ? ? ? pf.setImg(img);

? ? ? ? pf.setPname(pname);

? ? ? ? pf.setPrice(price);

? ? ? ? ProductValidate pv = new ProductValidate();

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

? ? ? ? try {

? ? ? ? ? ? if(errors != null && !errors.isEmpty()){

? ? ? ? ? ? ? ? request.setAttribute("errors", errors);

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

? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? Product p = new Product();

? ? ? ? ? ? ? ? p.setPid(pid);

? ? ? ? ? ? ? ? p.setPname(pf.getPname());

? ? ? ? ? ? ? ? p.setImg(pf.getImg());

? ? ? ? ? ? ? ? p.setPrice(pf.getPrice());

? ? ? ? ? ? ? ? request.setAttribute("p", p);

? ? ? ? ? ? }

? ? ? ? } catch (Exception e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? }

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

? ? }

}

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

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