由于使用serlvet生成html标签,代码难以维护,可读性差,容易出错,所以引入jsp,用于生成HTML标签
1. jsp
java server page
用途:主要用来生成html标签
在表现形式上类似于html 但多了一行
<%@ page contentType="text/html;charset=utf-8" %>
上面的代码称为 page 指令,主要作用就是指明此页面是一个jsp页面,并且通过contentType说明他的字符编码和格式
jsp 中有
1). 指令: `<%@ 指令名 %>`
2). 脚本: `<% 可以是任意java代码 %>`
3). 表达式: `<%= 表达式 %>` 把执行结果显示在页面上
<%--
Created by IntelliJ IDEA.
User: Szy
Date: 2018/10/15
Time: 15:54
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%-- 下面是jsp脚本,用于写java代码 --%>
<%
int i = 10;
java.util.Date date = new java.util.Date();
%>
<%-- jsp表达式 --%>
<%= i%>
<br>
<%= date%>
</body>
</html>
运行结果:
2. el表达式语言
expression language 在jsp用来展示结果的语言
语法 ${ 表达式语言 }
要用el表达式显示复杂的内容,需要把内容提前放入`作用域`, el再从`作用域`中把内容取出来显示
pageContext.setAttribute("名称", Object); // 把内容起一个名字放入作用域
使用通过EL表达式 ${pageScope.名称} 进行调用
el表达式可以通过
${对象.属性名} 但这里的属性名,依据是对象的get方法,而不是私有属性名
把get方法中get去掉(或把is方法的is去掉),剩余的单词首字母小写,作为对象的属性名,例如
getName() ==> name
getUsername() ==> username
getHelloWorld() ==> helloWorld
isClose() ==> close
<%--
Created by IntelliJ IDEA.
User: lenovo
Date: 2018/9/9
Time: 16:17
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*,westos.Dept" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!-- ctrl+shift+/ -->
<%--<%
List<Dept> list = new ArrayList<>();
list.add(new Dept(10, "部门1", "北京"));
list.add(new Dept(20, "部门2", "天津"));
list.add(new Dept(30, "部门3", "上海"));
list.add(new Dept(40, "部门4", "西安"));
// 将集合放入作用域
pageContext.setAttribute("list", list);
%>--%>
<!-- 4)利用标签和el表达式显示数据 -->
<table border="1" width="100%">
<tbody>
<c:forEach items="${aaa}" var="d">
<tr>
<td>${d.deptno}</td>
<td>${d.name}</td>
<td>${d.loc}</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
运行结果:
3. JSTL
java 标准标签库
java standard tag library
主要的工具就是配合el表达式,实现循环,条件判断等功能
前提: 加入jstl-1.2的jar包,先将jar包复制在Web中,然后在Project Structure中设置导入,设置如下图
然后点击Atifacts,点击右下角的fix,将其添加
导入标签库
<%@ taglib uri="标签库唯一标识" prefix="前缀" %>
4.控制语句
forEach
<c:forEach items="要遍历的集合" var="临时变量名" begin="起始数字" end="结束数字">
${临时变量名}
</c:forEach>
要遍历的集合 必须使用${} 从作用域获取
if
<c:if test="布尔条件">内容</c:if>
5. MVC 思想
Model 模型 ==> 数据(例如从数据库查询出来的list集合, 里面包含java对象)
View 视图 ==> 数据的展现形式 (jsp就是一种视图技术)
Controller 控制器 ==> 把模型和视图联系起来 (servlet 充当控制器作用)
由servlet器查询数据,把数据放入作用域,跳转至jsp视图
jsp视图从作用域中获取数据,并展示
下面演示用servlet从数据库中读取数据,跳转到jsp页面上显示(Student部分代码略过,含私有属性,有参构造和get/set方法)
还有删除,增添,修改等功能步骤类似,不在赘述
package level1;
import util.Utils;
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 java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
@WebServlet(urlPatterns = "/ServletToJspTest1")
public class ServletToJspTest1 extends HttpServlet {
static { //只需要执行一次,所以放在静态代码块里面
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Connection conn =null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
conn = Utils.getConnection();
stmt = conn.prepareStatement("select * from student");
rs = stmt.executeQuery();
List<Student> list = new ArrayList<>(); //创建一个集合存储Student对象
while(rs.next()) { //将对象添加到list集合中
list.add(new Student(
rs.getInt("sid"),
rs.getString("sname"),
rs.getString("birthday"),
rs.getString("sex")
));
}
//将list集合放入作用域
req.setAttribute("aaa", list);
//跳转请求控制台到jsp页面,让jsp页面完成显示功能
req.getRequestDispatcher("ReceiveReqTest1.jsp").forward(req, resp);
} catch (SQLException e) {
e.printStackTrace();
} finally {
Utils.close(rs, stmt, conn);
}
}
}
<%--
Created by IntelliJ IDEA.
User: Szy
Date: 2018/10/15
Time: 15:54
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%-- 下面是jsp脚本,用于写java代码 --%>
<%
int i = 10;
java.util.Date date = new java.util.Date();
%>
<%-- jsp表达式 --%>
<%= i%>
<br>
<%= date%>
<%-- el表达式 --%>
${10} <br>
${"我是字符串"} <br>
${date} <br>
</body>
</html>
运行结果:注意地址是servlet的地址,而非直接访问jsp页面
> 注意: 服务器常见的错误类型
500 Internal Server Error 服务器内部错误,由于应用程序自己没有正确处理异常,异常抛给了tomcat,这时就会出现500
404 Not Found 资源未找到错误,发生于要访问的资源不存在(资源可能是servlet, jsp, html)
405 Method Not Allowed 方法不支持,
当没有覆盖doGet但发送了get请求时
当没有覆盖doPost但发送了post请求时
200 OK 表示这次请求正常,没有错误
304 这个文件没有修改,请浏览器使用上一次缓存的文件
这些数字称为响应状态码