Servlet基础预习

Servlet基础预习

  • servlet简介:servlet是jsp的前身,它是在服务器端运行的一个小程序,并可通过“请求-响应”编程模型来访问的这个驻留在服务器内存里的Servlet程序。

Tomcat容器等级

  • Tomcat容器分为四个等级,Servlet的容器类Context容器,每个Context对应一个Web工程。

    在这里插入图片描述

Servlet程序编写

  1. 写java类继承HttpServlet。

在这里插入图片描述

  1. 根据数据提交方式决定重写doGet()或doPost()方法。

  2. 在web.xml中注册Servlet。

  1. 在index.jsp中写一个链接或表单。(在src下新建一个包,在包下建一个HttpServlet的子类,路径为这个类的路径)

  2. 在这个类中重写doGet和doPost方法。(在doGet方法中写System.out.pintln("…"),内容会在后台输出,而新建的PrintWriter对象的println方法在网页输出。doPost同理。)

  3. 在web.xml中在web-app标签内写

    <servlet>
        <servlet-name>名称</servlet-name>
        <servlet-class>包名.类名</servlet-class>
        <servlet-mapping>
            <servlet-name>名称(与上方名称一一对应)</servlet-name>
            <url-pattern>/和写的超链接地址对应</url-pattern>
        </servlet-mapping>
    </servlet>
    
  4. 在方法中(doGet或doPost)写response.setContentType(“text/html;charset=utf-8”)可在网页中用html标签输出。

Servlet流程

  • 当用户点击超链接时,发出get请求提交给服务器,服务器在web.xml中的mapping中寻找与之对应的url地址,之后找到Servlet的名字,再到servlet标签中寻找相同的名字并找到处理类,之后调用doGet方法。(doPost相同)
  • 编写Servlet的doPost方法时,需抛出ServletException, IOException异常。

Servlet生命周期

在这里插入图片描述

  1. 初始化阶段,调用构造方法,再调用init()方法。
  2. 响应客户端请求,调用service()方法。由此决定执行doGet()还是doPost()方法。
  3. 服务器结束服务时,终止阶段,调用destroy()方法。

以下时刻Servlet容器装载Servlet

  1. Servlet容器启动时自动装载某些Servlet,实现它只需要在web.xml文件中的之间添加如下代码:1,数字越小加载优先级别越高。
  2. 在Servlet容器启动后,客户首次向Servlet发送请求。
  3. Servlet类文件被修改后,重新装载Servlet。Servlet被装载后,Servlet容器创建一个Servlet实例并调用Servlet的init()方法进行初始化。在Servlet的整个生命周期内,init()方法只被调一次。

Servlet与九大内置对象

在这里插入图片描述

Servlet表单

  1. 新建项目

  2. 在web文件夹下编写用于输入的jsp和用于查看输出的jsp.(看值是否传入并正常输出)

  3. 在src下建包,包下建java类.(注意要在xml文件下注册)拿用户注册例子来说,可建一个用户类保存用户的信息,和继承HttpServlet的类完成跳转.

  4. 用于提交的表单的action为"包名/servlet类".这个servlet类重写doGet,doPost方法,并且可在doGetf方法中写doPost(request,response),避免代码冗余.(get会调用post方法)

  5. 在doPost()最后写request.getSession().setAttribute(“显示页面要用的名字”,用户实例名);

    request.getRequestDispatcher("…/显示页面.jsp")

  6. 显示界面用jsp:usebean和jsp:getbean就好.(use:bean的id要注意和setAttribute的值对应)

路径相关

  1. 超链接开头是"/"时,表示项目的根目录.
  2. 绝对路径:用path路径,path表示项目根目录.
  3. 可用request.getContextPath()获得上下文环境,response.sendRedirect(request.getContextPath()+“文件名”)重定向跳转.(可在doPost()中使用).
  4. 服务器内部跳转(request.getRequestDispatcher())中的"/"为项目根目录

初始化参数

  • 在web.xml中配置Servlet时,可以配置一些初始化参数.而在Servlet中可以通过ServletConfig接口提供的方法来取得这些参数.

    在xml文档中:

    <servlet>
    ...
    	<init-param>
        	<param-name>username</param-name>
            <param-value>admin</param-value>
        </init-param>
    </servlet>
    
    

    在对应的java文件中的init方法中添加this.setUssername(this.getInitParameter(“username”));

MVC

  • MVC模式:MVC(Model,View,Controller),是软件开发过程中比较流行的设计思想.旨在分离模型,控制,视图.是一种分层思想的体现.

    在这里插入图片描述

Model2

  • Model1:

在这里插入图片描述

  • Model2简介

    Java Web的Model2开发模型时MVC思想的体现.

    模型层为javabean,控制层为servlet,视图层为jsp.

    过程大致为jsp将数据提交给servlet,servlet实例化模型层对象(调用javabean),javabean读取数据库,并将结果反馈给控制层.控制层(servlet)根据结果跳转到不同jsp页面.

    在这里插入图片描述

简单实现购物车部分功能

  • 创建购物车类
  • 编写servlet
  • 创建页面层

购物车类

  1. 购买商品的集合.
  2. 商品总价格.
  3. 添加方法.
  4. 删除方法.
  5. 计算价格方法.
//商品信息类似键值对
package entity;
import  java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

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

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

    public void setGoods(HashMap<Items, Integer> goods) {
        this.goods = goods;
    }

    public double getTotalPrice() {
        return totalPrice;
    }

    public void setTotalPrice(double totalPrice) {
        this.totalPrice = totalPrice;
    }
    //添加
    public boolean addGoodsInCart(Items item,int number) {
        if (goods.containsKey(item)) {
            goods.put(item,goods.get(item)+number);
        } else {
            goods.put(item,number);
        }

        calTotalPrince();//重新计算总金额
        return true;
    }
    //删除
    public boolean removeGoodsFromCart(Items item) {
        goods.remove(item);
        calTotalPrince();//重新计算总金额
        return true;
    }
    //总金额
    public double calTotalPrince() {
        double sum=0.0;
        Set<Items> keys=goods.keySet();//获得键集合
        Iterator<Items> it=keys.iterator();//获得迭代器对象
        while (it.hasNext()) {
            Items i=it.next();
            sum+=i.getPrice()*goods.get(i);
        }
        this.setTotalPrice(sum);
        return this.getTotalPrice();
    }
}

商品类

  • 新建商品
  • 获取商品信息
  • 商品之间累加
package entity;

public class Items {

	private int id;//商品ID
    private String name;//商品名字
    private String city;//出产地
    private int price;//价格
    private int number;//购买数量
    private String picture;//商品图片

    public Items()
    {

    }

    public Items(int id,String name,String city,int price,int number,String picture)//添加新商品
    {
        this.id = id;
        this.name = name;
        this.city = city;
        this.picture = picture;
        this.price = price;
        this.number = number;

    }
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getPicture() {
        return picture;
    }

    public void setPicture(String picture) {
        this.picture = picture;
    }
    //添加相同商品时只出现一条记录,重写hashcode
    @Override
    public int hashCode() {
        // id相同,相同的name的hashcode相同
        return this.getId()+this.getName().hashCode();
    }
    //重写equals方法
    @Override
    public boolean equals(Object obj) {
        if(this==obj)//若两个类相同时
        {
            return true;
        }
        if(obj instanceof Items)//若是商品类时
        {
            Items i = (Items)obj;//强制转换
            if(this.getId()==i.getId()&&this.getName().equals(i.getName()))//判断
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }

}

购物车servlet

package servlet;

import java.io.IOException;
import java.io.PrintWriter;

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

import dao.ItemsDAO;//商品业务逻辑类
import entity.Cart;
import entity.Items;

public class CartServlet extends HttpServlet {

	private String action ; //购物车动作,add,show,delete
	private ItemsDAO idao = new ItemsDAO();
	
	public CartServlet() {
		super();
	}

	public void destroy() {
		super.destroy();
	}

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

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

		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		if(request.getParameter("action")!=null)
		{
			this.action = request.getParameter("action");
			if(action.equals("add")) //添加动作
			{
				if(addToCart(request,response))
				{
					request.getRequestDispatcher("/success.jsp").forward(request, response);
				}
				else
				{
					request.getRequestDispatcher("/failure.jsp").forward(request, response);
				}
			}
			if(action.equals("show"))//展示动作
			{
				request.getRequestDispatcher("/cart.jsp").forward(request, response);
			}
			if(action.equals("delete")) //删除动作
			{
				if(deleteFromCart(request,response))
				{
					request.getRequestDispatcher("/cart.jsp").forward(request, response);
				}
				else
				{
					request.getRequestDispatcher("/cart.jsp").forward(request, response);
				}
			}
		}
		
	}

	//添加的方法
	private boolean addToCart(HttpServletRequest request, HttpServletResponse response)
	{
		String id = request.getParameter("id");
		String number = request.getParameter("num");
		Items item = idao.getItemsById(Integer.parseInt(id));
		
		if(request.getSession().getAttribute("cart")==null)
		{
			Cart cart = new Cart();
			request.getSession().setAttribute("cart",cart);
		}
		Cart cart = (Cart)request.getSession().getAttribute("cart");
		if(cart.addGoodsInCart(item, Integer.parseInt(number)))
		{
			return true;
		}
		else
		{
			return false;
		}
		
	}
	
	//删除的方法
	private boolean deleteFromCart(HttpServletRequest request, HttpServletResponse response)
	{
		String id = request.getParameter("id");
		Cart cart = (Cart)request.getSession().getAttribute("cart");
	    Items item = idao.getItemsById(Integer.parseInt(id));
	    if(cart.removeGoodsFromCart(item))
	    {
	    	return true;
	    }
	    else
	    {
	    	return false;
	    }
	}
	

	public void init() throws ServletException {
	}

}

添加成功界面

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<html>
  <head>
    <base href="<%=basePath%>">
    <title>success.jsp</title>
  </head>
  
  <body>
    <center>
      <img src="images/add_cart_success.jpg"/>
      <hr>
      <% 
         String id = request.getParameter("id");
         String num = request.getParameter("num");
      %>
             您成功购买了<%=num%>件商品编号为<%=id%>的商品&nbsp;&nbsp;&nbsp;&nbsp;
      <br>
      <br>
      <br>
      
    </center>
  </body>
</html>

添加失败界面

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>failure.jsp</title>
  </head>
  
  <body>
    <center>
      <img src="images/add_cart_failure.jpg"/>
      <hr>
      
      <br>
      <br>
      <br>
      
    </center>
  </body>
</html>

业务逻辑层

package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import util.DBHelper;

import entity.Items;

//对商品操作
public class ItemsDAO {

	// 获得所有商品信息
	public ArrayList<Items> getAllItems() {
		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		ArrayList<Items> list = new ArrayList<Items>(); // 建列表
		try {
			conn = DBHelper.getConnection();
			String sql = "select * from items;"; // SQL
			stmt = conn.prepareStatement(sql);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Items item = new Items();
				item.setId(rs.getInt("id"));
				item.setName(rs.getString("name"));
				item.setCity(rs.getString("city"));
				item.setNumber(rs.getInt("number"));
				item.setPrice(rs.getInt("price"));
				item.setPicture(rs.getString("picture"));
				list.add(item);// 导入
			}
			return list; // 返回
		} catch (Exception ex) {
			ex.printStackTrace();
			return null;
		} finally {
			// 确保关闭
			if (rs != null) {
				try {
					rs.close();
					rs = null;
				} catch (Exception ex) {
					ex.printStackTrace();
				}
			}
			if (stmt != null) {
				try {
					stmt.close();
					stmt = null;
				} catch (Exception ex) {
					ex.printStackTrace();
				}
			}
		}

	}

	public Items getItemsById(int id) {
		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			conn = DBHelper.getConnection();
			String sql = "select * from items where id=?;"; // SQL
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, id);
			rs = stmt.executeQuery();
			if (rs.next()) {
				Items item = new Items();
				item.setId(rs.getInt("id"));
				item.setName(rs.getString("name"));
				item.setCity(rs.getString("city"));
				item.setNumber(rs.getInt("number"));
				item.setPrice(rs.getInt("price"));
				item.setPicture(rs.getString("picture"));
				return item;
			} else {
				return null;
			}

		} catch (Exception ex) {
			ex.printStackTrace();
			return null;
		} finally {
			if (rs != null) {
				try {
					rs.close();
					rs = null;
				} catch (Exception ex) {
					ex.printStackTrace();
				}
			}
			if (stmt != null) {
				try {
					stmt.close();
					stmt = null;
				} catch (Exception ex) {
					ex.printStackTrace();
				}
			}

		}
	}
	public ArrayList<Items> getViewList(String list)
	{
		System.out.println("list:"+list);
		ArrayList<Items> itemlist = new ArrayList<Items>();
		int iCount=5; 
		if(list!=null&&list.length()>0)
		{
		    String[] arr = list.split(",");
		    System.out.println("arr.length="+arr.length);
		    if(arr.length>=5)
		    {
		       for(int i=arr.length-1;i>=arr.length-iCount;i--)
		       {
		    	  itemlist.add(getItemsById(Integer.parseInt(arr[i])));  
		       }
		    }
		    else
		    {
		    	for(int i=arr.length-1;i>=0;i--)
		    	{
		    		itemlist.add(getItemsById(Integer.parseInt(arr[i])));
		    	}
		    }
		    return itemlist;
		}
		else
		{
			return null;
		}
		
	}

}

DBHelper

package util;

import java.sql.Connection;
import java.sql.DriverManager;

public class DBHelper {
   
	private static final String driver = "com.mysql.jdbc.Driver"; 
	private static final String url="jdbc:mysql://localhost:3306/shopping?useUnicode=true&characterEncoding=UTF-8"; 
	private static final String username="root";
	private static final String password="";
    
	private static Connection conn=null;
	
	static 
	{
		try
		{
			Class.forName(driver);
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}
	
	public static Connection getConnection() throws Exception
	{
		if(conn==null)
		{
			conn = DriverManager.getConnection(url, username, password);
			return conn;
		}
		return conn;
	}
	
}

文章参考了java遇见html-servlet篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值