JAVAEE 第四课 ----- 补充(1)(第一次实验--简易商城项目) ----- EL表达式&JSTL

5 篇文章 0 订阅
5 篇文章 0 订阅

因为上午上了课晚上就做了实验,所以讲解的例子就直接使用实验的例子,就不再重写一遍老师上课写的代码了

recap:第三课中学习到了JSP另一个内置对象session的用法、复习了数据库知识、学习了创建JavaBean、创建DAO、servlet通过调用JavaBean&DAO实现对数据库的增删改查(JDBC)、EL表达式的简单用法,实现了对用户查询数据的动态服务(按照用户要求查询数据),但是上节课从数据库中能查询出一条满足条件的数据,而今天就要使用EL表达式&JSTL来实现从数据库中查询出多条满足查询条件的数据,并将其展示在前端页面上,向用户展示  

 

本节课主要涉及:

  1. EL表达式:Expression Language,即表达语言,用于代替原来在JSP页面上的对象的获取、作用域的获取等,用于提高Java代码与HTML标签的融合,使得不用在JSP页面麻烦的使用<% %>取拼接Java代码和HTML标签
  2. JSTL:Java server pages standarded tag library,即Java服务器页标准化标记库,用于代替Java代码中的显示函数的调用,使得使用标签库间接调用这些显示函数,可以提高Java代码与HTML标签的融合,而不需要麻烦的将Java代码与HTML标签进行拼接,使得不用在JSP页面麻烦的使用<% %>取拼接Java代码和HTML标签
  3. JavaScript:Java脚本语言,用于制作web页面交互效果,提升用户体验

以下为本次上机实验要求:

按照要求编写代码:

根据要求分析:可以将是要分成4部分完成

  1. 用户注册登陆编写部分
  2. 商品查询DAO编写部分
  3. 商品查询涉及的前端页面&后端做处理的servlet编写部分
  4. 向用户展示查询结果的网页编写部分

第①部分:

用户注册&登陆

首先为所有功能创建一个主页:index.html,用于将所有功能需要的使用接口暴露给用户,方便用户的调用,也方便开发时对功能的测试与后期的维护

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="regist.jsp">注册</a><br>
<a href="login.jsp">登陆</a>
<hr color="blue">
EL表达式
JSTL标签库<br>
<a href="searchAll">查询全部商品</a><br>
<form action=searchType>
	商品类别:<input type="text" name="type">
						<input type="submit" value="查询">	
</form>
<form action=searchId>
	商品编号:<input type="text" name="id">
						<input type="submit" value="查询">	
</form>
</body>
</html>

上述代码段将本次实验需要暴露给用户的所有接口都定义好了

在定义好主页之后需要为用户抽象一个JavaBean,用于封装每一个用户的数据,方便对每个用户数据的同一管理与调度

用户实体类:UserDao.java

package com.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.entity.CommUser;

public class UserDao {
 	private String url = "jdbc:mysql://localhost:3306/shopSystem";	
	private String user = "root";
	private String password = "abc123456789";
	private String driver = "com.mysql.jdbc.Driver";
	Connection conn = null;
	PreparedStatement ps = null;
	//连接数据库
	public Connection conn() {
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url, user, password);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		System.out.print("连接数据库成功..");
		return conn;
	}
	
	//新增用户信息
	public boolean addUser(CommUser user) {
		boolean flag = false;
		//连接DB并获取连接对象
		UserDao con = new UserDao();
		conn = con.conn();
		String sql = "INSERT INTO commuser(Account,Password,Nickname) VALUES(?,?,?)";
		try {
			ps = conn.prepareStatement(sql);
			ps.setString(1,user.getAccount() );
			ps.setString(2,user.getPassword() );
			ps.setString(3,user.getNickname());
			ps.execute();
			flag = true;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return flag;
	}
	
	//查询用户数据
	public boolean searchUser(String Account){
		boolean flag = false;
		//连接DB并获取连接对象
		UserDao con = new UserDao();
		conn = con.conn();
		String sql = "select * from commuser where Account = ?";
		try {
			ps = conn.prepareStatement(sql);
			ps.setString(1, Account);
			ResultSet rs = ps.executeQuery();
			if(rs.next()) {
				System.out.println("查询成功!");
				flag = true;
			}else {
				System.out.println("查询失败!");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return flag;
	}
	public static void main(String args[]) {
		UserDao conn = new UserDao();
		conn.conn();
	}
}

用户注册页面:regist.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<form action=regist>
	账号:<input type="text" name="Account">
	密码:<input type="password" name="Password">
	用户名:<input type="text" name="Nickname">
	<input type="submit" value="注册">
</form>
</body>
</html>

相应的servlet处理页面:registServlet.java(对用户输入为空时做了非法保护)

package com.servlets;

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

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 com.entity.CommUser;
import com.dao.UserDao;
import com.entity.*;
@WebServlet("/regist")
public class registServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		//System.out.print("连接成功..");	--	测试与regist是否连接成功
		//获取注册信息
		String Account = request.getParameter("Account");
		String Password = request.getParameter("Password");
		String Nickname = request.getParameter("Nickname");
		if(Account.equals("")||Password.equals("")||Nickname.equals("")) {
			out.print("输入的账号或密码或用户名不能为空!3秒后跳转至注册页面");
			String registURL = "http://localhost:8080/myShopSys/regist.jsp";
			response.setHeader("Refresh","3;URL="+registURL);	
		}else {
			//创建用户实体对象
			CommUser user = new CommUser(Account, Password, Nickname);
			UserDao dao = new UserDao();
			dao.addUser(user);
			out.print("注册成功!3秒后跳转至首页");
			String indexURL = "http://localhost:8080/myShopSys/index.html";
			response.setHeader("Refresh","3;URL="+indexURL);	
		}
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

}

用户登陆页面:login.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<form action=login>
	账号:<input type="text" name="Account">
	密码:<input type="password" name="Password">
	<input type="submit" value="登陆">
</form>
</body>
</html>

相应的servlet处理页面:loginServlet.java(对用户输入为空时做了非法保护)

package com.servlets;

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

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 com.dao.UserDao;
@WebServlet("/login")
public class loginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		//System.out.print("连接成功..");	--	测试login是否正常连接
		String Account = request.getParameter("Account");
		String Password = request.getParameter("Password");
		if(Account.equals("")||Password.equals("")){
			out.print("输入的用户名或密码不能为空!3秒后跳转至登陆页面");
			String loginURL = "http://localhost:8080/myShopSys/login.jsp";
			response.setHeader("Refresh","3;URL="+loginURL);	
		}else {
			UserDao dao = new UserDao();
			if(dao.searchUser(Account)) {
				out.print("登陆成功!3秒后跳转至首页");
				String indexURL = "http://localhost:8080/myShopSys/index.html";
				response.setHeader("Refresh","3;URL="+indexURL);	
			}else {
				out.print("请输入正确的用户名或密码!3秒后跳转至登陆页面");
				String loginURL = "http://localhost:8080/myShopSys/login.jsp";
				response.setHeader("Refresh","3;URL="+loginURL);	
			}
		}
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}
}

由以上1个html页面+两个jsp页面+两个servlet 就完成了用户注册+登陆的逻辑功能

第②部分:

编写商品查询DAO:在这部分代码中,涉及到了数据库的连接,以及对数据库中具体数据表的数据查找(包含无条件查找、按商品类别查找以及按商品编号查找三种)--  这其中使用到了另外一种数据结构——集合list,用于存储从数据库中查询到的数据集,即将查到的每一行数据作为集合中的一个元素进行存储,由此就将数据库中查到的整张数据表就都存储下来了。在三种查找方式的最后都返回这按照条件查找到的数据表对应的集合

package com.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.entity.Goods;
import com.mysql.fabric.xmlrpc.base.Array;

public class GoodsDao {
 	private String url = "jdbc:mysql://localhost:3306/shopSystem";	
	private String user = "root";
	private String password = "abc123456789";
	private String driver = "com.mysql.jdbc.Driver";
	private Connection conn = null;
	private PreparedStatement ps = null;
	private ResultSet rs = null;
	//将该对象定义在外面减少在将结果集存入list链表时,while创建多个对象
	Goods goods = null;
	//连接数据库
	public Connection conn() {
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url, user, password);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		System.out.print("连接数据库成功..");
		return conn;
	}
	//查询goods表中所有的数据	--	不需要参数
	//因为查询到的是一张数据表所以使用集合--链表来存储查询结果,< >中指定了该链表中存储的数据对象
	//该处指定为goods类型 -- 因为查出来的一条数据就是按照JavaBean--goods类型存储的,所以要用对应的数据类型接收
	//或者说按照数据表各个字段创建了一个可以接收其所有字段数据的实体类--Goods
	public List<Goods> getAllGoods() {
		UserDao con = new UserDao();
		conn = con.conn();
		List<Goods> goodsList = new ArrayList<Goods>();
		String sql = "select * from goods";
		//获取预编译对象来发送sql语句到MySQL
		try {
			ps = conn.prepareStatement(sql);
			//rs为结果集
			rs = ps.executeQuery();
			//将rs中的结果集进行提取,存入list中
			while(rs.next()) {
				String id = rs.getString("id");
				String name = rs.getString("name");
				String type = rs.getString("type");
				double price = rs.getDouble("price");
				long total = rs.getLong("total");
				String description = rs.getString("description");
				goods = new Goods(id, name, type, price, total, description);
				//将取到的商品实体存入列表,有多少个存多少个
				goodsList.add(goods);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return goodsList;
	}
	public List<Goods> getGoodsByType(String type){
		UserDao con = new UserDao();
		conn = con.conn();
		List<Goods> goodsList = new ArrayList<Goods>();
		String sql = "select * from goods where type=?";
		try {
			ps = conn.prepareStatement(sql);
			ps.setString(1, type);
			rs = ps.executeQuery();
			while(rs.next()) {
				String id = rs.getString("id");
				String name = rs.getString("name");
				String typec = rs.getString("type");
				double price = rs.getDouble("price");
				long total = rs.getLong("total");
				String description = rs.getString("description");
				goods = new Goods(id, name, typec, price, total, description);
				//将取到的商品实体存入列表,有多少个存多少个
				goodsList.add(goods);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return goodsList;
	}
	public List<Goods> getGoodsById(String id){
		UserDao con = new UserDao();
		conn = con.conn();
		List<Goods> goodsList = new ArrayList<Goods>();
		String sql = "select * from goods where id=?";
		try {
			ps = conn.prepareStatement(sql);
			ps.setString(1, id);
			rs = ps.executeQuery();
			while(rs.next()) {
				String idc = rs.getString("id");
				String name = rs.getString("name");
				String typec = rs.getString("type");
				double price = rs.getDouble("price");
				long total = rs.getLong("total");
				String description = rs.getString("description");
				goods = new Goods(idc, name, typec, price, total, description);
				//将取到的商品实体存入列表,有多少个存多少个
				goodsList.add(goods);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return goodsList;
	}
	
	
	public static void main(String args[]) {
		GoodsDao conn = new GoodsDao();
		conn.conn();
	}
}

第③部分:

编写商品查询涉及的前端页面&后端做处理的servlet:

结合第一部分中编写的index.html页面上为用户暴露的功能接口为对应的超链接、表单编写对应的servlet进行服务

重要提示:这两个坑浪费了我接近一小时才解决

①在该部分中,最好是使用request对象的作用域在后端与前端之间传递数据,因为request是只有在请求时才会被调用的,而page是只在当前页面有用的、session是在本次会话中有效的、application是在服务器宕机/重启之前一直有效的,所以若使用page,数据根本传不到前端页面取进行数据展示,而session与application是可以将数据传到前端页面,且可以进行数据的展示,但是会出现“请求过的数据会一直出现的数据展示页面”  --  即若先请求查询了所有数据,在下次按照商品类型查找数据时,上一次查询到的所有数据也会显示出来,在做第三次查询时用商品id号进行查询,前两次无条件查询结果和按照商品类型查询结果也会显示出来,原因就是你使用了session/application的作用域很广,且只要你请求过的数据都会记录在其中,所以在之后的查询中还会显示你之前查询到的数据。而不是像request那样,只有你请求时才会将你所请求的数据显示出来

②在对应servlet处理好前端来的请求过后实现页面跳转时,因为在第①点中说过要使用request这个内置对象,所以在跳转时必须使用转发,即在第二课中提到的“request.getRequestDispatcher("showInfo.jsp").forward(request, response)”,这种方式是在服务器里面直接跳转至指定页面上,效率最高;与重定向相比之下,重定向是重新向服务器发起一次请求,所以重定向的效率更低。而在该处只能使用转发的原因是:因为requet只能用在转发上获取数据,Session转发或重定向都可以,但是浏览器关闭就没有了,Application只要服务器不停止,永远可用。 所以在使用request存储数据时必须使用转发才能使得前端页面能够获取到在servlet中存储的数据,用重定向前端是获取不到数据的(这个坑是最坑的,因为eclipse中不会有任何报错信息,但是前端页面上打死也显示不了从数据库中查到的数据信息)

服务无条件查找的servlet:GoodsSearchAll.java

package com.servlets;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletContext;
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 javax.servlet.http.HttpSession;

import com.dao.GoodsDao;
import com.entity.Goods;
@WebServlet("/searchAll")
public class GoodsSearchAll extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		GoodsDao goods= new GoodsDao();
		List<Goods> goodsList = goods.getAllGoods();
		request.setAttribute("allGoods", goodsList);
		request.getRequestDispatcher("show.jsp").forward(request,response);	
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

}

服务按照商品类别查找的servlet:GoodsByType.java

package com.servlets;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletContext;
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 javax.servlet.http.HttpSession;

import com.dao.GoodsDao;
import com.entity.Goods;
@WebServlet("/searchType")
public class GoodsByType extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String type = request.getParameter("type");
		GoodsDao goods= new GoodsDao();
		List<Goods> goodsList = goods.getGoodsByType(type);
		request.setAttribute("goodsType", goodsList);
		request.getRequestDispatcher("show.jsp").forward(request,response);	
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

}

服务按照商品编号查找的servlet:GoodsById.java

package com.servlets;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletContext;
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 javax.servlet.http.HttpSession;

import com.dao.GoodsDao;
import com.entity.Goods;
@WebServlet("/searchId")
public class GoodsById extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String id = request.getParameter("id");
		GoodsDao goods= new GoodsDao();
		List<Goods> goodsList = goods.getGoodsById(id);
		request.setAttribute("goodsId", goodsList);
		request.getRequestDispatcher("show.jsp").forward(request,response);	
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

}

第④部分:

编写向用户展示查询结果的网页:show.jsp

在使用JSTL之前要导入相应的数据包

在这个页面中主要就涉及到了本节课的重点EL表达式&JSTL

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
    <!-- JSTL导包,即引入JSTL标签库,用于代替Java中显式的“判断、选择、循环等”结构用标签的形式代替,使其与HTML标签更好的融合 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body> 
	<%-- <p>${requestScope.allGoods}</p> --%>

	<!-- 该句el表达式返回的值是对应数据存在内存中的地址 -->
	
	<!-- 数据表中有多少条数据在查询之前是不知道的,所以就要使用到循环去取所有的数据 -->
	<!-- JSTL标签库:代替Java代码中的显示函数的调用,
	使得使用标签库间接调用,可以提高Java代码与HTML标签的融合,
	而不需要麻烦的将Java代码与HTML标签进行拼接 -->
	<!-- 使用之前需要导包 -->
	<!-- 还要在本文件一开头导入对应的包 -->
	
	<!-- 使用foreach代替循环for
	该处使用循环来获取集合中的多个goods对象
	foreach中重点掌握两个参数
	items:表示需要遍历的集合的名称
	 var:用于给集合中的各个对象起别名,方便调用,不需要每次调用都要把完整的el表达式写上
	 -->

<table border="1">
 	<caption>	<h3>数据查询结果如下</h3></caption>
		<tr>
		        <th>Id</th>
		        <th>Name</th>
		        <th>Type</th>
		        <th>Price</th>
		        <th>Total</th>
		        <th>Description</th>
	  	</tr>
	<c:forEach items="${requestScope.allGoods}" var="goods">
	   	 <tr>
	        <td>${goods.id}</td>
	        <td>${goods.name}</td>
	        <td>${goods.type}</td>
	        <td>${goods.price}</td>
	        <td> ${goods.total}</td>
	        <td>${goods.description}</td>
	    </tr>	
<%-- 	<p>${goods.id} ${goods.name} ${goods.type} ${goods.price} ${goods.total} ${goods.description}</p> --%>
	</c:forEach>

	<!-- 使用if结构的代码能否显示在浏览器中取决于条件是否成立 
	成立就显示该部分内容
	不成立就不显示 -->
	
	<c:forEach items="${requestScope.goodsType}" var="goods">
		<c:if test="${goods.id!=null}" >
			<tr>
		        <td>${goods.id}</td>
		        <td>${goods.name}</td>
		        <td>${goods.type}</td>
		        <td>${goods.price}</td>
		        <td> ${goods.total}</td>
		        <td>${goods.description}</td>
		    </tr>	
		</c:if>
	</c:forEach>
	<c:forEach items="${requestScope.goodsId}" var="goods">
		<c:if test="${goods.id!=null}" >
		<tr>
		        <td>${goods.id}</td>
		        <td>${goods.name}</td>
		        <td>${goods.type}</td>
		        <td>${goods.price}</td>
		        <td> ${goods.total}</td>
		        <td>${goods.description}</td>
		    </tr>	
		</c:if>
	</c:forEach>
</table>
</body>
</html>

 

小结:以上就是本次实验所涉及到的所有页面的所有代码,在本节课中,主要是以实验要求为依托(此项目为一个简易商城,主要包括商品模块和用户模块,用户模块包括用户注册和用户登录功能,商品模块包括分类查询,精确搜索等功能.)训练了前几节课所学习的JSP的内置4个对象、JavaBean(实体类entity)、DAO、servlet通过调用JavaBean&DAO实现对数据库的增删改查(JDBC),加上了EL表达式的更加实际的使用方法,以及JSTL的使用,从前几节课的只能从数据库中查询到单条符合条件的数据到使用JSP的内置对象(page、request、session、application)&EL表达式&JSTL配合能够取出数据库中符合条件的多条数据并在前端页面进行展示,在这过程中,熟悉了JSTL对Java代码与HTML标签的融合作用,方便了JSP页面上Java代码的编写,熟悉了DAO对数据库数据的操作过程。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值