JSP元素
一、JSP执行过程
Web容器处理JSP请求有三个阶段:转译(translate)——>编译(compile)——>解释(interpret)
客户端发出请求
Web容器将JSP转译成Servlet源代码
Web容器将产生的源代码进行编译
Web容器加载编译后的代码并执行
把执行结果响应至客户端
第一次请求之后,Web容器可以重用已经编译好的字节码文件。
注意:如果对JSP文件进行了修改,Web容器会重新对JSP文件进行翻译和编译。
二、JSP元素
创建Web项目JSPElementsDemo:
在web目录创建demo01.html页面:
在web目录里创建demo02.jsp页面:
demo02.jsp页面代码:
<%-- 页面指令 --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 标签库指令 --%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>demo02</title>
</head>
<body>
<%-- 包含指令 --%>
<%@include file="demo01.html"%>
<%-- 脚本元素 --%>
<%
String msg1 = "Welcome to JSP World!";
%>
<%-- 表达式元素 --%>
<h3><%= msg1 %></h3>
<%-- 采用标签库和表达式语言(EL:Expression Language)--%>
<c:set var="msg2" value="Welcome to JSTL World!" scope="page"/>
<h3><c:out value="${msg2}" /></h3>
<c:set var="age" value="16" />
<c:if test="${age >= 18}">
<h3>欢迎访问本网站~</h3>
</c:if>
<c:if test="${age < 18}">
<h3>本网站不欢迎你~</h3>
</c:if>
<c:choose>
<c:when test="${age >= 18}">
<h3>欢迎访问本网站~</h3>
</c:when>
<c:otherwise>
<h3>本网站不欢迎你~</h3>
</c:otherwise>
</c:choose>
<%-- 计算1+2+3+...+100的值 --%>
<%-- (1)脚本方法 --%>
<%
int num=0;
for(int i=1;i<=100;i++){
num+=i;
}
%>
<h3><%= num %></h3>
<%-- (2)标签方法 --%>
<c:set var="sum" value="0" />
<c:forEach var="i" begin="1" end="100">
<c:set var="sum" value="${sum + i}" />
</c:forEach>
<h3>1+2+3...+100=${sum}</h3>
<h3>1+2+3...+100=<c:out value="${sum}" /> </h3>
</body>
</html>
启动服务器访问http://localhost:8080/JSPElementsDemo/demo02.jsp:
包含动作元素jsp:include演示:
启动服务器,访问http://localhost:8080/JSPElementsDemo/demo03.jsp:
转发动作元素jsp:forward演示:
在src里创建net.hw.bean包,在里面创建User实体类:
User实体代码:
package net.xsp.bean;
/**
* 功能:用户实体类
* 日期:2019年9月12日
*/
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
任务:不用useBean动作元素,用脚本元素与表达式元素来完成上述任务。
<%@ page import="net.xsp.bean.User" %>
<%--
Created by IntelliJ IDEA.
User: Stranger
Date: 2019/9/12
Time: 10:19
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>demo07</title>
</head>
<body>
<%-- 创建用户实体对象 --%>
<jsp:useBean id="user" class="net.xsp.bean.User" scope="page"/>
<%-- 设置实体属性 --%>
<jsp:setProperty name="user" property="id" value="1"/>
<jsp:setProperty name="user" property="username" value="xsping"/>
<jsp:setProperty name="user" property="password" value="123456"/>
<%-- 获取实体属性值 --%>
<h3>id: <jsp:getProperty name="user" property="id"/></h3>
<h3>username: <jsp:getProperty name="user" property="username"/></h3>
<h3>passord: <jsp:getProperty name="user" property="password"/></h3>
<%-- 输出用户实体对象 --%>
<h3><%= user %></h3>
<%-- java脚本形式 --%>
<%
User u = new User();
u.setId(2);
u.setUsername("root");
u.setPassword("654321");
%>
<h3>id: <%= u.getId() %></h3>
<h3>username: <%= u.getUsername() %></h3>
<h3>password: <%= u.getPassword() %></h3>
</body>
</html>
课后作业:编写JSP页面,计算2000~2019年期间有几个闰年。使用表达式输出结果。
JPS隐含对象
一、什么是JSP隐含对象
JSP隐含对象是 Web 容器创建的一组对象
JSP隐含对象的名称是JSP 的保留字
JSP隐含对象是可以直接在JSP页面使用的对象,无需使用“new”获取实例
二、JSP隐含对象
三、request对象
1.在web目录里创建用户注册页面register.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册</title>
<script type="text/javascript" src="js/check.js"></script>
</head>
<body>
<h3 style="text-align: center">用户注册</h3>
<form action="do_register.jsp" method="post">
<table border="1" cellpadding="10px" style="margin: 0px auto">
<tr>
<td align="center">用户名</td>
<td><input type="text" id="username" name="username" size="35"></td> <!--设置表单元素的id属性是为了页面JavaScript代码能访问该元素,设置表单元素的name属性是为了表单的处理页面能够通过request.getParameter()方法获取到表单元素的值。-->
</tr>
<tr>
<td align="center">密 码</td>
<td><input type="password" id="password" name="password" size="35"></td>
</tr>
<tr>
<td align="center">你从哪里知道本网站</td>
<td>
<input type="checkbox" name="channel" value="报刊">报刊
<input type="checkbox" name="channel" value="网络">网络
<input type="checkbox" name="channel" value="朋友推荐">朋友推荐
<input type="checkbox" name="channel" value="电视">电视
</td>
</tr>
<tr align="center">
<td colspan="2">
<input type="submit" value="提交" onclick="return checkForm();"> <!-- 为真继续执行下去,为假则不能通过此处验证 -->
<input type="reset" value="重置">
</td>
</tr>
</table>
</form>
<!--
<script type="text/javascript">
function checkForm() {
// 获取用户名与密码元素
var txtUsername = document.getElementById("username");
var txtPassword = document.getElementById("password");
// 获取用户名与密码数据
var username = txtUsername.value;
var password = txtPassword.value;
// 用户名非空校验
if (username == "") {
alert("注意:用户名不能为空!");
txtUsername.focus(); //获取焦点,使焦点指向username
return false; // 返回false使它不能通过
}
// 密码非空校验
if (password == "") {
alert("注意:密码不能为空!");
txtPassword.focus();
return false;
}
return true;
}
</script>
-->
</body>
</html>
2.在web目录里创建处理注册页面do_register.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>显示注册信息</title>
</head>
<body>
<%
// 设置请求对象字符编码格式
request.setCharacterEncoding("utf-8");
// 读取用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
// 读取渠道复选框的值
String[] channels = request.getParameterValues("channel");
StringBuffer buffer = new StringBuffer();
if (channels != null) {
for (String channel: channels) {
buffer.append(channel + " ");
}
}
%>
<h3>用户注册信息</h3>
用户名: <%= username %><br/>
密 码: <%= password %><br/>
渠 道: <%= buffer.toString() %>
</body>
</html>
课堂练习:给用户注册页面添加表单校验,要求用户名与密码非空。
其实,我们可以将表单校验脚本提取出来创建一个js文件,然后导入页面来使用。
删除register.jsp页面里的脚本元素
导入check.js脚本
课后作业:注册页面信息的获取。给出了register.jsp,要求编写do_register.jsp,获取注册信息并显示。
四、response对象
1.在web目录里创建登录页面login.jsp
2.在web目录里创建登录处理页面do_login.jsp
3.在web目录里创建登录成功页面success.jsp
4.在web目录里创建登录失败页面failure.jsp
五、out对象
六、session 对象
long getCreationTime():取得session产生的时间,单位是毫秒
String getId():取得session 的ID
long getLastAccessedTime():取得用户最后通过这个session送出请求的时间
long getMaxInactiveInterval():取得最大session不活动的时间,若超过这时间,session 将会失效
void invalidate():取消session 对象,并将对象存放的内容完全抛弃
boolean isNew():判断session 是否为"新"的
void setMaxInactiveInterval(int interval):设定最大session不活动的时间,若超过这时间,session 将会失效
void setAttribute():设置session对象的属性
void getAtrribute():获取session对象的属性
案例演示:页面跳转传递会话属性数据
利用JDBC访问数据库
一、JDBC相关知识
二、创建数据库与表
三、实例演示——用户登录
创建Web项目LoginDemo01
User
package net.xsp.bean;
/**
* 功能:用户实体类
* 作者:
* 日期:2019年10月10日
*/
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
UserDao
package net.xsp.dao;
import net.xsp.bean.User;
/**
* 功能:用户数据访问接口
* 作者:
* 日期:2019年10月10日
*/
public interface UserDao {
/**
* 登录方法
*
* @param username
* @param password
* @return true - 登录成功;false - 登录失败
*/
boolean login(String username, String password);
/**
* 插入方法
*
* @param user
* @return 插入记录数
*/
int insert(User user);
}
UserDaoImpl
package net.xsp.dao.impl;
import net.xsp.bean.User;
import net.xsp.dao.UserDao;
import net.xsp.dbutil.ConnectionManager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 功能:用户数据访问接口实现类
* 作者:
* 日期:2019年10月10日
*/
public class UserDaoImpl implements UserDao {
/**
* 登录方法
*
* @param username
* @param password
* @return true - 登录成功;false - 登录失败
*/
@Override
public boolean login(String username, String password) {
// 声明标志变量
boolean flag = false;
// 声明数据库连接
Connection conn = null;
try {
// 获取数据库连接
conn = ConnectionManager.getConnection();
// 定义SQL字符串
String strSQL = "select * from t_user where username = ? and password = ?";
// 创建预备语句对象
PreparedStatement pstmt = conn.prepareStatement(strSQL);
// 设置占位符的值
pstmt.setString(1, username);
pstmt.setString(2, password);
// 执行SQL查询,返回结果集
ResultSet rs = pstmt.executeQuery();
// 判断结果集里是否有记录
if (rs.next()) {
flag = true;
} else {
flag = false;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭数据库连接
ConnectionManager.closeConn(conn);
}
// 返回标志变量
return flag;
}
/**
* 插入方法
*
* @param user
* @return 插入记录数
*/
@Override
public int insert(User user) {
// 声明插入记录数变量
int count = 0;
// 声明数据库连接
Connection conn = null;
try {
// 获取数据库连接
conn = ConnectionManager.getConnection();
// 定义SQL字符串
String strSQL = "insert into t_user (username, password) values (?, ?)";
// 创建预备语句对象
PreparedStatement pstmt = conn.prepareStatement(strSQL);
// 设置占位符的值
pstmt.setString(1, user.getPassword());
pstmt.setString(2, user.getPassword());
// 执行SQL更新,返回更新记录数
count = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭数据库连接
ConnectionManager.closeConn(conn);
}
// 返回插入记录数
return count;
}
}
ConnectionManager
package net.xsp.dbutil;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* 功能:数据库链接管理类
* 作者:
* 日期:2019年10月10日
*/
public class ConnectionManager {
// 定义连接数据库的参数值
private static final String DRIVER = "com.mysql.jdbc.Driver";
private static final String URL = "jdbc:mysql://localhost:3306/xspdb";
private static final String USER = "root";
private static final String PASSWORD = "1";
/**
* 私有化构造方法,拒绝实例化
*/
private ConnectionManager() {
}
/**
* 获取数据库连接静态方法
*
* @return 数据库连接
*/
public static Connection getConnection() {
// 声明数据库连接
Connection conn = null;
try {
// 安装数据库驱动程序
Class.forName(DRIVER);
// 获取数据库连接
conn = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
// 返回数据库连接
return conn;
}
/**
* 关闭数据库连接静态方法
*
* @param conn 数据库连接
*/
public static void closeConn(Connection conn) {
if (conn != null) {
try {
if (!conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
LoginServlet
package net.xsp.servlet;
import net.xsp.dao.UserDao;
import net.xsp.dao.impl.UserDaoImpl;
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.net.URLEncoder;
@WebServlet(name = "LoginServlet", value = "/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置请求对象字符编码
request.setCharacterEncoding("utf-8");
// 获取表单提交的数据
String username = request.getParameter("username");
String password = request.getParameter("password");
// 创建用户数据访问对象
UserDao userDao = new UserDaoImpl();
//获取请求对应的会话
HttpSession session = request.getSession();
// 判断登录是否成功
if (userDao.login(username, password)) {
// 清除session里可能存在的errMsg属性
if (session.getAttribute("errMsg") != null) {
session.removeAttribute("errMsg");
}
// 采用从定向,跳转到登录成功页面
response.sendRedirect("success.jsp?username=" + URLEncoder.encode(username,"utf-8"));
} else {
// 设置session里的errMsg属性
session.setAttribute("errMsg", "用户名或密码错误,请重新登录");
// 采用从定向,跳转到登录页面
response.sendRedirect("login.jsp");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<html>
<head>
<title>用户登录</title>
</head>
<body>
<h3 style="text-align: center">用户登录</h3>
<form action="login" method="post">
<table border="1" cellpadding="10" style="margin: 0px auto">
<tr>
<td align="center">用户名</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td align="center">密 码</td>
<td><input type="password" name="password"/></td>
</tr>
<tr align="center">
<td colspan="2">
<input type="submit" value="登录"/>
<input type="reset" value="重置"/>
</td>
</tr>
</table>
</form>
<%
String errMsg = (String) session.getAttribute("errMsg");
if (errMsg != null) {
out.println("<p style='text-align: center; color: red'>" + new String(errMsg.getBytes("ISO-8859-1"), "utf-8") + "</p>");
}
%>
</body>
</html>
do_login.jsp
<%@ page import="java.sql.*" %>
<%@ page import="java.net.URLEncoder" %>
<%@ page import="net.xsp.dbutil.ConnectionManager" %>
<%@ page import="net.xsp.dao.UserDao" %>
<%@ page import="net.xsp.dao.impl.UserDaoImpl" %>
<%
// 设置请求对象字符编码
request.setCharacterEncoding("utf-8");
// 获取表单提交的数据
String username = request.getParameter("username");
String password = request.getParameter("password");
// 创建用户数据访问对象
UserDao userDao = new UserDaoImpl();
// 判断登录是否成功
if (userDao.l