JSP
指令
作用
用于配置JSP页面信息,导入资源文件
格式
<%@ 指令名称 属性名1=属性值1 属性值2=属性值2…. %>
1
| <%@ page contentType="text/html;charset=utf-8" language="java" %>
|
分类
page(配置JSP页面的)
- contentType:等同于response.setContentType()
- 设置响应体的mime类型以及字符集
- 设置当前jsp页面的编码(只能是高级的IDE才能生效,如果使用低级工具,则需要设置pageEncoding属性设置当前页面的字符集)
- import:导包
- errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
- isErrorPage:标识当前页面是否是错误页面
- true:是,可以使用内置对象exception
- false:否,默认值。不可以使用内置对象exception
include:页面包含的。导入页面的资源文件
1
| <%@include file="top.jsp"%>
|
taglib:导入资源
1
| <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
注释
html注释
JSP注释(推荐使用)
内置对象
在jsp页面中不需要创建,直接使用的对象
一共有九个:
| 变量名 | 真实类型 | 作用 |
|---|
| pageContext | PageContext | 当前页面共享数据,还可以获取其他八个内置对象 |
| request | HttpServletRequest | 一次请求访问的多个资源(转发) |
| session | HttpSession | 一次会话的多个请求间的共享数据 |
| application | ServletContext | 所有用户间共享数据 |
| response | HttpServletResponse | 响应对象 |
| page | Object | 当前页面(Servlet)对象 ,类似this的意思 |
| out | JspWriter | 输出对象,数据输出到页面上 |
| config | ServletConfig | Servlet的配置对象 |
| exception | Throwable | 异常对象 |
MVC开发模式
JSP演变史
- 早期只有servlet,只能使用response输出标签数据,非常麻烦
- 后来有了jsp,简化了Servlet的开发,如果过度使用jsp,比如在jsp中写了大量的java代码,又写了html标签,造成难于维护,难于分工协作。
- 再后来,java的web开发,借鉴mvc开发模式,使得程序的设计更加合理性
MVC
- M:Model,模型
- V:View,视图
- C:Controller,控制器

优缺点
- 优点
- 缺点
EL表达式
概念
Expression Language:表达式语言
作用
替换和简化jsp页面中java代码的编写
语法
${表达式}
注意
jsp默认支持el表达式的,如果要忽略el表达式有下面的几种方式
- 设置jsp中page指令中,isELIgnore=”true”,忽略当前jsp页面中所用的el表达式
- \ ${表达式}:忽略当前这个el表达式
使用
运算
运算符
- 算术运算符(+,-,*,/(div), %(mod))
- 比较运算符(>,<,>=,<=,==,!=)
- 逻辑运算符(&&(and),||(or),!(not))
- 空运算符(empty)
- 功能:用于判断字符串、集合、数组对象是否为null并且长度是否为0
- ${empty list}
- ${not empty str}:表示判断字符串,集合,数组对象是否不为null,并且长度>0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| <%@ page import="java.util.List" %> <%@ page import="java.util.ArrayList" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body>
${3 > 4}
\${3 > 4} <hr>
<h3>算数运算符</h3> ${3 + 4}<br> ${3 / 4}<br> ${3 div 4}<br> ${3 % 4}<br> ${3 mod 4}<br> <h3>比较运算符</h3> ${3 == 4}<br>
<h3>逻辑运算符</h3> ${3 > 4 && 3 < 4}<br> ${3 > 4 and 3 < 4}<br>
<h4>empty运算符</h4> <%
String str = ""; request.setAttribute("str",str);
List list = new ArrayList(); request.setAttribute("list",list);
%> ${not empty str}
${not empty list} </body> </html>
|
获取值
el表达式只能从域对象中获取值
语法
- ${域名称.键名}:从指定域中获取指定键的值
- ${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。
域名称
- pageScope–>pageContext
- requestScope–> request
- sessionScope–>session
- applicationScope–>application(ServletContext)
举例:在request域中存储了name=张三
获取:${requestScope.name}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| <%@ page import="java.util.List" %> <%@ page import="java.util.ArrayList" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>el获取域中的数据</title> </head> <body>
<% session.setAttribute("name","李四");
request.setAttribute("name","张三"); session.setAttribute("age","23");
request.setAttribute("str","");
%>
<h3>el获取值</h3> ${requestScope.name} ${sessionScope.age} ${sessionScope.haha}
${name} ${sessionScope.name}
</body> </html>
|
获取对象、List集合、Map集合的值
对象:${域名称.键名.属性名}
本质上会去调用对象的getter方法
List集合:${域名称.键名[索引]}
Map集合
- ${域名称.键名.key名称}
- ${域名称.键名[“key名称”]}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| <%@ page import="cn.itcast.domain.User" %> <%@ page import="java.util.*" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>el获取数据</title> </head> <body>
<% User user = new User(); user.setName("张三"); user.setAge(23); user.setBirthday(new Date());
request.setAttribute("u",user);
List list = new ArrayList(); list.add("aaa"); list.add("bbb"); list.add(user);
request.setAttribute("list",list);
Map map = new HashMap(); map.put("sname","李四"); map.put("gender","男"); map.put("user",user);
request.setAttribute("map",map);
%>
<h3>el获取对象中的值</h3> ${requestScope.u}<br>
<%-- * 通过的是对象的属性来获取 * setter或getter方法,去掉set或get,在将剩余部分,首字母变为小写。 * setName --> Name --> name --%>
${requestScope.u.name}<br> ${u.age}<br> ${u.birthday}<br> ${u.birthday.month}<br>
${u.birStr}<br>
<h3>el获取List值</h3> ${list}<br> ${list[0]}<br> ${list[1]}<br> ${list[10]}<br>
${list[2].name}
<h3>el获取Map值</h3> ${map.gender}<br> ${map["gender"]}<br> ${map.user.name}
</body> </html>
|
隐式对象
- el表达式中有11个隐式对象
- pageContext
- 获取jsp其他八个内置对象
${pageContext.request.contextPath}:动态获取虚拟目录,可以在表单的action中动态获取虚拟目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>el隐式对象</title> </head> <body>
${pageContext.request}<br> <h4>在jsp页面动态获取虚拟目录</h4> ${pageContext.request.contextPath}
<%
%> </body> </html>
|
JSTL标签
概念
JavaServer Pages Tag Library JSP标准标签库
是由Apache组织提供的开源的免费的jsp标签
作用
用于简化和替换jsp页面上的java代码
使用步骤
导入jstl相关jar包
引入标签库:taglib指令
使用标签
常用的JSTL标签
if
相当于java代码的if语句
- 属性
- test:必须数据,接收boolean表达式
- 如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
- 一般情况下,test属性值会结合el表达式一起使用
- 注意
- c:if标签没有else情况,想要else情况,则可以再定义一个c:if标签
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| <%@ page import="java.util.List" %> <%@ page import="java.util.ArrayList" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html> <head> <title>if标签</title> </head> <body>
<c:if test="true"> <h1>我是真...</h1> </c:if> <br>
<%
List list = new ArrayList(); list.add("aaaa"); request.setAttribute("list",list);
request.setAttribute("number",4);
%>
<c:if test="${not empty list}"> 遍历集合...
</c:if> <br>
<c:if test="${number % 2 != 0}">
${number}为奇数
</c:if>
<c:if test="${number % 2 == 0}">
${number}为偶数
</c:if>
</body> </html>
|
choose
相当于java代码的switch语句
- 使用choose标签声明,相当于switch声明
- 使用when标签做判断,相当于case
- 使用otherwise标签做其他情况的声明,相当于default
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html> <head> <title>choose标签</title> </head> <body>
<%-- 完成数字编号对应星期几案例 1.域中存储一数字 2.使用choose标签取出数字 相当于switch声明 3.使用when标签做数字判断 相当于case 4.otherwise标签做其他情况的声明 相当于default --%>
<% request.setAttribute("number",51); %>
<c:choose> <c:when test="${number == 1}">星期一</c:when> <c:when test="${number == 2}">星期二</c:when> <c:when test="${number == 3}">星期三</c:when> <c:when test="${number == 4}">星期四</c:when> <c:when test="${number == 5}">星期五</c:when> <c:when test="${number == 6}">星期六</c:when> <c:when test="${number == 7}">星期天</c:when>
<c:otherwise>数字输入有误</c:otherwise> </c:choose>
</body> </html>
|
foreach
相当于java代码的for语句
完成重复的操作
1
| for(int i = 0; i < 10; i ++){}
|
属性:
- begin:开始值
- end:结束值
- var:临时变量
- step:步长(临时变量每次增长几,如果是1,相当于每次增长1,如果是2,表示每次增长2)
- varStatus:循环状态对象
- index:容器中元素的索引,从0开始
- count:循环次数,从1开始
遍历容器
1 2
| List<User> list; for(User user : list){}
|
属性:
- items:容器对象
- var:容器中元素的临时变量
- varStatus:循环状态对象
- index:容器中元素的索引,从0开始
- count:循环次数,从1开始
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| <%@ page import="java.util.ArrayList" %> <%@ page import="java.util.List" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html> <head> <title>foreach标签</title> </head> <body>
<c:forEach begin="1" end="10" var="i" step="2" varStatus="s"> ${i} <h3>${s.index}<h3> <h4> ${s.count} </h4><br>
</c:forEach>
<hr> <% List list = new ArrayList(); list.add("aaa"); list.add("bbb"); list.add("ccc") request.setAttribute("list",list);
%>
<c:forEach items="${list}" var="str" varStatus="s">
${s.index} ${s.count} ${str}<br>
</c:forEach>
</body> </html>
|
案例
需求:在request域中有一个存有User对象的List集合。需要使用jstl+el将list集合数据展示到jsp页面的表格table中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| <%@ page import="cn.itcast.domain.User" %> <%@ page import="java.util.List" %> <%@ page import="java.util.ArrayList" %> <%@ page import="java.util.Date" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html> <head> <title>test</title> </head> <body>
<% List list = new ArrayList(); list.add(new User("张三",23,new Date())); list.add(new User("李四",24,new Date())); list.add(new User("王五",25,new Date())); request.setAttribute("list",list); %>
<table border="1" width="500" align="center"> <tr> <th>编号</th> <th>姓名</th> <th>年龄</th> <th>生日</th> </tr> <%--数据行--%> <c:forEach items="${list}" var="user" varStatus="s">
<c:if test="${s.count % 2 != 0}"> <tr bgcolor="red"> <td>${s.count}</td> <td>${user.name}</td> <td>${user.age}</td> <td>${user.birStr}</td> </tr> </c:if>
<c:if test="${s.count % 2 == 0}"> <tr bgcolor="green"> <td>${s.count}</td> <td>${user.name}</td> <td>${user.age}</td> <td>${user.birStr}</td> </tr> </c:if> </c:forEach>
</table> </body> </html>
|
三层架构
软件设计架构
界面层(表示层)
用户看的界面。用户可以通过界面上的组件和服务器进行交互
业务逻辑层
处理业务逻辑的
数据访问层
操作数据存储文件

案例
用户信息列表展示
需求:用户信息的增删改查操作
设计:
- 技术选型:Servlet+JSP+MySQL+JDBCTempleat+Duird+BeanUtilS+tomcat
- 数据库设计:
create database day17; – 创建数据库
use day17; – 使用数据库
create table user( – 创建表
id int primary key auto_increment,
name varchar(20) not null,
gender varchar(5),
age int,
address varchar(32),
qq varchar(20),
email varchar(50)
);
开发:
- 环境搭建
- 创建数据库环境
- 创建项目,导入需要的jar包
- 编码
分析:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
import cn.itcast.domain.User; import java.util.List;
public interface UserDao { public List<User> findAll(); }
import cn.itcast.dao.UserDao; import cn.itcast.domain.User; import cn.itcast.util.JDBCUtils; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
public class UserDaoImpl implements UserDao {
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
@Override public List<User> findAll() { String sql = "select * from user"; List<User> users = template.query(sql, new BeanPropertyRowMapper<User>(User.class));
return users; } }
import cn.itcast.domain.User; import java.util.List;
public interface UserService {
public List<User> findAll(); }
import cn.itcast.dao.UserDao; import cn.itcast.dao.impl.UserDaoImpl; import cn.itcast.domain.User; import cn.itcast.service.UserService;
import java.util.List;
public class UserServiceImpl implements UserService { private UserDao dao = new UserDaoImpl();
@Override public List<User> findAll() { return dao.findAll(); } }
import cn.itcast.domain.User; import cn.itcast.service.UserService; import cn.itcast.service.impl.UserServiceImpl;
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.util.List;
@WebServlet("/userListServlet") public class UserListServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { UserService service = new UserServiceImpl(); List<User> users = service.findAll(); request.setAttribute("users",users); request.getRequestDispatcher("/list.jsp").forward(request,response); }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <%@ page contentType="text/html;charset=UTF-8" language="java" %> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"/> <meta http-equiv="X-UA-Compatible" content="IE=edge"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>首页</title>
<!-- 1. 导入CSS的全局样式 --> <link href="css/bootstrap.min.css" rel="stylesheet"> <!-- 2. jQuery导入,建议使用1.9以上的版本 --> <script src="js/jquery-2.1.0.min.js"></script> <!-- 3. 导入bootstrap的js文件 --> <script src="js/bootstrap.min.js"></script> <script type="text/javascript"> </script> </head> <body> <div align="center"> <a href="${pageContext.request.contextPath}/userListServlet" style="text-decoration:none;font-size:33px">查询所有用户信息 </a> </div> </body> </html>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html> <!-- 网页使用的语言 --> <html lang="zh-CN"> <head> <!-- 指定字符集 --> <meta charset="utf-8"> <!-- 使用Edge最新的浏览器的渲染方式 --> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。 width: 默认宽度与设备的宽度相同 initial-scale: 初始的缩放比,为1:1 --> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --> <title>用户信息管理系统</title>
<!-- 1. 导入CSS的全局样式 --> <link href="css/bootstrap.min.css" rel="stylesheet"> <!-- 2. jQuery导入,建议使用1.9以上的版本 --> <script src="js/jquery-2.1.0.min.js"></script> <!-- 3. 导入bootstrap的js文件 --> <script src="js/bootstrap.min.js"></script> <style type="text/css"> td, th { text-align: center; } </style> </head> <body> <div class="container"> <h3 style="text-align: center">用户信息列表</h3> <table border="1" class="table table-bordered table-hover"> <tr class="success"> <th>编号</th> <th>姓名</th> <th>性别</th> <th>年龄</th> <th>籍贯</th> <th>QQ</th> <th>邮箱</th> <th>操作</th> </tr>
<c:forEach items="${users}" var="user" varStatus="s"> <tr> <td>${s.count}</td> <td>${user.name}</td> <td>${user.gender}</td> <td>${user.age}</td> <td>${user.address}</td> <td>${user.qq}</td> <td>${user.email}</td> <td><a class="btn btn-default btn-sm" href="update.html">修改</a> <a class="btn btn-default btn-sm" href="">删除</a></td> </tr>
</c:forEach>
<tr> <td colspan="8" align="center"><a class="btn btn-primary" href="add.html">添加联系人</a></td> </tr> </table> </div> </body> </html>
|