一、Jsp定义
- Jsp全名 java server pages ,由sun公司装满为了解决动态生成HTML文档的技术。
jsp主要作用是代替servlet程序回传html页面的数据,应为servlet程序回传的html页面数据是意见非常繁琐的事情,开发成本维护成本都比较高。
后端传递什么前端就渲染什么。
jsp的本质就是一个servlet程序。渲染数据效率很高。
二、jsp应用
2.1 通过servlet数据流输出信息
通过流的方式将标签一个个写到浏览器上。
将jsp的内容通过servlet文件以流的形式写出。
2.2 jsp头部的page指令(了解即可)
<%@page contentType=”text/html;charset=UTF-8”
language="java"%>
-i. language属性表示jsp翻译后是什么语言文件。暂时只支持java
- ii.contentType属性表示jsp返回的数据类型是什么。也是源码中response.setContentType()参数值
- iii. pageEncoding属性表示当前jsp页面文件本身的字符集。
- iv. import属性跟java源代码中一样。用于导包,导类。
- v.autoFlush属性设置当out输出流缓冲区满了之后,是否自动刷新冲级区。默认值是true。
- vi. buffer属性设置out缓冲区的大小。默认是8kb
vii.errorPage属性设置当jsp页面运行时出错,自动跳转去的错误
页面路径
2.3 jsp脚本
- 声明脚本的格式:<%!声明java代码%> 用的不多
表达式脚本的格式:<%=表达式%> 取值脚本
<body>
用户id:<%=user.getId()%><br>
用户名:<%=user.getUsername()%><br>
用户密码:<%=user.getPassword()%><br>
</body>
代码脚本的格式:<% java语句%> 可以在这个脚本里正常的写代码。
2.4 jsp中的三种注释
- html注释
- java注释<%Ⅱ/单行java注释产多行java注释·%>
- jsp注释<%— jsp注释—%>
2.5 jsp九大内置对象
1、request
2、response
3、pageContext
4、exception
5、application 域对象
6、out输出流对象
7、page
8、session 域对象
9、servletConfig 上下文配置对象。
2. 6 jsp四大域对象 (较为重要)
2.6.1 分类:
- pageContext 需要导入jsp-api.jar包
- request
- session
- application
它们从小到大的顺序分别是: pageContext 、Request、Session 、application
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入jstl标签库--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1 align="center">用户页面</h1>
<table align="center" border="1px">
<td>用户id</td>
<td>用户姓名</td>
<td>用户密码</td>
<c:forEach items="${users}" var="user">
<tr>
<td>${user.id}</td>
<td>${user.username}</td>
<td>${user.password}</td>
</c:forEach>
</table>
2.6.2 域对象的取值范围
- pagecontext;只能在当前页面才继续取到到该域中的值
- request :一次请求范围内(只要地址不发生变化,对应的位就可以取到)
- session;会话对象,取值范围是浏览器的开启到关闭(只要浏览器不关闭,该域中的值一直可以取到)
- appLicotion:本质就是ServLetContext,取值范围是整个web 工程(只要tomcat服务器不关闭,该值就一直以取到)
2.7 el表达式
el表达式:${域中的key}
el表达式可以替换表达式取值脚本<%=取值%> 取到域中的数据。<br /> el表达式还支持很多逻辑运算,判空处理。
```css <%@ page import=”java.util.ArrayList” %> <%@ page import=”java.util.HashMap” %> <%@ page contentType=”text/html;charset=UTF-8” language=”java” %> <% ArrayList arrayList = new ArrayList();
arrayList.add(“jack”); arrayList.add(“tom”); arrayList.add(“black”);
//创建map集合 HashMap
hashMap.put(“username”,”root”); hashMap.put(“password”,”123456”); hashMap.put(“age”,”1”);
//将list集合对象和map集合对象存到域中 request.setAttribute(“list”,arrayList); request.setAttribute(“map”,hashMap);
%>
集合中的数据:${list}根据下标索引取到list集合中的数据:${list[0]}
取出map集合中的数据:${map}
取出map集合中的数据:${map.username}
取出map集合中的数据:${map.password}
el表达式中的三目运算符:${map.age == 1 ? ‘男’ : ‘女’}
判断list集合是否为空:${not empty list}
判断list集合是否为空:${empty list}
<a name="fRdce"></a>
##### 2.8 XML
<a name="St79X"></a>
###### 2.8.1 xml文件的定义
1. 文本标记性语言:具有自我描述性,在不指定约束和名称空间的情况下可以自定义标签,存放数据,当指定了约束和名称空间之后,则只能够使用名称空间提供标签。
1. xml可以当作语言和语言之间交互的桥梁。xml文件在不同的语言之间相通的。
<a name="Y6OTD"></a>
###### 2. 8.2 dom4j具体的步骤:
1、根据一个流对象来读取对应的xml文件,创建一个Document对象<br />2、根据Document对象获取xml中的根标签<br />3、获取根标签中的子标签,读取对应的数据
tomcat底层也是同dom4j来解析数据的。
4. 解析xml文件的案例:
css
<?xml version=”1.0” encoding=”UTF-8”?>
```css
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.ArrayList;
import java.util.List;
public class XmlTest {
public static void main(String[] args) {
//创建流对象
SAXReader saxReader = new SAXReader();
//读取xml配置文件
try {
//文本对象
Document document = saxReader.read("src/xml/student.xml");
//获取根标签对象
Element rootElement = document.getRootElement();
//获取对应的子标签
List<Element> elements = rootElement.elements("student");
//创建学生集合
ArrayList<Student> students = new ArrayList<>();
//遍历自标签,读取标签中的数据
for (Element element : elements) {
//读取标签中的文本
String name = element.elementText("name");
String age = element.elementText("age");
String sex = element.elementText("sex");
String address = element.elementText("address");
//创建学生实例
Student student = new Student(name, Integer.parseInt(age), sex, address);
//添加学生对象到集合中
students.add(student);
}
for (Student student : students) {
System.out.println(student);
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
### 三、案例
案例流程:
1. 建立数据库、表、填入信息。
1. 封装数据库的相关操作:连接数据库,写入静态方法,关闭数据库
1. 创立数据库表对应的对象,封装相应的数据。
1. 完成操作主要内容servlet:
- 重写service方法(在实际开发中更规范的写法是重写doPost与doGet方法);在doGet方法内部调用this.doPost(req,resp):
在doPost方法中完成一下内容
- 处理中文乱码;
- 利用封装的数据库操作对象,完成数据库的连接,获取数据库的内容,创建集合,将获取的数据库数据存入封装对象,将对象存入集合中。
5. 配置xml文件,①注册后端资源,②注册资源路径。
### 四、编辑操作
案例:设计一个学生信息管理系统,可以使得数据库的信息可以显示在前端,通过前端页面可以完成以下工作:
- 可以通过姓名完成模糊查询;
- 可以点击编辑指定学生信息,并完成修改,被修改的数据可以回传到数据库;
- 可以点击删除数据;
案例编写结构:一、建立所需的数据库
二、核心逻辑结构主要文件:
1.使用规范的doGet和doPost方法(可以根据客户端的提交方式来执行不同的方法)
2. 在doPost方法中完成主要业务逻辑: - 设置:防止中文乱码; - 接收一个客户端传递过来的标识 String flag = request.getParameter(“flag”); 注意request.getParameter方法获取从客户端返回的数值。 - 更具不同的flag调用不同的方法。 3. 更具我们需要的方法完成方法的编写: - 方法需要借用JDBC工具类来链接数据库,完成数据的获取(基本格式) - 注意每个方法的数据获取以及数据赋值后转发出去。 ```css <%@ page contentType=”text/html;charset=UTF-8” language=”java” %> <%—引入jstl标签库—%> <%@ taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core“ %>
学生列表页
根据姓名模糊查询:
学生姓名 | 学生性别 | 学生年纪 | 学生生日 | 学生地址 | 操作 |
---|---|---|---|---|---|
${student.name} | ${student.sex == 1? ‘男’ : ‘女’} | ${student.age} | ${student.birthday} | ${student.address} | 删除 <%—循环给每行的编辑按键赋予一个值,当点击该按键时就返回一个id,这个id在请求域中传给后端在进行掉用函数操作—%> <%—href属性是用于资源路径的一个跳转—%> 编辑 |
```css
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入jstl标签库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>学生列表</title>
<style>
body{
background-color: #257676;
}
</style>
</head>
<body>
<h1 align="center">学生编辑页面</h1>
<hr>
<form method="post" action="http://localhost:8080/web/student?flag=toUpdate">
<%--hidden 表示隐藏域的标签,该标签不会在客户端有任何的效果,但是真实存在的标签--%>
<input type="hidden" name="id" value="${student.id}">
<table align="center" border="1px">
<tr>
<td>学生姓名</td>
<td>
<input type="text" name="name" value="${student.name}">
</td>
</tr>
<tr>
<td>学生性别</td>
<td>
<input type="text" name="sex" value="${student.sex == 1 ? '男' : '女'}">
</td>
</tr>
<tr>
<td>学生年纪</td>
<td>
<input type="text" name="age" value="${student.age}">
</td>
</tr>
<tr>
<td>学生生日</td>
<td>
<input type="date" name="birthday" value="${student.birthday}">
</td>
</tr>
<tr>
<td>学生地址</td>
<td>
<input type="text" name="address" value="${student.address}">
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="修改">
</td>
</tr>
</table>
</form>
</body>
</html>
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.JDBCType;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
public class StudentServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//处理中文乱码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//接收一个客户端传递过来的标识
String flag = request.getParameter("flag");
//根据标识来调用不同的方法
if (flag != null && flag.equals("list")){
//查询列表
getStudentList(request,response);
}else if (flag != null && flag.equals("showStudentById")){
showStudentById(request,response);
}else if (flag != null && flag.equals("toUpdate")){
toUpdate(request,response);
}
}
/**
* 修改数据 跟据id去修改
* @param request
* @param response
*/
public void toUpdate(HttpServletRequest request, HttpServletResponse response) {
//接收客户端传递过来的值
String name = request.getParameter("name");
String sex = request.getParameter("sex");
String age = request.getParameter("age");
String birthday = request.getParameter("birthday");
String address = request.getParameter("address");
String id = request.getParameter("id");
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//获取数据库连接对象
connection = JDBCUtils.getConnection();
//获取数据库操作对象并且预编译sql
preparedStatement = connection.prepareStatement
("update ts_student set name = ? , sex = ? , age = ? , birthday = ? ,address = ? where id = ?");
//给占位符赋值
preparedStatement.setString(1,name);
preparedStatement.setInt(2,sex.equals("男") ? 1 : 2);
preparedStatement.setInt(3,Integer.parseInt(age));
preparedStatement.setString(4,birthday);
preparedStatement.setString(5,address);
preparedStatement.setInt(6,Integer.parseInt(id));
//执行sql返回结果集
int num = preparedStatement.executeUpdate();
if (num == 1){
//请求重定向列表页面
response.sendRedirect("http://localhost:8080/web/student?flag=list");
}else {
System.out.println("修改失败");
}
}catch (Exception e){
e.printStackTrace();
}finally {
//资源回收
JDBCUtils.close(connection,preparedStatement,resultSet);
}
}
/**
* 根据id来查询对应的用户数据
* @param request
* @param response
*/
public void showStudentById(HttpServletRequest request, HttpServletResponse response) {
//接收客户端传递的id
String id = request.getParameter("id");
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//获取数据库连接对象
connection = JDBCUtils.getConnection();
//获取数据库操作对象并且预编译sql
preparedStatement = connection.prepareStatement("select * from ts_student where id = ?");
//给占位符赋值
preparedStatement.setInt(1,Integer.parseInt(id));
//执行sql返回结果集
resultSet = preparedStatement.executeQuery();
Student student = null;
if (resultSet != null && resultSet.next()){
//根据数据类型来取出对应的数据
String name = resultSet.getString("name");
int sex = resultSet.getInt("sex");
int age = resultSet.getInt("age");
String birthday = resultSet.getString("birthday");
String address = resultSet.getString("address");
//将数据封装成java对象
student = new Student(Integer.parseInt(id), name, sex, age, birthday, address);
}
//将集合对象添加到域中
request.setAttribute("student",student);
//请求转发
request.getRequestDispatcher("./jsp/update.jsp").forward(request,response);
}catch (Exception e){
e.printStackTrace();
}finally {
//资源回收
JDBCUtils.close(connection,preparedStatement,resultSet);
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
/**
* 实现学生列表
* @param request
* @param response
*/
public void getStudentList(HttpServletRequest request, HttpServletResponse response){
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//获取数据库连接对象
connection = JDBCUtils.getConnection();
//获取数据库操作对象并且预编译sql
preparedStatement = connection.prepareStatement("select * from ts_student");
//执行sql返回结果集
resultSet = preparedStatement.executeQuery();
//创建集合对象
ArrayList<Student> students = new ArrayList<>();
//遍历结果集
while (resultSet != null && resultSet.next()){
//根据数据类型来取出对应的数据
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int sex = resultSet.getInt("sex");
int age = resultSet.getInt("age");
String birthday = resultSet.getString("birthday");
String address = resultSet.getString("address");
//将数据封装成java对象
Student student = new Student(id, name, sex, age, birthday, address);
//将封装好的学生对象添加到集合中
students.add(student);
}
//将集合对象添加到域中
request.setAttribute("students",students);
//请求转发
request.getRequestDispatcher("./jsp/list.jsp").forward(request,response);
}catch (Exception e){
e.printStackTrace();
}finally {
//资源回收
JDBCUtils.close(connection,preparedStatement,resultSet);
}
}
}
五、添加“添加功能”
执行流程:
在主界面,body内选中一个位置,添加一个超链接。
<td colspan="6" align="center">
<a href="http://localhost:8080/web/JSP/add.jsp"> 学生添加</a>
</td>
编写add.jsp:
- 与update相似,主要就是添加超链接调用后端方法;
- 逐个获取各个属性的值。
- 加上一个submit提交数据的按键。 ```css <%@ page contentType=”text/html;charset=UTF-8” language=”java” %>
<%@ taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core“ %>
<style>
body{
background-color: cadetblue;
}
</style>
学生添加页面

3. 测试看前端界面成功部署后,编写后端逻辑。
- 后端逻辑就是添加一个flag的判断;
- 添加一个toAdd方法,向数据库中添加数据。
```css
private void toAdd(HttpServletRequest request, HttpServletResponse response) {
String name = request.getParameter("name");
String sex = request.getParameter("sex");
String age = request.getParameter("age");
String birthday = request.getParameter("birthday");
String address = request.getParameter("address");
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//获取数据库连接对象
connection = JDBCUtils.getconnection();
//获取数据库操作对象并且预编译sql
preparedStatement = connection.prepareStatement
("insert into ts_students(name,sex,age,birthday,address)values (?,?,?,?,?)");
//给占位符赋值
preparedStatement.setString(1, name);
preparedStatement.setInt(2, sex.equals("男") ? 1 : 2);
preparedStatement.setInt(3, Integer.parseInt(age));
preparedStatement.setString(4, birthday);
preparedStatement.setString(5, address);
//执行sql返回结果集
int num = preparedStatement.executeUpdate();
if (num == 1) {
//请求重定向列表页面
response.sendRedirect("http://localhost:8080/web/student?flag=list");
} else {
System.out.println("修改失败");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//资源回收
JDBCUtils.close(connection, preparedStatement, resultSet);
}
}
查看数据库是否添加成功。
六、删除操作
在主界面,body内选中一个位置,添加一个超链接。
<a href="http://localhost:8080/web/student?flag=deleteStudentById&id=${student.id}">删除</a>
测试看前端界面成功部署后,编写后端逻辑。
- 后端逻辑就是添加一个flag的判断;
- 添加一个deleteStudentById方法,从数据库中删除数据。
七、查询操作
在body内添加一个
表单,表单内部添加跳转超链接 <%--不用新封装方法,就直接用getStudentList--%>
<form action="http://localhost:8080/web/student?flag=list" method="post">
根据姓名模糊查询:<input type="text" name="likename" value="${likename}"> <input type="submit" value="搜索">
</form>
修改getStudentList方法,
获取输入的likename
String likename = request.getParameter(“likename”);
根据是否有输入likename进行分类sql;
if(likename != null){
sql = “select from ts_students where name like ?”;
}else{
sql = “select from ts_students”;
}回显操作:通过把likename回传给request请求域
if(likename != null){
request.setAttribute(“likename”,likename);
}
然后在 根据姓名模糊查询:
中添加value=”${likename}”语句回传likename
登陆、注册功能
- 设置登陆页面
创建并编写login.jsp文件作为登陆页面
<form method="post" action = "http://localhost:8080/web/student?flag=login">
<table align = "center">
<tr>
<td> 登陆用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td> 登陆密码:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="login"></td>
</tr>
</table>
</form>
以post的方式提交,跳转到http://localhost:8080/web/student?flag=login页面
- 编写后端逻辑,
- 获取请求传递的username和password做查询判断。
在登陆页面添加注册链接
<%--设置超链接按键,跳转到用户注册的界面。--%>
<a href="http://localhost:8080/web/JSP/reg.jsp">用户注册</a>
创建并编写reg.jsp文件
- 注册页面与登陆页面相似除了跳转页面不同
<form method="post" action = "http://localhost:8080/web/student?flag=toReg">
- 编写后端逻辑创建对应flag标签的if else分支。并编写toReg方法。
- 与登陆方法相似,除了sql语句不同,和重定向到登陆页面。
结果验证