一. 階段一
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";
? ? }
}