jsp学习笔记

基础语法

脚本元素

  • 脚本代码
    <%...%>

    • <% int number=0; %>
      在脚本代码中声明的变量是局部变量,只在当前页面有效
  • 声明
    <%!...%>

    • <%! int number=0; %>
      在声明中定义的变量是全局变量,访问同一个jsp页面的用户,操作的是同一个全局变量
  • 表达式
    <%=...%>
    表达式可以是任意合法的java表达式,该表达式的值会被计算,并将结果以字符串的形式返回到页面中。
    注意:jsp表达式不是程序代码,末尾不加 ;

    • 打印乘法表
      <%@page contentType="text/html;charset=UTF-8"%>
      <html>
      <head>
      <title>expressionDemo</title>
      </head>
      <body>
      <h1>九九乘法表</h1>
      <table>
      <%for (int i=1;i<=9;i++){%>
      <tr>
      <%for (int j=1;j<=i;j++){%>
      <td><%=i%>*<%=j%>=<%=i*j%></td>
      <%}%>
      </tr>
      <%}%>
      </table>
      </body>
      </html>
  • 注释

    • <%--...--%>
      在jsp转译为java类时被忽略
    • 在jsp脚本代码中也可以使用java的注释方法,这些注释在编译时被忽略
    • 也可以使用HTML的注释语法<!--...-->,注释内容可以在浏览源代码中查看

      指令元素

      在jsp文件转译时处理,用于实现类的引入、定义jsp页面的编码格式、包含其他文件、引入新的标签库等
      <%@指令名 属性="值">
      jsp页面默认引入的几个包:java.lang、.....
  • page指令
    定义全局属性,可出现多次,但只有import属性可以在同一个jsp文件中出现多次
    属性

    • language:定义脚本代码使用的语言,默认java
    • import:定义jsp页面导入的类包
    • errorPage:当请求错误时,会被重定向的URL
    • isErrorPage:值为true时,表当前页面是一个错误处理页面
    • contentType:定义页面响应信息的MIME类型和编码方式
      • <%@page contentType="text/html;charset=UTF-8"%>
    • pageEncoding:定义页面响应信息的编码方式
  • include指令
    在当前页面中的指定位置插入另一个文件的内容,属于静态包含(先包含再转译),只编译一次
    <%@include file="url"%>url是一个相对路径

  • taglib指令

    标记元素

    实现动态文件包含、页面跳转、使用javaBean组件等
    <jsp:标记名 属性="值">
    </jsp:标记名>

  • <jsp:include>标记
    先分别转译、编译、运行,再将结果合并
    格式:
    <jsp:include page="path">
    <jsp:param name="Name1" value="Value1" />
    <jsp:param name="Name2" value="Value2" />
    </jsp:include>

  • <jsp:forward>标记
    实现页面请求的转发,(转发后,URL显示不变)
    格式:
    <jsp:forward page="path">
    <jsp:param name="name1" value="value1" />param用来在转发的同时传递参数
    </jsp:forward>

    • 比较:<jsp:forward>response.sendRedirect("")

      • <jsp:forward>请求转发,URL不变,保留第一次请求时的数据

      • response.sendRedirect("")重定向,URL改变,不保留第一次请求时的数据

  • <jsp:param>标记
    用于配合<jsp:forward>标记和<jsp:include>标记
    格式:
    <jsp:param name="name" value="value"/>

    • 在相应页面使用request.getParameter()来接收页面中<jsp:forward>标记和<jsp:include>标记传递的参数

    jsp内置对象

    • request
    • response
    • pageContext
    • session
    • application
    • out:用于向客户端输出信息
    • config:封装了jsp页面对应servlet的配置信息
    • page:jsp页面类实例
    • exception:封装了异常信息

    数据库的访问

    建立目录结构

    在tomcat的webapp下建立

    JDBC

    • 定义: JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。

    • JDBC核心组件

      • DriverManager:
        此类管理数据库驱动程序列表。使用通信子协议将来自java应用程序的连接请求与适当的数据库驱动程序匹配。
      • Driver:
        此接口处理与数据库服务器的通信,我们很少会直接与Driver对象进行交互。而是使用DriverManager对象来管理这种类型的对象。
      • Connection:
        该界面具有用于联系数据库的所有方法。连接对象表示通信上下文,即,与数据库的所有通信仅通过连接对象。
      • Statement:
        使用从此接口创建的对象将SQL语句提交到数据库。除了执行存储过程之外,一些派生接口还接受参数。
      • ResultSet:
        在使用Statement对象执行SQL查询后,这些对象保存从数据库检索的数据。它作为一个迭代器,允许我们移动其数据。
    • SQLException:
      此类处理数据库应用程序中发生的任何错误

    数据库连接步骤

    • 导入jdbc的api:先导入java.sql包

    <%@page import="java.sql.*" %>

    • 加载驱动程序

    Class.forName("com.mysql.jdbc.Driver");

    • 创建数据库的连接

    • 使用DriverManager的getConnection(String url , String username , String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得。
      //连接MySql数据库,用户名和密码都是root

      String sConnStr="jdbc:mysql://localhost:3306/newsdb";
      String username = "root" ;
      String password = "root" ;
      Connection conn = DriverManager.getConnection(sConnStr , username , password ) ;

    • 创建Statement对象

      • 要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3 种类型:
        执行静态SQL语句。通常通过Statement实例实现。
        执行动态SQL语句。通常通过PreparedStatement实例实现。
        执行数据库存储过程。通常通过CallableStatement实例实现。
        具体的实现方式:
        Statement stmt = conn.createStatement() ;
    • 执行SQL语句

      • Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate 和execute

        • ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句 ,返回一个结果集(ResultSet)对象。

          如:

        查询:String sql = "select * from user";

        ResultSet rs = stmt.executeQuery(sql);

        • int executeUpdate(String sqlString):用于执行INSERT、UPDATE、DELETE语句以及SQL DDL语句,如CREATE TABLE和DROP TABLE等

          如:

        删除:String sql = "delete from user where id="+id

        插入:String sql = "INSERT INTO user(username,password,gender,resume) "+" values('"+uname+"','"+pwd+"','"+gender+"','"+resume+"')";

        int result = stmt.executeUpdate(sql)

        • execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的语句。
    • 遍历结果集
      两种情况:

      • 执行更新返回的是本次操作影响到的记录数。

      • 执行查询返回的结果是一个ResultSet对象。

        • ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些
          行中数据的访问。
      • 使用结果集(ResultSet)对象的访问方法获取数据:
        while(rs.next()){
        String name = rs.getString("name") ;
        String pass = rs.getString(1) ; // 此方法比较高效
        }
        (列是从左到右编号的,并且从列1开始)

      • 处理异常,关闭JDBC对象资源
        操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声
        明顺序相反:

        • 先关闭requestSet
        • 再关闭preparedStatement
        • 最后关闭连接对象connection
          • conn.close();

HTTP会话机制

  • 服务器端向客户端增加Cookie:response.addCookie()
  • Cookie用javax.servlet.http.Cookie类表示
  • 相关语句:
    • 获取cookie名称:getName()
    • 获取cookie值:getValue()
    • 设置最大有效期:setMaxAge(),单位是秒
  • 除了自己设定的Cookie内容外,Cookie中还会有JSESSIONID值,这是服务器自动创建的Cookie

session

  • 客户端第一次请求服务器时,服务器产生一个session对象(用于保存该用户的信息),并且每个session对象,都会有唯一的sessionId(用于区分其他session),服务端会产生一个Cookie,并且该Cookie的JSESSIONID的值为sessionId的值,然后服务器会在响应的同时,将该Cookie发送给客户端,至此,客户端就有了一个Cookie(JSESSIONID)。因此,客户端的cookkie就可以和服务器端的session一一对应。
  • 相关语句
    • 获取session对象的属性值getAttribute()
    • 设置session对象的属性以及属性值setAttribute(name,value)
    • 获取session对象的创建时间getCreationTime(),返回1970年1月1日至今的毫秒数
    • 销毁session对象的信息,但session对象本身不被销毁invalidate()
    • 设置会话超时时间setMaxInactiveInterval()

常见报错解决

  • 报错:java.sql.SQLException: The server time zone value ‘XXXXXX’ is unrecognized or represents more than one time zone.
    • 使用的数据库是MySQL,驱动是6.0.3,这是由于数据库和系统时区差异所造成的,在jdbc连接的url后面加上serverTimezone=GMT即可解决问题,如果需要使用gmt+8时区,需要写成GMT%2B8,否则会被解析为空。再一个解决办法就是使用低版本的MySQL jdbc驱动,5.1.28不会存在时区的问题。
  • 乱码问题,将编码设置统一即可

jsp常用语句

jsp页面的流程控制

  • 超链接<a href="..."></a>
  • form表单的action属性
  • 重定向sendRedirect("...")
  • 请求转发<jsp:forward page="...">

jsp页面的数据传递

  • form表单:对应使用request.getParameter()获取表单数据
  • URL传参:如:http://123.com/name?id=1&pwd=1
  • <jsp:param>标记传参:对应使用``

作用域

  • application:有效范围从web应用启动到结束
  • session:有效范围是当前会话
  • request:有效范围是当前请求,从发出请求到服务器处理完成请求,返回响应
  • page:有效范围是当前页面

javabean技术

概述

jsp中使用javabean来传递参数和实现数据处理。javabean就是一个符合特定条件的java类,编写javabean就是创建一个java类。

分类

  • 封装数据
  • 封装业务逻辑

编写

  • 类公有化

    • 具有无参数的公共构造方法
  • 属性私有化

  • 具有公共的setter方法和getter方法来供外部存取其私有属性

    注:setter方法和getter方法的命名规则是相应属性名的第一个字母大写后,与setter或getter连写,如:username的getter方法应该是getUsername。另外javabean要放在命名包里,不能放在默认包中

    如:

    package bean;
    public class Counter{
        private int counter=0;
        public String getCounter(){
          counter++;
            return ""+counter;
      }
    }
    
  • 使用javabean

    • <jsp:useBean>可以在 JSP 中声明一个 JavaBean,然后使用。声明后,JavaBean 对象就成了脚本变量,可以通过脚本元素或其他自定义标签来访问

      • <jsp:useBean id="id" class="package.class" scope="page|request|session|application"/>
      • 功能:在指定scope范围内查找该javabean对象,如果存在则返回给id变量,否则实例化该对象,并将引用赋值给id变量
      • 说明:id属性表示创建的对象的名字,class属性指定javabean的完整类名,scope属性指定所创建的对象的作用范围,默认值是page
    • <jsp:setProperty>为javabean的一个或多个属性赋值,实际是调用javabean对象的setter方法来实现赋值,使用时,要先用<jsp:useBean>获得一个对象

      • 自动匹配赋值<jsp:setProperty name="beanName" property="*" />

        name指出javabean对象的名字,其值与usebean标签的id对应,property指出javabean对象的属性名,*表示匹配所有属性

      • 自动匹配指定属性<jsp:setProperty name="beanName" property="beanPropertyName" />

      • 手动设置属性:<jsp:setProperty name="beanName" property="beanPropertyName" value="value"/>

      • 手动指定request参数名赋值:<jsp:setProperty name="beanName" property="beanPropertyName" param="requestParamName"/>

        param指定用哪个request对象的参数作为javabean属性的值,适用于javabean属性名和request参数名不同的情况

    • <jsp:getProperty>用于从某个scope范围内获取指定属性的值,并显示在jsp页面中

      • <jsp:getProperty name="beanName" property="beanPropertyName"/>
原文地址:https://www.cnblogs.com/hacker-snail/p/14134849.html