Servlet基础预习
- servlet简介:servlet是jsp的前身,它是在服务器端运行的一个小程序,并可通过“请求-响应”编程模型来访问的这个驻留在服务器内存里的Servlet程序。
Tomcat容器等级
-
Tomcat容器分为四个等级,Servlet的容器类Context容器,每个Context对应一个Web工程。
Servlet程序编写
- 写java类继承HttpServlet。
-
根据数据提交方式决定重写doGet()或doPost()方法。
-
在web.xml中注册Servlet。
在index.jsp中写一个链接或表单。(在src下新建一个包,在包下建一个HttpServlet的子类,路径为这个类的路径)
在这个类中重写doGet和doPost方法。(在doGet方法中写System.out.pintln("…"),内容会在后台输出,而新建的PrintWriter对象的println方法在网页输出。doPost同理。)
在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>
在方法中(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生命周期
- 初始化阶段,调用构造方法,再调用init()方法。
- 响应客户端请求,调用service()方法。由此决定执行doGet()还是doPost()方法。
- 服务器结束服务时,终止阶段,调用destroy()方法。
以下时刻Servlet容器装载Servlet
- Servlet容器启动时自动装载某些Servlet,实现它只需要在web.xml文件中的之间添加如下代码:1,数字越小加载优先级别越高。
- 在Servlet容器启动后,客户首次向Servlet发送请求。
- Servlet类文件被修改后,重新装载Servlet。Servlet被装载后,Servlet容器创建一个Servlet实例并调用Servlet的init()方法进行初始化。在Servlet的整个生命周期内,init()方法只被调一次。
Servlet与九大内置对象
Servlet表单
-
新建项目
-
在web文件夹下编写用于输入的jsp和用于查看输出的jsp.(看值是否传入并正常输出)
-
在src下建包,包下建java类.(注意要在xml文件下注册)拿用户注册例子来说,可建一个用户类保存用户的信息,和继承HttpServlet的类完成跳转.
-
用于提交的表单的action为"包名/servlet类".这个servlet类重写doGet,doPost方法,并且可在doGetf方法中写doPost(request,response),避免代码冗余.(get会调用post方法)
-
在doPost()最后写request.getSession().setAttribute(“显示页面要用的名字”,用户实例名);
request.getRequestDispatcher("…/显示页面.jsp")
-
显示界面用jsp:usebean和jsp:getbean就好.(use:bean的id要注意和setAttribute的值对应)
路径相关
- 超链接开头是"/"时,表示项目的根目录.
- 绝对路径:用path路径,path表示项目根目录.
- 可用request.getContextPath()获得上下文环境,response.sendRedirect(request.getContextPath()+“文件名”)重定向跳转.(可在doPost()中使用).
- 服务器内部跳转(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
- 创建页面层
购物车类
- 购买商品的集合.
- 商品总价格.
- 添加方法.
- 删除方法.
- 计算价格方法.
//商品信息类似键值对
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%>的商品
<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篇