JavaWeb----JSP&JSTL

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} &nbsp;
	</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} &nbsp;
	</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实体
  • 登录功能思路

    1. 接收客户端的请求(接收参数:姓名、密码)
    2. 参数的非空判断
      如果参数为空
      通过消息模型对象返回结果(设置状态、设置提示信息、回显数据)
      将消息模型对象设置到request作用域中
      请求转发到登录页面
      return
    3. 通过用户姓名查询用户对象
    4. 判断用户对象是否为空
      如果为空,通过消息模型对象返回结果(设置状态、设置提示信息、回显数据)
      将消息模型对象设置到request作用域中
      请求转发到登录页面
      return
    5. 将数据库中查询到的用户名和密码与前台传递的密码做比较
      如果不相等,通过消息模型对象返回结果(设置状态、设置提示信息、回显数据)
      将消息模型对象设置到request作用域中
      请求转发到登录页面
      return
      如果相等,表示登录成功
      将用户信息设置到session作用域中
      重定向跳转到首页
  • 各个层的任务

    • controller层(接收请求,响应结果)
    1. 接收客户端的请求(接收参数:姓名、密码)
    2. 调用service层的方法,返回消息模型对象
    3. 判断消息模型的状态码
      如果状态码是失败,将消息模型对象设置到request作用域中,请求转发到login.jsp页面
      如果状态码是成功,将消息模型对象设置到session作用域中,重定向跳转到index.jsp页面
    • service层
    1. 参数的非空判断。如果参数为空,将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象
    2. 调用Dao层的查询方法,通过用户名查询用户对象
    3. 判断用户对象是否为空,将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象
    4. 判断数据库中查询到的用户名密码与前台传递过来的密码做比较,如果不相等,将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象
    5. 登录成功,将成功状态、提示信息、用户对象设置到消息模型对象,并return
    • mapper层(Dao层)
      定义对应的接口,说白了就是定义对应的查询方法
  • 19
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扬子期

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值