JSP的介绍

JSP是用于开发服务器端动态页面的技术,它允许在HTML中嵌入Java代码。文章详细介绍了JSP的组成部分,包括脚本、表达式、指令、注释、声明和动作。同时,讨论了页面跳转的方法,如内部的请求转发和外部的重定向,以及它们在不同场景下的适用性。此外,还提到了如何在JSP中处理数据传递和实体类的设计,特别是涉及到外键关系时的处理方式。
摘要由CSDN通过智能技术生成

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>
<% }%>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值