第2阶段 第15讲 JSP核心技术(上)

课程回顾

转发和重定向

ServletConfig

ServletContext

处理多方法

JSP的概念

JSP: java server page java服务器端页面,核心内容是在HTML代码中嵌入JAVA代码,实现动态的网页技术。

JSP(全称JavaServer Pages)是由[Sun Microsystems](https://baike.baidu.com/item/Sun Microsystems)公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTMLXML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。

JSP将Java代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。JSP引入了被称为“JSP动作”的XML标签,用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签一样使用它们。标签库能增强功能和服务器性能,而且不受跨平台问题的限制。JSP文件在运行时会被其编译器转换成更原始的Servlet代码。JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。

JSP的执行过程

jsp的执行分为如下几个阶段

  • 翻译阶段: 把jsp页面翻译成java文件, xxx.java
  • 编译阶段: 把翻译后的java文件编译成字节码文件 .class
  • 执行阶段: 执行该字节码文件
    在这里插入图片描述

需要说明的: 并不是所有的JSP文件在服务器启动的时候就执行这几个阶段,只有客户端请求JSP页面的时候才会执行这几个阶段。只有第一次执行JSP页面的时候才会翻译、编译;第二次再执行JSP页面的时候,直接执行CLASS文件。所以第一次执行JSP的时候会慢一点。

JSP与Servlet区别与联系

有了Servlet技术之后,为什么还要有JSP技术?原因是Servlet不适合编写HTML代码,而是通过流输出的方式,开发效率非常低;所以SUN发布了JSP规范。目的是为了方便JAVA代码和HTML页面整合,这就是JSP技术。

区别: Servlet主要工作是获取数据,调用业务代码,根据业务返回结果进行响应; JSP的主要工作偏重于数据的呈现。

联系: success.jsp 翻译成 success_jsp.java

public final class success_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
               org.apache.jasper.runtime.JspSourceImports {

可以看到success_jsp继承自HttpJspBase这个类,HttpJspBase是Tomcat的代码
在这里插入图片描述

通过附加Tomcat源码,可以看出HttpJspBase的父类是HttpServlet,所以JSP本质就是一个Servlet;只是主要功能用来做页面显示的。

public abstract class HttpJspBase extends HttpServlet implements HttpJspPage {
    private static final long serialVersionUID = 1L;
    protected HttpJspBase() {
    }

JSP的组成部分

静态代码

就是HTML代码,包括基础的HTML、CSS、JavaScript这些静态代码;form标签、表格标签、ul标签、ol标签、div标签、span标签、a标签、p标签、h1—h6标签等等。CSS样式表: 标签选择器、类选择器、ID选择器;行内样式、内嵌样式、外部样式表文件;JavaScript:基础语法,DOM、BOM

小脚本

语法: <% %> , 内部就是普通的java代码。

<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">

function showInfo(){
	alert("xxxx");
}

</script>
</head>
<body>
<h1 οnclick="showInfo()">欢迎访问淘宝页面</h1>

<%
/*
小脚本只能写java代码
不会发送到客户端浏览器
*/
int a = 100;
int b = 200;
int c =  a + b;
out.println(c); //输出到浏览器
out.println("<br/>");
Date date  =  new  Date();
out.println(date);

%>

</body>
</html>

表达式

语法: <%= %> 用来向客户端浏览器输出内容的,相当于out.println;输出一个变量的值,或者是表达式的值。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
int sum = 0;
for(int i=1; i<=10; i++){
	sum += i;
}
String name = "张宏伟";
String address = "郑州市";
%>

1+2+3+ .... + 10  = <%="" + sum + 5 %>
<p><%=name + address %></p>
</body>
</html>

声明

语法: <%! %> 声明变量(变成该jsp的全局变量)、声明方法(该jsp的普通方法)

<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" import="java.util.Date" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
int age = 30;
%>


<%!
String name;  //姓名
String gender;//性别
int card = 1001;//卡号
%>
姓名: <%= name="1111" %><br/>
性别: <%=gender %><br/>
卡号: <%=card %>
<!-- 声明方法 -->
<%! 
//返回格式化后的日期
public String getDate(Date date){
	String str = null;
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	return sdf.format(date);
}
%>
<br/>
当前日期: <%=getDate( new Date() ) %>
</body>
</html>

注释

JSP页面包含的注释:

  • HTML注释: 会发送到客户端浏览器
  • java注释: 小脚本包括的注释, // 单行 /* */多行注释
  • JSP注释: <%— —%> 可以注释掉java代码
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%--  
//可以注释小脚本 表达式等动态内容
<%
out.println("=======");
%>

--%>

</body>
</html>

JSP指令

page指令、include指令、taglib指令

page指令: 定义该jsp页面的全局的信息,

  • language 指定的脚本语言 java
  • contentType: 内容类型
  • import: 导入包,可以出现多次
  • pageEncoding: 页面编码
  • errorPage: 指定错误页面
  • isErrorPage: 当前页面是否错误页面
  • isThreadSafe: 是否线程安全的
  • info: 页面的描述信息
  • autoFlush: 控制页面缓冲区自动刷新

include指令: 包括其他的页面

menu.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<a href="#">国际新闻</a><a href="#">国际新闻</a><a href="#">国际新闻</a><a href="#">国际新闻</a><a href="#">国际新闻</a><a href="#">国际新闻</a>

news.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%@ include file="menu.jsp" %>

<p>
在面试的时候面试官会怎么在单例模式中提问呢?

</p>
</body>
</html>

EL表达式简介

语法: ${ } 用来访问 request作用域的属性、ServletContext作用域、pageContext作用域( 只有当前的页面 )

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String name = "迪丽热巴";
String address = "新疆乌鲁木齐";
pageContext.setAttribute("pagename", name);
request.setAttribute("reqname", name);
%>
name = ${pagename}
</body>
</html>

综合案例: 用户表操作

在这里插入图片描述

编写DAO层

entity
package entity;

public class User {
	private String userCode;
	private String loginCode;
	private String userName;
	private String password;
	private String email;
 	//....省略getter、setter方法、构造方法   
}
dao接口
package dao;
import java.util.List;
import entity.User;
public interface UserDao {
	/**
	 * 登录方法
	 * @param username
	 * @param password
	 * @return
	 */
	User login(String username,String password);
	/**
	 * 用户注册
	 * @param user
	 * @return
	 */
	int saveUser(User user);
	/**
	 * 显示所有
	 * @return
	 */
	List<User> findAll();
}

dao实现类
package dao.impl;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

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

import dao.UserDao;
import entity.User;
import util.DruidUtil;

public class UserDaoImpl implements UserDao {
	@Override
	public User login(String username, String password) {
		User user = null;
		QueryRunner queryRunner = new QueryRunner( DruidUtil.getDataSource() );
		String sql = "select user_code userCode,login_code loginCode,user_name userName, password,email from js_sys_user where login_code=? and password=?";
		try {
			user = queryRunner.query(sql, new BeanHandler<User>(User.class), username,password);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return user;
	}

	@Override
	public int saveUser(User user) {
		int  rows = 0;
		QueryRunner queryRunner  =new QueryRunner(DruidUtil.getDataSource());
		String sql ="insert into js_sys_user(user_code,login_code,user_name,password,email)values(?,?,?,?,?)";
		Object[] params = {user.getUserCode(),user.getLoginCode(),user.getUserName(),user.getPassword(),user.getEmail()};
		try {
			rows = queryRunner.update(sql, params);//执行SQL语句,并把参数传过去
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return rows;
	}

	@Override
	public List<User> findAll() {
		List<User> list = new ArrayList<>();
		QueryRunner queryRunner = new QueryRunner(DruidUtil.getDataSource());
		String sql = "select user_code userCode,login_code loginCode,user_name userName, password,email from js_sys_user";
		try {
			list = queryRunner.query(sql, new BeanListHandler<User>(User.class));
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return list.size() > 0 ? list : null;
	}
}
连接池
url=jdbc:mysql://localhost:3306/db2?characterEncoding=utf8
username=root
password=123456
driverClassName=com.mysql.jdbc.Driver

maxActive=10
minIdle=2
maxWait=3000

工具类

package util;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import com.alibaba.druid.pool.DruidDataSourceFactory;

public class DruidUtil {

	private static DataSource dataSource;
	
	static {
		InputStream in = DruidUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
		try {
			Properties prop = new Properties();
			prop.load(in);
			dataSource = DruidDataSourceFactory.createDataSource(prop);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static DataSource getDataSource() {
		return dataSource;
	}
	
	public static Connection getConnection() {
		Connection conn = null;
		try {
			conn =  dataSource.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
}

编写Service层

service接口
package service;

import java.util.List;

import entity.User;

public interface UserService {
	/**
	 * 用户登录
	 * @param username
	 * @param password
	 * @return
	 */
	User login(String username,String password);
	/**
	 * 用户注册
	 * @param user
	 * @return
	 */
	int saveUser(User user);
	/**
	 * 查询所有
	 * @return
	 */
	public List<User> findAll() ;
}
service实现类
package service.impl;

import java.util.List;

import dao.UserDao;
import dao.impl.UserDaoImpl;
import entity.User;
import service.UserService;

public class UserServiceImpl  implements UserService{

	private UserDao userDao = new UserDaoImpl();
	@Override
	public User login(String username, String password) {
		
		return userDao.login(username, password);
	}
	@Override
	public int saveUser(User user) {
		//user.setCreateDate(new Date());
		return userDao.saveUser(user);
	}
	@Override
	public List<User> findAll() {
		return userDao.findAll();
	}
}

编写web层

编写请求jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="userServlet?flag=findAll">用户列表</a>
</body>
</html>
编写Servlet
package controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

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 entity.User;
import service.UserService;
import service.impl.UserServiceImpl;

@WebServlet("/userServlet")
public class UserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	private UserService userService = new UserServiceImpl();

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//设置请求的编码
		request.setCharacterEncoding("utf8");
		response.setContentType("text/html;charset=utf8");
		//获取请求标记
		String flag = request.getParameter("flag");
		if("reg".equals(flag)) {
			reg(request,response);
		}else if("login".equals(flag)) {
			login(request,response);
		}else if("findAll".equals(flag)){
			findAll(request,response);
		}else {
			PrintWriter out = response.getWriter();
			out.println("请求标记有误,请检查.");
			out.close();
		}
	}
	
	protected void findAll(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		List<User> list = userService.findAll();
		if(list != null) {
			request.setAttribute("ulist", list);
			request.getRequestDispatcher("user_list.jsp").forward(request, response);
		}else {
			response.sendRedirect("fail.html");
		}
	}
	protected void reg(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String userCode = request.getParameter("userCode");
		String loginCode = request.getParameter("loginCode");
		String username = request.getParameter("userName");
		String password = request.getParameter("password");
		String email = request.getParameter("email");
		User user = new User(userCode,loginCode,username,password,email);
		int rows = userService.saveUser(user);
		if(rows > 0) {
			request.setAttribute("u", user);
			request.getRequestDispatcher("success.jsp").forward(request, response);
		}else {
			response.sendRedirect("fail.html");
		}
	}
	
	protected void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		//调用登录的方法
		User user = userService.login(username, password);
		if(user != null) {
			request.getRequestDispatcher("success.jsp").forward(request, response);
		}else {
			response.sendRedirect("fail.html");
		}
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}
编写显示jsp页面
<%@page import="entity.User,java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
#t1{
	border: 1px solid #000;
	width: 800px;
	border-collapse: collapse;
}

#t1 tr td, #t1 tr th{
	border: 1px solid #000;
}
</style>
</head>
<body>
<table id="t1">
	<tr>
		<th>用户编码</th>
		<th>登录账号</th>
		<th>用户姓名</th>
		<th>用户密码</th>
		<th>电子邮箱</th>
	</tr>
<%
	List<User> list = (List<User>)request.getAttribute("ulist");
	for(User u : list){
%>
	<tr>
		<td> <%= u.getUserCode() %> </td>
		<td> <%= u.getLoginCode() %> </td>
		<td> <%= u.getUserName() %> </td>
		<td> <%= u.getPassword() %> </td>
		<td> <%= u.getEmail() %> </td>
	</tr>
<%
	}
%>
</table>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值