Java的Servlet与MVC编程模式

Servlet

Servlet是JSP(Java Servlet Pages)的基础,其本质为运行在服务器端的Java类,接收来自客户端的请求并作出响应。

Tomcat的容器分为四个等级,从大到小依次为Container、Engine、Host、Servlet,其关系如下

servlet的生命周期如下所示,当请求第一次到达servlet时,服务器装载servlet实例并调用init()完成初始化,之后将servlet实例常驻内存,之后请求再来到时,servlet实例可直接调用service方法选择doPost/doGet对请求作出响应。直到服务器关闭时再调用destroy()对servlet进行销毁。除了在页面请求时服务器装载servlet之外,还可以在web.xml文件中配置<loadon-startup>标签来设置servlet在服务器启动时装载,其后的数字越小,装载的优先级越高。在servlet被修改时,也会自动重新装载。

在Java中使用servlet相关的类需要先引入javax.servlet.jar包。

创建一个Servlet首先需要继承HttpServlet类,该抽象类是一个实现了Http协议的Servlet,其父类为抽象类GenericServlet,这是一个与协议无关的Servlet,其又实现于Servlet接口,接口有Init()、destroy()、service()三个方法。

在servlet类中需要重写doGet()、doPost()方法,在这两个方法中分别定义对于get和post方法请求本servlet时所执行的操作。

public class FirstServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("以Post方式请求Servlet");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("以Get方式请求Servlet");      //控制台输出

        //通过response返回html页面内容
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out=response.getWriter();
        out.println("<h1>Servlet返回的页面</h1>");
    }
}

最后需要在web.xml文件中注册servlet,如下注册一个名为FirstServlet,对应Java类在servlet.FirstServlet,其url为:网站根路径/servlet/FirstServlet,当浏览器以get请求http://localhost:8080/FirstApp_war_exploded/servlet/FirstServlet时,页面输出:Servlet返回的页面

    <servlet>
        <servlet-name>FirstServlet</servlet-name>
        <servlet-class>servlet.FirstServlet</servlet-class>
        <load-on-startup>1</load-on-startup>    <!--服务器启动时自动装载的优先级-->
    </servlet>
    <servlet-mapping>
        <servlet-name>FirstServlet</servlet-name>
        <url-pattern>/servlet/FirstServlet</url-pattern>
    </servlet-mapping>

servlet页面使用页面对象和JSP类似,其对应关系如下。例如在JSP中通过reques.getParameter()来获取客户端传来的参数,那么在servlet中可以通过req.getParameter()来进行相同的操作

在servlet中也可以加载初始化参数,在web.xml文件中配置如下,之后在servlet中调用this.getInitParameter("username")就可以得到初始化参数。

    <servlet>
        <servlet-name>FirstServlet</servlet-name>
        <servlet-class>servlet.FirstServlet</servlet-class>
        <init-param>
            <param-name>username</param-name>
            <param-value>小李</param-value>
        </init-param>
    </servlet>

MVC开发模式

在Java开发模型1的基础上产生了模型2,即MVC的开发模式。Model模型是指开发中涉及到的对象类结构,通过JavaBean进行数据表对应对象模型的数据存储。View视图,是指将数据展示给用户的界面,通过JSP页面完成和用户的交互。Controller控制器完成web的逻辑控制功能,由Servlet实现处理用户的请求并完成所需要的操作。MVC完成了对网站开发功能的进一步划分,使得代码的开发和维护效率更高。

进一步地,可以将对JavaBean对象的增删改查等基本的API操作抽取出来,封装一个DAO(Data Access Object)接口,在JavaBean中只保留数据和get/set方法。将servlet中复杂的业务逻辑也抽取为一个Service层,在servlet中只负责接收数据、调用service进行操作、向页面传值并跳转。

通过MVC设计模式实现一个购物车功能,如下所示点击商品可以添加到购物车,并对购物车进行查看与删除操作

   

首先设计Module类:购物车类Cart,通过Cart可以实现对购物车对象添加、删除商品等操作

package modules;

import java.util.HashMap;
import java.util.Map;

public class Cart {
    private HashMap<Item,Integer> goods;
    private double totalPrice;

    public Cart(){
        goods=new HashMap<Item,Integer>();
        totalPrice=0.0;
    }

    public HashMap<Item, Integer> getGoods() {  return goods;   }

    public double getTotalPrice() {  return totalPrice;   }

    public void setTotalPrice(double totalPrice) { this.totalPrice = totalPrice;   }

    //计算购物车总金额
    public void calculateTotal(){
        double sum=0;
        for (Map.Entry<Item, Integer> entry : goods.entrySet()) {
            Item item=entry.getKey();
            int num= entry.getValue();
            sum+=item.getPrice()*num;
        }
        this.setTotalPrice(sum);
    }
    
    //向购物车中添加商品
    public boolean addGoods(Item item,int num){
        if (goods.containsKey(item))            //如果商品已经在购物车中,则数量增加
            goods.put(item,goods.get(item)+num);
        else
            goods.put(item,num);            //不在,则加到购物车
        this.calculateTotal();
        return true;
    }
    
    //从购物车删除商品
    public void removeGoods(Item item){
        goods.remove(item);
        calculateTotal();
    }
}

接着实现View,购物车的视图cart.jsp,将保存在session中的购物车对象取出并显示在jsp页面

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" %>
<%@ page import="modules.Cart" %>
<%@ page import="modules.Item" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <title>购物车页面</title>
    <link type="text/css" rel="stylesheet" href="css/style1.css"/>
    <script language="javascript">
        function delcfm() {
            if (!confirm("确认要删除?")) {
                window.event.returnValue = false;
            }
        }
    </script>
</head>

<body>
<h1>我的购物车</h1>
<a href="index.jsp">首页</a> >> <a href="index.jsp">商品列表</a>
<hr>
<div id="shopping">
    <form action="" method="">
        <table>
            <tr>
                <th>商品名称</th>
                <th>商品单价</th>
                <th>商品价格</th>
                <th>购买数量</th>
                <th>操作</th>
            </tr>
            <%
                //从session中取出cart对象进行遍历并显示购物车内容
                if (request.getSession().getAttribute("cart") != null) { //判断session中是否有购物车对象
                    Cart cart = (Cart) request.getSession().getAttribute("cart");
                    HashMap<Item, Integer> goods = cart.getGoods();
                    Set<Item> Item = goods.keySet();
                    Iterator<Item> it = Item.iterator();
                    while (it.hasNext()) {
                        Item i = it.next();
            %>
            <tr name="products" id="product_id_1">
                <td class="thumb"><img src="images/<%=i.getPicture()%>"/><a href=""><%=i.getName()%>
                </a></td>
                <td class="number"><%=i.getPrice() %>
                </td>
                <td class="price" id="price_id_1">
                    <span><%=i.getPrice() * goods.get(i) %></span>
                    <input type="hidden" value=""/>
                </td>
                <td class="number">
                    <%=goods.get(i)%>
                </td>
                <td class="delete">
                    <a href="servlet/CartServlet?action=delete&id=<%=i.getId()%>" οnclick="delcfm();">删除</a>
                </td>
            </tr>
            <%
                }
            %>
            <!--遍历购物车结束-->

        </table>
        <div class="total"><span id="total">总计:<%=cart.getTotalPrice() %>¥</span></div>
        <%
            }
        %>
        <div class="button"><input type="submit" value=""/></div>
    </form>
</div>
</body>
</html>

最后实现Controller,通过CartServlet处理来自页面的用户请求,在doGet()函数中对Get请求中的action进行判断,分别有添加、显示、删除购物车的操作,定义三个函数来执行三种操作

package servlets;

import modules.Cart;
import modules.Item;
import modules.ItemList;

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

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取请求中的动作种类并判断
        String action = request.getParameter("action");       

        if (action.equals("add")) {        //添加购物车
            if (addToCart(request, response)) {
                request.getRequestDispatcher("/success.jsp").forward(request, response);
            } else {
                request.getRequestDispatcher("/fail.jsp").forward(request, response);
            }
        }

        if (action.equals("show"))        //显示购物车
            request.getRequestDispatcher("/cart.jsp").forward(request, response);

        if (action.equals("delete")) {        //删除购物车物品
            deleteFromCart(request, response);
            request.getRequestDispatcher("/cart.jsp").forward(request, response);
        }
    }

    //添加购物车操作
    private boolean addToCart(HttpServletRequest request, HttpServletResponse response) {
        int itemId = Integer.parseInt(request.getParameter("id"));
        int num = Integer.parseInt(request.getParameter("num"));

        ItemList itemList = new ItemList();
        Item item = itemList.getItemById(itemId);
        Cart cart = (Cart) request.getSession().getAttribute("cart");      //从session中取出购物车对象
        if (cart == null) {
            cart = new Cart();
        }
        if (cart.addGoods(item, num)) {
            request.getSession().setAttribute("cart", cart);
            return true;
        } else
            return false;
    }

    //删除购物车操作
    private boolean deleteFromCart(HttpServletRequest request, HttpServletResponse response) {
        int itemId = Integer.parseInt(request.getParameter("id"));
        ItemList itemList = new ItemList();
        Item item = itemList.getItemById(itemId);
        Cart cart = (Cart) request.getSession().getAttribute("cart");
        cart.removeGoods(item);
        request.getSession().setAttribute("cart", cart);
        return true;
    }
}
发布了124 篇原创文章 · 获赞 65 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/theVicTory/article/details/104362912
今日推荐