1、JSP
1、JSP是简化Servlet编写的一种技术,它将Java代码和HTML语句混合在同一个文件中编写,页面的动态资源使用java代码,页面静态资源使用html标签
2、可以在html标签中嵌套java代码
3、JSP本质上是一个Servlet,jsp页面运行时,会先生成一个java文件,必须进行编译,再去执行
jsp脚本:
<%代码%>:脚本片段,生成在service方法中,每次请求的时候都会执行
<%!代码%>:声明片段,在java代码中声明成员,放在jsp生成java文件中的成员位置
<%=代码%>:输出脚本,输出到jsp页面,相当于out.print(“代码”)方法
jsp注释:
html注释: JSP源码可见 java源码可见 html源码可见
JSP注释:<%—注释所有—%> JSP源码可见 java源码可见 html源码不可见
java注释:JSP脚本内使用 JSP源码可见 java源码不可见 html源码不可见
jsp指令:
page指令:
errorPage
当前页面报错后,跳转指定错误提示页面
isErrorPage
声明当前jsp页面是一个异常处理页面,打开异常开关
`false`:(默认)
`true`:可以操作exception异常对象
include指令:
<%@include file="xxx.jsp"%>
页面包含的,导入页面的资源文件
也就是在一个页面中指定区域显示另一个页面的内容
taglib指令:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
导入资源,prefix为自定义前缀
jsp内置对象:
在JSP页面中不需要获取和创建,可以直接使用的对象
pageContext对象:当前页面中共享数据(域对象)
当前页面的域对象,可回去其他八个内置对象
request对象:一次请求中共享数据(域对象)
接收用户请求(参数)和获取一次请求中的域对象
session对象:一次会话中共享数据(域对象)
application对象:整个web应用共享数据(域对象)
response对象:响应对象
设置响应:字节流和字符流
page(this)对象:当前页面(servlet)对象
out:输出对象
专门在jsp处理字符流,print可输出一切类型,write只能输出字符类型
config:servlet配置对象
exception:异常对象(默认关闭)
MVC模式:
M:model(模型)JavaBean,处理业务逻辑,封装实体
V:view(视图)Jsp,展示数据
C:controller(控制器),Servlet,接收请求,调用模型,转发视图
1. 早期只有servlet,只能使用response输出标签数据,非常麻烦
servlet+javaBean
2. 后来又jsp,简化了Servlet的开发,如果过度使用jsp,在jsp中即写大量的java代码,有写html的,造成难于维护,难于分工协作
servlet + jsp + javaBean
3. 再后来,java的web开发,借鉴mvc开发模式(C/S),使得程序的设计更加合理性
优点:
1、降低耦合性,方便维护和拓展,利于分工协作
2、可重用高
缺点:
使项目架构变得复杂
2、EL表达式
${表达式}
主要是从域对象中查找指定的数据
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="404.jsp" %>
<html>
<head>
<title>index</title>
<style type="text/css"> </style>
</head>
<body>
<h1>从域中获取数据:</h1>
<h3>获取字符串:</h3>
str:${str} <br />
<h3>获取数组:</h3>
数组值1:${strs[0]} <br />
数组值2:${strs[1]} <br />
数组值3:${strs[2]} <br />
<h3>获取对象:</h3>
${user} <br />
对象名:${user.name} <br />
年龄:${user.age} <br />
<h3>获取list集合:</h3>
list集合值1:${list[0]} <br />
list集合值2:${list[1]} <br />
list集合值3:${list[2]} <br />
<h3>获取map集合:</h3>
map集合kye值1:${map.mapKey1} <br />
map集合kye值2:${map.mapKey2} <br />
map集合kye值3:${map.mapKey3} <br />
<script type="text/javascript"> </script>
</body>
</html>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package com.yunhe.servlet;
import com.yunhe.domain.User;
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.lang.reflect.Array;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@WebServlet("/useELServlet")
public class UseELServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");// 处理post请求乱码问题
response.setContentType("text/html;charset=UTF-8"); // 响应参数乱码解决方法
//存字符串到域中
request.setAttribute("str","字符串");
//存数组到域中
String[] strs = {"数组值1","数组值2","数组值3",};
request.setAttribute("strs",strs);
//存对象到域中
User user = new User("张三",13);
request.setAttribute("user",user);
//存list集合到域中
List list = new ArrayList();
list.add("list集合值1");
list.add("list集合值2");
list.add("list集合值3");
request.setAttribute("list",list);
//存map集合到域中
Map<String,Integer> map = new HashMap();
map.put("mapKey1",1);
map.put("mapKey2",2);
map.put("mapKey3",3);
request.setAttribute("map",map);
//转发到jsp页面
request.getRequestDispatcher("/index.jsp").forward(request,response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
EL运算符:
空运算符:empty
用于判断字符串,集合,数组对象是否为null或者长度是否为0
<%--
相当于 if(user != null)
--%>
返回boolean类型,可用于判断用户是否登录
user对象: ${not empty user} <br> 用户名不为空:提示欢迎语句
user对象: ${empty user} <br> 用户名为空:提示登录登录
EL隐式对象:
el表达式中有11个隐式对象
pageContext可以获取其他八个隐式对象
常用的EL隐式对象:
${pageContext.request.contextPath}
表示项目名
${cookie.JSESSIONID.value}
获取Cookie的值
JavaBean:
1、所有的字段(成员变量)为private修饰
2、提供无参构造
3、提供get,set方法
4、实现Serializable接口(可序列化)
3、JSTL
1、导包
2、引入标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
JSTL常用标签库:
if语句:
属性test --》必须属性,接收boolean表达式
和空运算符配合使用,判断用户是否登录
<c:if test= "${empty user}">您好,请登录</c:if> 若为真,显示标签内内容
foreach语句:
属性begin --》开始值
end ==》结束值
var ==》临时变量
step ==》步长
<c:forEach begin="1" end="10" step="1" var="i">
${i}: helloword <br>
</c:forEach>
增强foreach语句:
items ==》要遍历的对象
var ==》临时变量
varStatus ==》循环状态对象,index容器中元素的索引,从零开始,count循环次数,从1开始
<c:forEach items="${list}" var="user" varStatus="v">
索引值:index: ${v.index}
循环次数:count:${v.count}
用户名:${user.username},年龄:${user.age},密码:${user.password}<br>
</c:forEach>
choose语句:
choose标签:相当于switch声明
when标签:相当于case+break
otherwise标签:相当于default
<c:choose>
<c:when test="${money == 7000}">
单身狗........
</c:when>
<c:when test="${money == 8000}">
屌丝........
</c:when>
<c:when test="${money == 15000}">
可以撩小妹妹........
</c:when>
<c:when test="${money >= 30000}">
来三个........
</c:when>
<c:otherwise>
想发家致富吗? 来找我,这不是梦想....
</c:otherwise>
</c:choose>
4、三层架构
表现层:
业务逻辑层:
数据访问层:
5、小Demo
前端源码:
<%--Date: 2021/6/16 Time: 16:49--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>index</title>
<link rel="stylesheet" href="css/mylayui.css">
<%--引入layui的核心css--%>
<link rel="stylesheet" href="layui/css/layui.css">
<style type="text/css">
td, th {
text-align: center;
}
div{
width: 80%;
}
</style>
</head>
<body>
<div align="center">
<a
href="/userServlet" style="text-decoration:none;font-size:33px;color: #1E9FFF">查询所有用户信息
</a>
</div>
<div class="layui-fluid">
<table class="layui-table" lay-size="sm" lay-even >
<tr>
<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="v">
<tr>
<td>${v.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="layui-btn layui-btn-sm" href="">修改</a> <a class="layui-btn layui-btn-sm layui-btn-danger" href="">删除</a></td>
</tr>
</c:forEach>
<tr>
<td colspan="8" align="center"><a class="layui-btn layui-btn-normal" href="add.html">添加联系人</a></td>
</tr>
</table>
</div>
<%--嵌入一个页面到当前页面--%>
<%@include file="/time.jsp"%>
<%--引入layUI的核心js--%>
<script src="layui/layui.js"></script>
<script type="text/javascript">
</script>
</body>
</html>
UserServlet源码:
package com.yunhe.demo.web;
import com.yunhe.demo.daomain.User;
import com.yunhe.demo.service.UserService;
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("/userServlet")
public class UserServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");// 处理post请求乱码问题
response.setContentType("text/html;charset=UTF-8"); // 响应参数乱码解决方法
UserService userService = new UserService();
//获取用户信息
List<User> listUsers = userService.findUsers();
request.setAttribute("users",listUsers);
request.getRequestDispatcher("/userlist.jsp").forward(request,response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
UserService源码:
package com.yunhe.demo.service;
import com.yunhe.demo.dao.UserDao;
import com.yunhe.demo.daomain.User;
import java.util.List;
public class UserService {
UserDao userDao = new UserDao();
//获取所有的用户信息
public List<User> findUsers() {
return userDao.findUsers();
}
}
UserDao源码:
package com.yunhe.demo.dao;
import com.yunhe.demo.daomain.User;
import com.yunhe.demo.utils.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
public class UserDao {
private static JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
public List<User> findUsers() {
String sql = "SELECT * FROM USER";
try {
List<User> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
return query;
}catch (NullPointerException e){
return null;
}
}
}
User源码:
public class User {
private int id;
private String name;
private String gender;
private int age;
private String address;
private String qq;
private String email;
//省略get,set,有参,无参,toString方法
}