Servlet 是运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。
servlet的实质就是java代码,通过java的API动态的向客户端输出内容,以后写的程序就不在是在本地执行了,而是编译成字节码,放到服务器上来去执行。
1、请求(通过request获取请求行, 请求头,请求体):
获取请求头、获取请求行:略
获取请求体:
1.获取一个值:
req.getParameter("名称")
2.获取多个值
req.getParameterValues("名称")
,返回的是一个数组
2、响应(通过response设置响应行,响应头 ,响应体):
设置响应头、设置响应行:略
设置响应体:
通过write方法来写,response.getwrite().wirte(“要写的内容”)
重定向与请求转发
重定向:
浏览器找servlet1,通过设置响应,告诉浏览器, 再让浏览器发送请求到servlet2。整个过程会发两次请求并且地址栏会发生变化
response.sendRedirect("url");
转发:
请求转发只需要发送一次直接,找servlet1,在servlet1当中直接转发给servlet2,不要再告诉浏览器。整个过程只发送一次请求并且地址栏不会发生变化
request.getRequestDispatcher("url").forward(request,response);
定义:
JSP全名为Java Server Pages,中文名叫java服务器页面,它是在传统的网页HTML文件中插入Java程序段和JSP标记,本质是一个简化的Servlet设计。
作用:
直接使用Html文件是没有办法输出Java当中的信息,使用servlet来去输出一个网页非常的麻烦,于是就出现了jsp,又能写html,又能写Java代码
工作原理:
jsp本质就是一个servlet,jsp在第一次被访问时会被Web容器翻译成servlet,整个过程如下:index.jsp -> index_jsp.java -> index_jsp.class
EL(Express Lanuage)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL出现的目的是要替代jsp页面中脚本的编写。
作用:
EL最主要的作用是获得四大域中的数据:EL从四个域中获得某个值${key}
pageContext:当前jsp有效
request域:一次servlet请求有效
session域:一次会话有效
servletContext:整个web应用均有效
定义:
JSTL(JSP Standard Tag Library),JSP标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能,jstl出现的目的同el一样也是要代替jsp页面中的脚本代码
用法:
先引入标签库:<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
if标签:
满足条件时,中间的内容才会显示出来
for标签:
比如一个用户未登录,但是想往购物车里面加东西,此时我们该怎么存储他购买的商品呢?
使用数据库?不行,因为用户还没有登陆
使用request域?不行,因为request域只限于一次请求有效,如果用户还要再买另一个东西,那么他去请求另外的东西时,之前使用request存储的商品就失效了
使用servlet域?不行,如果此时又有一个用户要买东西,那么之前用户买的东西还存留在servlet域中,导致付款的时候多加了好多商品的价格
正解是我们应该使用会话技术
会话:
用户开一个浏览器,点击多个超链接,访问服务器多个web资源然后关闭浏览器,整个过程称之为一个会话。
作用:
保持各个客户端自己的数据,每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据
Cookie
为每个浏览器开辟缓存空间,里面存储信息
服务器怎样把Cookie写 给客户端:
1、创建Cookie:
Cookie cookie = new Cookie(String cookieName,String cookieValue);
2、向客户端发送cookie:
response.addCookie(cookie名称)
服务器如何获取客户端携带的cookie:
通过Request对象的getCookies()方法
Session
工作原理:
一个浏览器访问时,服务端会开辟出针对该浏览器的空间存储其数据,并且创建的存储空间有一个编号我们称为SessionID,第一次访问时, 会把对应的sessionID以Cookie的形式写给浏览器,下次再访问时, 会携带sessionID,找到当初创建的那个存储空间,在对应的存储空间当中取出数据
学习如何获取Session对象:
HttpSession session = request.getSession();
学习怎么样向session当中存取数据:(Session对象也是一个域对象)
session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);
一、登录功能:
1、建表:
略
2、domain层:
package com.zhaochen.domain;
public class Admin {
private Integer id;
private String name;
private String pwd;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
3、web层:AdminServlet
package com.zhaochen.controller;
import com.zhaochen.domain.Admin;
import com.zhaochen.service.AdminService;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class AdminServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接收用户名和密码
String name = req.getParameter("username");
String pwd = req.getParameter("password");
//调用登录业务层
AdminService adminService = new AdminService();
try {
Admin admin = adminService.login(name, pwd);
//把用户信息保存在session中
HttpSession session = req.getSession();
session.setAttribute("admin",admin);
//跳转到后台的首页
// (如果采用重定向,会让浏览器跳转到指定位置,地址栏会发生变化)
//(如果采用转发,则在服务器内部完成,地址栏不会发生改变)
resp.sendRedirect(req.getContextPath()+"admin/admin_index.jsp");
System.out.println("登陆成功");
} catch (Exception e) {
if (e.getMessage().equals("用户名或者密码错误")){
//真的是输入错误,则跳转回登录页,回显错误信息
req.setAttribute("err",e.getMessage());
//转发
req.getRequestDispatcher("admin/admin_login.jsp").forward(req,resp);
}
System.out.println("登陆失败");
e.printStackTrace();
}
}
}
4、service层:AdminService
package com.zhaochen.service;
import com.zhaochen.dao.AdminDao;
import com.zhaochen.domain.Admin;
public class AdminService {
public Admin login(String name,String pwd){
//调用dao层到数据库中查询
AdminDao adminDao = new AdminDao();
Admin admin = adminDao.checkAdmin(name, pwd);
if(admin != null){
return admin;
}else{
throw new RuntimeException("用户名或者密码错误");
}
}
}
5、Dao层:AdminDao
package com.zhaochen.dao;
import com.zhaochen.domain.Admin;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import java.sql.SQLException;
public class AdminDao {
public Admin checkAdmin(String name,String pwd) throws SQLException {
//到数据库中查询
//1.连接
QueryRunner qr = new QueryRunner(JdbcUtil.getDataSource());
//2.查询
String sql = "select * from admin where username = ? and password = ?";
//3.执行查询
Admin admin = null;
admin = qr.query(sql,new BeanHandler<Admin>(Admin.class),name,pwd);
//返回查询结果
return admin;
}
}
二、商品的添加、删除、修改、查询功能:
Servlet层:
1.GoodsListServlet(查询所有)
package com.zhaochen.controller;
import com.zhaochen.domain.Goods;
import com.zhaochen.service.GoodsService;
import org.springframework.stereotype.Controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
@WebServlet("/GoodsListServlet")
public class GoodsListServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//调用服务层
GoodsService goodsService = new GoodsService();
try {
List<Goods> allGoods = goodsService.getAllGoods();
//把数据写入到request域中
req.setAttribute("allGoods",allGoods);
//转发到jsp
req.getRequestDispatcher("admin/main.jsp").forward(req,resp);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
2.添加商品:GoodsAddServlet
package com.zhaochen.controller;
import com.zhaochen.domain.Goods;
import org.springframework.beans.BeanUtils;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
@WebServlet("/GoodsAddServlet")
public class GoodsAddServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
//获取所有参数
Map<String,String[]> parameterMap = req.getParameterMap();
//把参数封装成对象
Goods goods = new Goods();
}
}
3.删除商品:GoodsDelServlet
package com.zhaochen.controller;
import com.zhaochen.service.GoodsService;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
@WebServlet("/GoodsDelServlet")
public class GoodsDelServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("GoodsDelServlet");
//接收id
String id = req.getParameter("id");
//调用服务层让其删除
GoodsService goodsService = new GoodsService();
try {
goodsService.deleteGoods(id);
} catch (SQLException e) {
e.printStackTrace();
}
//转发到商品列表
req.getRequestDispatcher("/GoodsListServlet").forward(req,resp);
}
}
Service层:
GoodsService
package com.zhaochen.service;
import com.zhaochen.dao.GoodsDao;
import com.zhaochen.domain.Goods;
import java.sql.SQLException;
import java.util.List;
public class GoodsService {
GoodsDao goodsDao = new GoodsDao();
//查询所有商品
public List<Goods> getAllGoods() throws SQLException {
//从数据库中取数据
List<Goods> allGoods = goodsDao.getAllGoods();
return allGoods;
}
//删除商品
public void deleteGoods(String id) throws SQLException {
goodsDao.deleteGoods(Integer.parseInt(id));
}
//添加商品
public void addGoods(Goods goods) throws SQLException {
goodsDao.addGoods(goods);
}
//修改商品
public void updateGoods(Goods goods) throws SQLException {
goodsDao.updateGoods(goods);
}
}
Dao层:
GoodsDao
package com.zhaochen.dao;
import com.zhaochen.domain.Goods;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import javax.management.Query;
import java.sql.SQLException;
import java.util.List;
public class GoodsDao {
private QueryRunner qr = new QueryRunner(JdbcUtil.getDataSource());
//从数据库中查询所有商品
public List<Goods> getAllGoods() throws SQLException {
//查询操作
String sql = "select * from goods";
//执行sql
List<Goods> allGoods = null;
allGoods = qr.query(sql,new BeanListHandler<Goods>(Goods.class));
return allGoods;
}
//添加商品
public void addGoods(Goods goods) throws SQLException {
String sql = "insert into goods(name,price,image) values(?,?,?) ";
qr.update(sql,goods.getName(),goods.getPrice(),goods.getImage());
}
//删除商品
public void deleteGoods(Integer id) throws SQLException {
String sql = "delete from goods where id = ? ";
qr.update(sql,id);
}
//更新商品
public void updateGoods(Goods goods) throws SQLException {
String sql = "update goods set name = ?,price = ?,image = ? where id = ? ";
qr.update(sql,goods.getName(),goods.getPrice(),goods.getImage(),goods.getId());
}
}
domain:
Goods
package com.zhaochen.domain;
import java.io.Serializable;
public class Goods implements Serializable {
private Integer id;
private String name;
private Double price;
private String image;
@Override
public String toString() {
return "Goods{" +
"id=" + id +
", name='" + name + '\'' +
", price=" + price +
", image='" + image + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
}