Servlet案例7:jsp技术及案例

jsp运行原理:

根据jsp文件创建java文件(servlet),并编译运行

第一次访问时会被翻译成servlet后执行

jsp三个指令:

1.page指令:页面翻译运行的属性的配置(通常使用默认)

  language="java"   可以嵌入的语言

  contentType="text/html; charset=UTF-8"   设置servlet的response.setContentType内容

  pageEncoding="UTF-8"   当前jsp文件的编码

  session="true"   默认session可以直接使用

  import="java.util.*"   导入java包

  errorPage="xxx.jsp"    如果java代码有错,跳转到某个新页面

  注意这里的错误不是404错误,而是代码错误,如果要配置404错误跳转的页面,需要在web.xml中配置

  

  isErrorPage="true"   是否是由于错误跳转后的页面

2.include指令:可以将其他的jsp页面包含到另一个jsp页面中

  <%@ include file ="地址" %>

3.taglib指令:在jsp页面中引入标签库

  <%@taglib uri="标签库地址" prefix="前缀"%>

jsp内置对象:

需要特别强调的2个对象

1.out对象:作用:在客户端页面输出内容

  三种方法:

  1.<% out.write("hello world");%>

  2.<% response.getWriter().write("hello world");%>

  3.<%="hello world"%>

  本质上后两者都是转化成out对象

  1,3写入out缓冲区,2写入response缓冲区

  由于tomcat会从response缓冲区获得内容,所以out缓冲区内容会被刷到response缓冲区

  于是先输出的是2,但是设置缓冲区(默认8kb)buffer=0kb,则按顺序输出

2.pageContext对象:页面上下文对象

  是一个域对象,范围是当前页面

  域对象方法setAttribute等和request,session域类似

  范围可以设置

        //使用pageContext向request域存数据
        //request.setAttribute("name", "zhangsan");
        //pageContext.setAttribute("name", "sunba");
        //pageContext.setAttribute("name", "lisi", PageContext.REQUEST_SCOPE);//request域
        //pageContext.setAttribute("name", "wangwu", PageContext.SESSION_SCOPE);//session域
        //pageContext.setAttribute("name", "tianqi", PageContext.APPLICATION_SCOPE);//application域

  取出

<%=request.getAttribute("name") %>
<%=pageContext.getAttribute("name", PageContext.REQUEST_SCOPE)%>

  特有的方法:findAttribute

<!-- findAttribute会从小到大搜索域的范围中的name -->
<!-- page域<request域<session域<application域 -->
<%=pageContext.findAttribute("name") %>

  获得其他对象

    <%
        pageContext.getRequest();
        pageContext.getOut();
    %>

静态包含和动态包含:

静态:<%@include file="地址" %>

合成一个页面,再进行翻译成java文件

动态:<jsp:include page="地址"/>

两个jsp文件翻译成java文件,编译运行

运行阶段调用方法include

请求转发:

<jsp:forward page="资源"/>

转发后地址不变

接下来做一个案例:

动态显示商品列表

数据库准备:

CREATE DATABASE web;
USE web;
CREATE TABLE `product` (
  `pid` VARCHAR(50) NOT NULL,
  `pname` VARCHAR(50) DEFAULT NULL,
  `market_price` DOUBLE DEFAULT NULL,
  `shop_price` DOUBLE DEFAULT NULL,
  `pimage` VARCHAR(200) DEFAULT NULL,
  `pdate` DATE DEFAULT NULL,
  `is_hot` INT(11) DEFAULT NULL,
  `pdesc` VARCHAR(255) DEFAULT NULL,
  `pflag` INT(11) DEFAULT NULL,
  `cid` VARCHAR(32) DEFAULT NULL,
  PRIMARY KEY (`pid`)
)

添加多条数据,这里略

对应类:

package domain;

public class Product {
    private String pid;
    private String pname;
    private double market_price;
    private double shop_price;
    private String pimage;
    private String pdate;
    private int is_hot;
    private String pdesc;
    private int pflag;
    private String cid;

    public String getPid() {
        return pid;
    }

    public void setPid(String pid) {
        this.pid = pid;
    }

    public String getPname() {
        return pname;
    }

    public void setPname(String pname) {
        this.pname = pname;
    }

    public double getMarket_price() {
        return market_price;
    }

    public void setMarket_price(double market_price) {
        this.market_price = market_price;
    }

    public double getShop_price() {
        return shop_price;
    }

    public void setShop_price(double shop_price) {
        this.shop_price = shop_price;
    }

    public String getPimage() {
        return pimage;
    }

    public void setPimage(String pimage) {
        this.pimage = pimage;
    }

    public String getPdate() {
        return pdate;
    }

    public void setPdate(String pdate) {
        this.pdate = pdate;
    }

    public int getIs_hot() {
        return is_hot;
    }

    public void setIs_hot(int is_hot) {
        this.is_hot = is_hot;
    }

    public String getPdesc() {
        return pdesc;
    }

    public void setPdesc(String pdesc) {
        this.pdesc = pdesc;
    }

    public int getPflag() {
        return pflag;
    }

    public void setPflag(int pflag) {
        this.pflag = pflag;
    }

    public String getCid() {
        return cid;
    }

    public void setCid(String cid) {
        this.cid = cid;
    }
}

servlet:

package servlet;

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

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import domain.Product;
import utils.DataSourceUtils;

public class ProductListServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //准备所有商品数据,存入List
        QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
        List<Product> productList = null;
        String sql = "select * from product";
        try {
            productList = runner.query(sql, new BeanListHandler<Product>(Product.class));
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //将数据存到request域,转发给jsp文件
        request.setAttribute("productList", productList);
        request.getRequestDispatcher("/product_list.jsp").forward(request, response);

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

用到的连接池工具类(注意c3p0-config.xml的配置):

package utils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class DataSourceUtils {

    private static DataSource dataSource = new ComboPooledDataSource();

    private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();

    // 直接可以获取一个连接池
    public static DataSource getDataSource() {
        return dataSource;
    }

    // 获取连接对象
    public static Connection getConnection() throws SQLException {

        Connection con = tl.get();
        if (con == null) {
            con = dataSource.getConnection();
            tl.set(con);
        }
        return con;
    }

    // 开启事务
    public static void startTransaction() throws SQLException {
        Connection con = getConnection();
        if (con != null) {
            con.setAutoCommit(false);
        }
    }

    // 事务回滚
    public static void rollback() throws SQLException {
        Connection con = getConnection();
        if (con != null) {
            con.rollback();
        }
    }

    // 提交并且 关闭资源及从ThreadLocall中释放
    public static void commitAndRelease() throws SQLException {
        Connection con = getConnection();
        if (con != null) {
            con.commit(); // 事务提交
            con.close();// 关闭资源
            tl.remove();// 从线程绑定中移除
        }
    }

    // 关闭资源方法
    public static void closeConnection() throws SQLException {
        Connection con = getConnection();
        if (con != null) {
            con.close();
        }
    }

    public static void closeStatement(Statement st) throws SQLException {
        if (st != null) {
            st.close();
        }
    }

    public static void closeResultSet(ResultSet rs) throws SQLException {
        if (rs != null) {
            rs.close();
        }
    }

}

jsp页面中的内容:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ page import="domain.*" %>
......
......
        <%

            //获得集合List<Product>
            List<Product> productList = (List<Product>)request.getAttribute("productList");
            if(productList!=null){
                for(Product product : productList){
                    out.write("<div class=‘col-md-2‘ style=‘height:250px‘>");
                    out.write("<a href=‘product_info.htm‘>");
                    out.write("<img src=‘"+product.getPimage()+"‘ width=‘170‘ height=‘170‘ style=‘display: inline-block;‘>");
                    out.write("</a>");
                    out.write("<p><a href=‘product_info.html‘ style=‘color: green‘>"+product.getPname()+"</a></p>");
                    out.write("<p><font color=‘#FF0000‘>商城价:&yen;"+product.getShop_price()+"</font></p>");
                    out.write("</div>");
                }
            }

        %>

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>WEB7</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>ProductListServlet</display-name>
    <servlet-name>ProductListServlet</servlet-name>
    <servlet-class>servlet.ProductListServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ProductListServlet</servlet-name>
    <url-pattern>/productList</url-pattern>
  </servlet-mapping>
</web-app>

这里运用了简单的MVC三层架构

注意:访问/product_list.jsp将会没有内容

访问/productList查询数据库转发后才会有内容

原文地址:https://www.cnblogs.com/xuyiqing/p/8421256.html

时间: 2024-10-31 19:18:57

Servlet案例7:jsp技术及案例的相关文章

Servlet以及一个简单的登录案例

1.servlet的概述 就是一个运行在web服务器上的小的java程序,用来接收和响应从客户端发送过来的请求,通常使用http协议 就是sun公司提供的一个动态网页开发技术 作用:用来处理从客户端浏览器发送的请求,并且可以对请求作出响应 编写类实现servlet: public class Demo1 implements Servlet{ @Override /** * 为用户处理请求和响应的方法. */ public void service(ServletRequest req, Ser

Servlet,jsp,JSP技术 ,JSP编程

 一.Servlet 思考 1 浏览器可以直接打开JAVA/class文件吗? 不可以 2浏览器可以打开HTML.JS 文件吗? 可以 3 JAVA程序可以生成HTML文件吗?可以的,用IO流. 4 浏览器解析的时候是需要HTTP协议的,JAVA普通类有没有HTTP协议呢? 普通类没有. JAVA-(class)浏览器如何访问呢? 浏览器---HTML A   JAVA通过IO流生成HTML--->浏览器 B   JAVA 需要加入HTTP协议 解决上面2个问题可以通过 Servlet C  如

IGMPv3广播电视网络应用案例之PIM-SSM技术

广播电视网络应用案例之PIM-SSM技术 一. PIM-SSM技术简介 组播业务模型分为SSM(Source-Specific Multicast,指定信源组播)模型和ASM(Any-Source Multicast,任意信源组播)模型.其中,ASM模型包括PIM-DM和PIM-SM两种组播业务模式,两者的相同点在于:都是使用组播组地址来标识一个组播会话. SSM模型与ASM不同之处在于,需要使用组播组地址和组播源地址,同时来标识一个组播会话.SSM模型需要通过IGMPv3的配合来维护主机与路由

磁珠磁环的选型--摘自《嵌入式系统可靠性设计技术及案例分析》

p127 – p129 磁珠:当导线中有电流穿过时,铁氧体对低频电流几乎没有什么阻抗,而对较高频率的电流会产生较大的衰减. 参数 额定电流 直流电阻 交流电阻 100MHz时的电阻值,用于衰减高频信号 磁珠磁环的选型--摘自<嵌入式系统可靠性设计技术及案例分析>

Servlet请求头response应用简单案例

Servlet请求头response应用简单案例:访问AServlet重定向到BServlet,5秒后跳到CServlet,并显示图片: AServlet 1 package cn.yzu; 2 import java.io.IOException; 3 import javax.servlet.ServletException; 4 import javax.servlet.http.HttpServlet; 5 import javax.servlet.http.HttpServletReq

新颖交互形式的H5案例浅析(技术分析)

最近我们前端这边搜集了50个比较优秀的H5. 那我这边呢,根据技术的分类,找出其中十个有代表性的案例,给大家解析一下他们技术的实现方案. 设计师也可以根据技术实现作为你们提供的素材参考 因为我主要是对技术分类的介绍,所以只取了不同技术实现的案例,同一种技术实现的不同的设计风格我就不列举出来了. 首先稍微提一下,其中包含的技术主要分为:createjs/thresjs/video内联播放/ 首先第一个呢,是之前腾讯爸爸出品的腾讯动漫的一个APP宣传的H5,这个H5是由腾讯内的TGideas团队完成

java jsp技术

 java jsp技术 j2ee核心模式第二版.pdf: http://www.t00y.com/file/78131413 Java.Web服务开发.pdf: http://www.t00y.com/file/78576912 Servlet JSP深入详解 基于Tomcat的Web开发>.(孙鑫).[PDF]@ckook.pdf: http://www.t00y.com/file/78131421 [30天学通Java.Web项目案例开发].吴亚峰&索依娜.扫描版.pdf: http

JSP 技术简述

在动态web项目的开发中,经常需要动态生成HTML内容(如系统中的当前在线人数需要动态生成).如果使用Servlet实现HTML页面数据的统计,则需要使用大量的输出语句.同时,如果静态内容和动态内容混合在一起,那么也将导致程序非常臃肿.为了客服Servlet的这些缺点,Oracle(Sun)公司推出了JSP技术. 1.JSP概述 JSP(Java Server Pages)是建立在Servlet规范之上的动态网页开发技术,其实质是一个简化的Servlet.在JSP文件中,HTML和Java代码共

Java Web之JSP技术

JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术.JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据. 1.JSP运行原理 当用户第一次访问JSP页面时,该页面会被JSPServlet翻译成一个Servlet源文件,然后将源文件翻译成.class文件.Servlet源文件和.class文件一般放在当