目录
JSP
JSP全名是Java Server Pages,它是建立在Servlet规范之上的动态网页开发技术。
显隐注释
<%-- 你好 --%>
<!-- 不好 -->
在JSP中写java程序
<%
//定义局部变量
String str = "Hello";
String str1 = "Hello11";
System.out.println(str);
out.print(str);
out.print(num);
%>
<%!
//声明全局变量
int num = 10;
%>
<%-- 输出表达式、变量或字面量 --%>
<%=str1 %>
JSP的指令标签
include静态包含
特点:
- 最终只会生成一个源码文件,所以变量各个包含页面内的变量不能重名。
格式:
<%@include file="header.jsp"%>
<h2>主体内容</h2>
动态包含
特点:
- 相当于方法的调用,最后生成多个源码文件,所以可以定义同名变量
- 当动态包含不需要传递参数时,include双标签之间不要有任何内容。
格式:
<jsp:include page="header.jsp">
<h2>主体内容</h2>
- 传递参数
<jsp:include page="header.jsp"></jsp:include>
<h2>主体内容</h2>
<%
String str = "hello";
%>
<jsp:include page="header.jsp">
<jsp:param value="admin" name="uname"/>
<jsp:param value="<%=str%>" name="msg"/>
</jsp:include>
<h1>这是头部</h1>
<%
String uname = request.getParameter("uname");
String msg = request.getParameter("uname");
out.print(uname+ ", "+msg );
%>
JSP中的四大域对象
其中一个页面设置域对象
<%
pageContext.setAttribute("name1", "zhangsan");
request.setAttribute("name2", "lisi");
session.setAttribute("name3", "王五");
application.setAttribute("name4", "zhaoliu");
%>
<%-- <jsp:forward page="header.jsp"></jsp:forward> --%>
<a href="header.jsp">跳转</a>
如果使用<jsp:forward page=“header.jsp”></jsp:forward>这种形式是直接显示的效果
但如果是要点击页面跳转的化,要使用a标签,这样request对象就不起作用了,session对象是可以使用的。
实例: 用户登录界面
<%
out.print("page范围:" + pageContext.getAttribute("name1")+"<br/>");
out.print("request范围:" + request.getAttribute("name2")+"<br/>");
out.print("session范围:" + session.getAttribute("name3")+"<br/>");
out.print("application范围:" + application.getAttribute("name4")+"<br/>");
%>
简易版用户登录
<form action="loginbasicSer" method="post">
姓名:<input type="text" name="uname"><br>
密码:<input type="password" name="upwd"><br>
<button>登录</button><span style="color: red; font-size: 12px"><%=request.getAttribute("meg") %></span>
<!-- <button>登录</button><span style="color: red; font-size: 12px">${meg}</span> -->
</form>
</form>
package servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/loginbasicSer")
public class lbasicSer extends HttpServlet{
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setHeader("content-type", "text/html;charset=utf-8");
String uname = request.getParameter("uname");
String upwd = request.getParameter("upwd");
//uname.trim()确保输入的字符串不为空或不只是空白字符
if ( uname == null || "".equals(uname.trim())) {
request.setAttribute("meg", "用户姓名不能为空");
request.getRequestDispatcher("loginbasic.jsp").forward(request, response);
return;
}
//判断账号密码是否正确 uname=admin upwd=admin
if ( !"admin".equals(uname) || !"admin".equals(upwd)) {
request.setAttribute("meg", "登录错误。");
request.getRequestDispatcher("loginbasic.jsp").forward(request, response);
return;
}
// 登录成功
// 设置登录信息到session作用域
request.getSession().setAttribute("uname", uname);
response.sendRedirect("ind.jsp");
}
}
EL表达式
默认重小到大,找到即可;当域对象找完了还未找到返回空字符串“”
<%
pageContext.setAttribute("name1", "zhangsan");
request.setAttribute("name", "lisi");
session.setAttribute("name", "王五");
application.setAttribute("name", "zhaoliu");
%>
获取域对象: ${name}<br/>
获取指定范围的域对象:${applicationScope.name}
- 获取List
<%
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("list", list);
%>
<h4>获取List</h4>
获取List的size: ${list.size()}<br/>
获取List的指定下标的值:${list[1]}
<%
Map map = new HashMap();
map.put("aaa", "111");
map.put("bbb", "222");
map.put("ccc", "333");
map.put("ddd", "444");
request.setAttribute("map", map);
%>
<h4>获取map</h4>
获取map的size: ${map.size()}<br/>
获取map的指定下标的值:${map['aaa']}
- 获取JavaBean对象
JavaBean中的属性字段必须要提供Get和set方法
JavaBean对象
<%
User user = new User();
user.setUserId(1);
user.setUname("钟子扬");
user.setUpwd("123456");
request.setAttribute("user", user);
%>
获取javaBean对象<br/>
获取javaBean中的属性:${user.uname} --- ${user.getUserId()}
package entity;
public class User {
private int userId;
private String uname;
private String upwd;
public int getUserId() {
return userId;
}
public String getUname() {
return uname;
}
public String getUpwd() {
return upwd;
}
public User(int userId, String uname, String upwd) {
super();
this.userId = userId;
this.uname = uname;
this.upwd = upwd;
}
public void setUserId(int userId) {
this.userId = userId;
}
public void setUname(String uname) {
this.uname = uname;
}
public void setUpwd(String upwd) {
this.upwd = upwd;
}
public User() {
super();
}
}
- empty 判断是否为空
如果域对象不存在,空字串串或者null的 会返回true
<%
request.setAttribute("str1", "aaa");
request.setAttribute("str2", "");
request.setAttribute("str3", null);
%>
<div>判断字符串是否存在</div>
${empty str}<br />
${empty str1}<br />
${empty str2}<br />
${empty str3}<br />
- 判断数组是否存在
null或者没有长度都会返回true
<%
List list1 = new ArrayList<>();
List list2 = null;
List list3 = new ArrayList<>();
list3.add(1);
request.setAttribute("list1", list1);
request.setAttribute("list2", list2);
request.setAttribute("list3", list3);
%>
<hr />
<div>判断List是否存在</div>
${empty list1}<br />
${empty list2}<br />
${empty list3}<br />
- 判断JavaBean类型的对象是否存在
只有为null时是空的,一经创建就不为空
<%
User user1 = new User();
User user2 = null;
User user3 = new User();
user3.setUname("钟子扬");
request.setAttribute("user1", user1);
request.setAttribute("user2", user2);
request.setAttribute("user3", user3);
%>
<hr />
<div>判断user是否存在</div>
${empty user1}<br />
${empty user2}<br />
${empty user3}<br />
注意: 判断域对象不为空
${!empty user1}
- 等值判断
<%
request.setAttribute("a", 10);
request.setAttribute("b", 2);
request.setAttribute("c", "aa");
request.setAttribute("d", "dd");
%>
${ a==b}
${ c eq "bb"}
${ d =="dd" }
${ a+b }
${b/a } 等价于 ${b div a }
${ a+b >10 || a-b <5 }
JSTL
Java Server Pages Standard Tag Library(JSTL):JSP标准标签库,是一个定制标签类库的集合,用于解决一些常见的问题。例如迭代一个映射或者集合、条件测试、XML处理,甚至数据库和访问数据库操作等。
- 核心标签库( c )
包括循环、表达式赋值、基本输入输出等 - 格式化标签库( fmt )
格式化显示数据。对不同区域的日期格式化
需要先下载两个jar包(1.1.2版本的就行)
然后将jar拷贝到lib文件夹下
在jsp页面输入
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
接下来操作的所有标签都是域对象标签,都是对域对象标签进行操作的。
条件动作标签
if标签
- test:做条件判断,操作的是域对象
<%
request.setAttribute("num", 10);
%>
<c:if test="${num > 0}" var="flag" scope="request">
<h3>数值大于0</h3>
</c:if>
${requestScope.flag}
choose\when\otherwise标签
- 替代else的标签
choose when替代case
otherwise替代default - choose 和otherwise标签没有属性, when标签只有一个属性
- when标签和otherwith标签可以嵌套其他标签
<%
request.setAttribute("score", 80);
%>
<c:choose>
<c:when test="${score > 60 && score < 80}">
<h4>你好牛</h4>
</c:when>
<c:when test="${score == 60 }">
<h4>刚及格</h4>
</c:when>
<c:when test="${score < 60 }">
<h4>小渣渣</h4>
</c:when>
<c:otherwise>
<h2>厉害的嘞</h2>
</c:otherwise>
</c:choose>
迭代标签
- 首先,我一定要说,我们需要将和核心标签库的地址改成
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
好,现在开始说jstl中的foreach
- 第一种:简单的通过移动步长来输出数字
需要有var begin end step - 第二种:简单的遍历一个string类型的list
需要有items(存储的是域变量) 和 var(循环的临时变量) - 第三种:循环javaBean中的对象(后期配合数据库使用)
- 例如本例,先创建一个User的类
- 在jsp页面编写java代码,通过request设置域对象
- 使用JSTL和EL表达式进行判断输出到页面
<%@page import="entity.User"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ 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>
<c:forEach var="i" begin="1" end="10" step="2">
${i}
</c:forEach>
<%
List<String> list = new ArrayList<>();
for ( int i = 1; i <= 10; i++) {
list.add("A:"+i);
}
pageContext.setAttribute("li", list);
%>
<c:forEach items="${li}" var="item">
${item}
</c:forEach>
<hr/>
<%
List<User> userList = new ArrayList<>();
User user1 = new User(1, "张三", "123");
User user2 = new User(2, "李四", "345");
User user3 = new User(3, "王五", "567");
userList.add(user1);
userList.add(user2);
userList.add(user3);
request.setAttribute("uLi", userList);
%>
<c:if test="${!empty li }">
<table align="center" width="800" border="1" style="border-collapse: collapse">
<tr>
<th>用户编号</th>
<th>用户名称</th>
<th>用户密码</th>
<th>用户操作</th>
</tr>
<c:forEach items="${uLi}" var="user">
<tr align=center>
<td>${user.userId}</td>
<td>${user.uname}</td>
<td>${user.upwd}</td>
<td><button>操作</button></td>
</tr>
</c:forEach>
</table>
</c:if>
</body>
</html>
格式化动作标签
<%
request.setAttribute("mydate", new Date());
%>
<fmt:formatDate value="${mydate }" type="date"/><br>
<fmt:formatDate value="${mydate }" type="time"/><br>
<fmt:formatDate value="${mydate }" type="both"/><br>
<fmt:formatDate value="${mydate }" type="both" dateStyle="FULL"/><br>
<fmt:formatDate value="${mydate }" type="both" pattern="yyyy-MM-dd hh:mm:ss"/><br>
用户登录实例
查看是否安装了mysql
win+R 输入 services.msc 看服务
用户登录界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
<div style="text-align: center">
<form action="/login" method="post" id="loginForm">
姓名:<input type="text" name="uname" id="uname"><br>
密码:<input type="password" name="upwd" id="upwd"><br>
<button type="button" id="loginid">登录</button><button>注册</button><br>
<span id="msg" style="font-size:12; color: red"></span>
</form>
</div>
<script type="text/javascript" src="js/jquery-3.7.1.js"></script>
<script type="text/javascript">
/*
登录表单验证
1.给登录按钮绑定点击事件(id)
2.获取用户姓名和密码的值
3.判断姓名是否为空
如果为空,提示用户(span标签赋值),并且return
4.判断密码是否为空
如果为空,提示用户,并且return
5.如果都不为空,则手动提交表单
*/
$("#loginid").click(function(){
var uname = $("#uname").val();
var upwd = $("#upwd").val();
//判断姓名是否为空
if( isEmpty(uname)){
$("#msg").html("用户姓名不可为空。");
return;
}
//判断密码是否为空
if( isEmpty(upwd)){
$("#msg").html("用户密码不可为空。");
return;
}
//如果都不为空,则手动提交表单
$("#loginForm").submit();
});
function isEmpty(str) {
if ( str == null || str.trim() == ""){
return true;
}
return false;
}
</script>
</html>
后台实现
-
分层思想
- controller层
接收请求、响应结果
调用service层,返回结果 - service层
业务逻辑判断
例如判断参数是否为空,这个数据是否存在与逻辑相关的 - mapper层(dao层)
接口类
mapper.xml mybatis与数据库的相关操作
增删改查 - util
工具类
参数的非空判断,字符串的各种判断
通用方法,通用类 - test
测试类/方法 - entity(po, model)
javaBean实体
- controller层
-
登录功能思路
- 接收客户端的请求(接收参数:姓名、密码)
- 参数的非空判断
如果参数为空
通过消息模型对象返回结果(设置状态、设置提示信息、回显数据)
将消息模型对象设置到request作用域中
请求转发到登录页面
return - 通过用户姓名查询用户对象
- 判断用户对象是否为空
如果为空,通过消息模型对象返回结果(设置状态、设置提示信息、回显数据)
将消息模型对象设置到request作用域中
请求转发到登录页面
return - 将数据库中查询到的用户名和密码与前台传递的密码做比较
如果不相等,通过消息模型对象返回结果(设置状态、设置提示信息、回显数据)
将消息模型对象设置到request作用域中
请求转发到登录页面
return
如果相等,表示登录成功
将用户信息设置到session作用域中
重定向跳转到首页
-
各个层的任务
- controller层(接收请求,响应结果)
- 接收客户端的请求(接收参数:姓名、密码)
- 调用service层的方法,返回消息模型对象
- 判断消息模型的状态码
如果状态码是失败,将消息模型对象设置到request作用域中,请求转发到login.jsp页面
如果状态码是成功,将消息模型对象设置到session作用域中,重定向跳转到index.jsp页面
- service层
- 参数的非空判断。如果参数为空,将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象
- 调用Dao层的查询方法,通过用户名查询用户对象
- 判断用户对象是否为空,将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象
- 判断数据库中查询到的用户名密码与前台传递过来的密码做比较,如果不相等,将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象
- 登录成功,将成功状态、提示信息、用户对象设置到消息模型对象,并return
- mapper层(Dao层)
定义对应的接口,说白了就是定义对应的查询方法