JSP
Java Server Page
使用Java开发运行在服务器上的页面。
jsp文件的后缀名为".jsp"
由于最初由Servlet渲染页面,在Java代码中加入大量的html的内容,使用极不方便。所以sun公司推出了JSP,可以在页面中加入Java代码,让页面成为动态页面。
JSP页面的本质是一个java文件(servlet)。
所以在第一次访问某个jsp页面时,会让该页面重新编译为.java文件–>.class文件,所以第一次访问时会慢一些。
JSP的组成
1、HTML元素
2、脚本(java代码)
<%java代码;%>
3、表达式
用于在页面中嵌入一个具体的变量值
<%=变量%>
4、指令
<%@ 指令名 属性="值" %>
page指令:用于设置当前页面属性
include指令:用于引入其他页面
taglib指令:用于引入其他标签库
5、注释
<%-- 无法在浏览器中查看jsp注释 --%>
6、声明
<%! 定义方法 %>
在<%%>中无法定义方法,如果非要在jsp页面中定义方法,需要使用声明。不建议在jsp中使用方法。
7、动作
jsp中定义了一些标签,可以代替java代码
<jsp:动作名></jsp:动作名>
跳转
页面与页面之间的跳转
<a href='另一个页面的地址'>超链接</a>
<from action='另一个页面的地址'>
<input type='submit'>
</from>
<button id='btn'>跳转</button>
<script>
$("#btn").click(function(){
location.href='另一个页面的地址';
location.assign('另一个页面的地址');
})
</script>
页面跳转至servlet
<a href='servlet映射名'>超链接</a>
<from action='servlet映射名'>
<input type='submit'>
</from>
Servlet跳转到页面或另一个Servlet
请求转发(内部跳转)
request.getRequestDispatcher("跳转的地址").forward(req,resp);
如A同学问B同学问题,B同学自己去问C同学后得到了答案,将答案告诉给A同学。
-
跳转到目的地时,浏览器的地址栏中的内容是访问时的地址
-
如果在某个Servlet做完增删改的操作后,不要使用请求转发。因为当重新刷新页面时,会重复提交
-
如果在request中保存了数据,只能通过请求转发才能读取request中保存的数据
重定向(外部跳转)
response.sendRedirect("跳转的地址");
如A同学问B同学问题,B同学告诉A同学去问C同学,A同学重新问C同学后得到答案。
- 跳转到目的地时,浏览器的地址栏中的内容是最终的目的路径
- 在做完增删改的操作后,使用重定向,可以保证最终页面与之前页面无关,刷新时不会重新提交。
- 如果在request中保存了数据,使用使用重定向,保存的数据就会丢失
跳转时传递数据
保存
作用域对象.setAttribute(String str,Object obj);
//将一个名为str的对象obj保存到某个作用域中。request就是一个作用域
List<泛型> list = dao.查询();
//将查询到的集合保存到请求中,命名为list
request.setAttrbute("list",list);
获取
Object obj = 作用域对象.getAttribute(String str);
//获取到的数据是Object对象,通常需要转型
List<泛型> list=(List<泛型>)request.getAttribute(obj);
带有外键字段的实体类设计
1、创建主表的实体类
BookType类
package com.hqyj.entity;
import java.util.Objects;
/*
* 创建主表对应的实体类
* */
public class BookType {
private int typeId;
private String typeName;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BookType bookType = (BookType) o;
return typeId == bookType.typeId &&
Objects.equals(typeName, bookType.typeName);
}
@Override
public int hashCode() {
return Objects.hash(typeId, typeName);
}
public BookType() {
}
public BookType(String typeName) {
this.typeName = typeName;
}
public BookType(int typeId, String typeName) {
this.typeId = typeId;
this.typeName = typeName;
}
@Override
public String toString() {
return "BookType{" +
"typeId=" + typeId +
", typeName='" + typeName + '\'' +
'}';
}
public int getTypeId() {
return typeId;
}
public void setTypeId(int typeId) {
this.typeId = typeId;
}
public String getTypeName() {
return typeName;
}
public void setTypeName(String typeName) {
this.typeName = typeName;
}
}
2、创建从表的实体类
BookInfo类
遇到外键字段,额外添加一个外键对应的主表实体对象属性
package com.hqyj.entity;
import java.util.ArrayList;
import java.util.Objects;
/*
* 创建带有外键字段的表(从表)的实体类
* 1、写出所有字段对应的属性
* 2、写出外键对应的主表实体对象
* */
public class BookInfo {
private int bookId;
private int typeId;
private String bookName;
private String bookAuthor;
private int bookPrice;
private int bookNum;
private String publisherDate;
private String bookImg;
//额外添加属性:外键对应的主表实体对象
private BookType bookType;
/*
* 重写equals和hashcode
* */
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BookInfo bookInfo = (BookInfo) o;
return bookId == bookInfo.bookId &&
typeId == bookInfo.typeId &&
bookPrice == bookInfo.bookPrice &&
bookNum == bookInfo.bookNum &&
Objects.equals(bookName, bookInfo.bookName) &&
Objects.equals(bookAuthor, bookInfo.bookAuthor) &&
Objects.equals(publisherDate, bookInfo.publisherDate) &&
Objects.equals(bookImg, bookInfo.bookImg) &&
Objects.equals(bookType, bookInfo.bookType);
}
@Override
public int hashCode() {
return Objects.hash(bookId, typeId, bookName, bookAuthor, bookPrice, bookNum, publisherDate, bookImg, bookType);
}
public BookInfo() {
}
/*
* 用于添加的构造方法
* */
public BookInfo(int typeId, String bookName, String bookAuthor, int bookPrice, int bookNum, String publisherDate, String bookImg) {
this.typeId = typeId;
this.bookName = bookName;
this.bookAuthor = bookAuthor;
this.bookPrice = bookPrice;
this.bookNum = bookNum;
this.publisherDate = publisherDate;
this.bookImg = bookImg;
}
/*
* 查询的构造方法
* */
public BookInfo(int bookId, int typeId, String bookName, String bookAuthor, int bookPrice, int bookNum, String publisherDate, String bookImg, BookType bookType) {
this.bookId = bookId;
this.typeId = typeId;
this.bookName = bookName;
this.bookAuthor = bookAuthor;
this.bookPrice = bookPrice;
this.bookNum = bookNum;
this.publisherDate = publisherDate;
this.bookImg = bookImg;
this.bookType = bookType;
}
@Override
public String toString() {
return "BookInfo{" +
"bookId=" + bookId +
", typeId=" + typeId +
", bookName='" + bookName + '\'' +
", bookAuthor='" + bookAuthor + '\'' +
", bookPrice=" + bookPrice +
", bookNum=" + bookNum +
", publisherDate='" + publisherDate + '\'' +
", bookImg='" + bookImg + '\'' +
", bookType=" + bookType +
'}';
}
public int getBookId() {
return bookId;
}
public void setBookId(int bookId) {
this.bookId = bookId;
}
public int getTypeId() {
return typeId;
}
public void setTypeId(int typeId) {
this.typeId = typeId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getBookAuthor() {
return bookAuthor;
}
public void setBookAuthor(String bookAuthor) {
this.bookAuthor = bookAuthor;
}
public int getBookPrice() {
return bookPrice;
}
public void setBookPrice(int bookPrice) {
this.bookPrice = bookPrice;
}
public int getBookNum() {
return bookNum;
}
public void setBookNum(int bookNum) {
this.bookNum = bookNum;
}
public String getPublisherDate() {
return publisherDate;
}
public void setPublisherDate(String publisherDate) {
this.publisherDate = publisherDate;
}
public BookType getBookType() {
return bookType;
}
public void setBookType(BookType bookType) {
this.bookType = bookType;
}
public String getBookImg() {
return bookImg;
}
public void setBookImg(String bookImg) {
this.bookImg = bookImg;
}
}
3、创建两个实体类的数据访问层对象
BookTypeDao类
package com.hqyj.dao;
import com.hqyj.entity.BookType;
import com.hqyj.util.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class BookTypeDao {
Connection conn;
PreparedStatement pst;
ResultSet rs;
/*
* 查询所有类型
* */
public ArrayList<BookType> queryAll(){
ArrayList<BookType> list = new ArrayList<BookType>();
conn = DBUtil.getConn();
try {
String sql = "select * from book_type";
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
while (rs.next()){
BookType bookType = new BookType(rs.getInt(1),rs.getString(2));
list.add(bookType);
}
}catch (SQLException e){
System.out.println("查询所有异常"+e);
}
return list;
}
/*
* 根据类型编号查询类型对象
* */
public BookType queryById(int typeId){
conn = DBUtil.getConn();
try {
//预处理sql语句
pst = conn.prepareStatement("select * from book_type where type_id=?");
//给?赋值
pst.setInt(1,typeId);
//调用查询
rs = pst.executeQuery();
//遍历结果集
if (rs.next()){
String typeName = rs.getString(2);
BookType bookType = new BookType(typeId,typeName);
return bookType;
}
}catch (Exception e){
System.out.println("根据id查询异常"+ e);
}finally {
DBUtil.release(conn,pst,rs);
}
return null;
}
}
BookInfoDao类
package com.hqyj.dao;
import com.hqyj.entity.BookInfo;
import com.hqyj.entity.BookType;
import com.hqyj.util.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class BookInfoDao {
BookTypeDao bookTypeDao = new BookTypeDao();
Connection conn;
PreparedStatement pst;
ResultSet rs;
/*
* 查询所有类型
* */
public ArrayList<BookInfo> queryAll(){
ArrayList<BookInfo> list = new ArrayList<BookInfo>();
conn = DBUtil.getConn();
try {
String sql = "select * from book_info";
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
while (rs.next()){
int bookId=rs.getInt(1);
int typeId=rs.getInt(2);
String bookName = rs.getString(3);
String bookAuthor = rs.getString(4);
int bookPrice = rs.getInt(5);
int bookNum = rs.getInt(6);
String publisherDate = rs.getString(7);
String bookImg = rs.getString(8);
BookInfo bookInfo = new BookInfo(bookId,typeId,bookName,bookAuthor,bookPrice,bookNum,publisherDate,bookImg,bookTypeDao.queryById(typeId));
list.add(bookInfo);
}
}catch (SQLException e){
System.out.println("查询所有异常"+e);
}
return list;
}
}
4、创建Servlet
BookInfoServlet类
package com.hqyj.servlet;
import com.hqyj.dao.BookInfoDao;
import com.hqyj.entity.BookInfo;
import com.hqyj.util.Cart;
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 java.io.IOException;
import java.util.List;
@WebServlet("/bookInfo")
public class BookInfoServlet extends HttpServlet {
BookInfoDao bookInfoDao = new BookInfoDao();
Cart cart = new Cart();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String op = req.getParameter("op");
HttpSession session = req.getSession();
switch (op){
case "queryAll":
//查询所有图书,保存到请求中,跳转到页面
List<BookInfo> list = bookInfoDao.queryAll();
req.setAttribute("list",list);
req.getRequestDispatcher("./pages/bookList.jsp").forward(req,resp);
break;
}
}
}
5、创建页面
<!--样式略-->
<%for (BookInfo bookInfo : list) {%>
<div>
<img src="图片路径">
<p class="title"><%=bookInfo.getBookName()%>
</p>
<p class="desc"><%=bookInfo.getBookAuthor()%>|<%=bookInfo.getBookType().getTypeName()%>
</p>
<p class="price"><%=bookInfo.getBookPrice()%>元起</p>
</div>
<% }%>