注释
jsp页面代码编译后放到服务器的位置:
D:\Program Files (x86)\xampp\tomcat\work\Catalina\localhost\chapter3\org\apache\jsp
注释快捷键:ctrl+shift+/
取消注释快捷键:ctrl+shift+\
<body>
<pre>
JSP中一共有两种类型的注释
1.显示注释
能够在客户端中查看的注释
1.继承HTML风格的注释 <!-- HTML注释 -->
<!-- HTML注释 -->
2.隐式注释
不能在客户端查看的注释
1.JSP自己的注释 <!-- JSP自己的注释 -->
<%-- JSP自己的注释 --%>
2.继承Java风格的注释
// 单行注释
/* 多行注释 */
</pre>
<%
//这是单行注释
/* 这是多行注释 */
%>
</body>
Scriptlet脚本小程序
现在一般不在jsp页面中写Java代码了,之前用的时候看这部分内容
<body>
<%--
Scriptlet脚本小程序
JSP一共又三种Scriptlet脚本小程序:
第一种:Java脚本段,可以写Java代码,定义局部变量,编写语句等
<%
//可以写Java代码,和Java语法一样
%>
生成的代码在servlet中的service方法中
第二种:声明,声明全局变量、方法、类等
<%!
//声明全局变量
%>
生成的代码在servlet的类体中
第三种:输出表达式,可以输出变量或字面量
<%=数值 %>
生成的代码在servlet中的service方法中,相当于out.print()输出简化
--%>
<%
//out.print(str);这里不能输出局部变量
out.print(num);
%>
<%--第一种 Java脚本段,可以写Java代码,定义局部变量,编写语句等 --%>
<%
//定义局部变量
String str = "Hello Jsp";
//输出内容到控制台
System.out.println(str);
//输出内容到浏览器
out.print(str);
%>
<%--第二种 声明,声明全局变量、方法、类等--%>
<%!
//声明全局变量
int num = 10;
%>
<%
out.print(str);
//输出全局变量
out.print("全局变量" + num);
%>
<%--第三种 输出表达式,可以输出变量或字面量 --%>
<%=str %>
</body>
include包含
静态包含
<body>
<%--
include静态包含
格式:<%@include file="要包含的页面地址"%>
特点:
1、将内容进行了直接的替换
2、静态包含只会生成一个源码文件,最终的内容全部在_jspservice方法体中(源码文件中)
3、不能出现同名变量
4、运行效率高一点点,耦合性较高,不够灵活
通过包含可以实现更方便的修改重复代码
--%>
<%@include file="04_header.jsp" %>
<h2>主体内容</h2>
<%
// 这里不能定义,因为在header里面有了,不能出现同名变量
// int num = 1;
%>
<%@include file="04_footer.jsp" %>
</body>
动态包含(常用)
<body>
<%--
include动态包含
格式:<jsp:include page="要包含的页面路径"></jsp:include>
特点:
1、动态包含相当于方法的调用
2、动态包含会生成多个源码文件
3、可以定义同名变量
4、效率高,耦合度低
注:
当动态包含不需要传递参数时,include双标签之间不要有任何内容,包括换行和空格
使用动态包含传递参数
<jsp:include page="要包含的页面路径">
<jsp:param name="参数名" value="参数值"/>
</jsp:include>
注:name属性不支持表达式,value属性支持表达式
获取参数:
request.getParameter(name);通过指定参数名获取参数值
--%>
<jsp:include page="04_header.jsp"></jsp:include>
<h2>主题内容</h2>
<%
//可以定义
int num2 = 2;
//这里可以定义变量文件名,后面直接用
String url="04_footer.jsp";
%>
<jsp:include page="<%=url %>"></jsp:include>
<%--动态包含传递参数 --%>
<jsp:include page="<%=url %>">
<jsp:param name="uname" value="admin"/>
<jsp:param name="msg" value="<%=num2 %>"/>
</jsp:include>
</body>
header.jsp和footer.jsp文件
<body>
<h2>头部内容</h2>
<%
int num = 1;
int num2 = 2;
%>
</body>
<body>
<h2>底部内容</h2>
<%
//获取动态包含传递的参数
String uname = request.getParameter("uname");
String msg = request.getParameter("msg");
out.print(uname + "," + msg);
%>
</body>
JSP的四大域对象
JSP的四大域对象
page作用域
在当前页面有效,跳转后无效
request作用域
在一次请求中有效,服务端跳转有效,客户端跳转无效
session作用域
在一次会话中有效,服务端和客户端跳转有效。一般用于用户登录,如登录淘宝后,跳转多次仍然有登录信息
application作用域
在整个应用中有效
JSP中跳转方式
1、服务端调转
<jsp:forward page="跳转的页面地址"></forward>
2、客户端跳转
超链接
06_JSP_domain_four.jsp
<body>
<%
//设置page范围的域对象
pageContext.setAttribute("name1", "zhangsan");
//设置request范围的域对象
request.setAttribute("name2", "lisi");
//设置session范围的域对象
session.setAttribute("name3", "wangwu");
//设置application范围的域对象
application.setAttribute("name4", "zhaoliu");
%>
<%--jsp中服务端跳转 --%>
<%-- <jsp:forward page = "06_JSP_domain_four_02.jsp"></jsp:forward> --%>
<%-- 超链接跳转 --%>
<a href="06_JSP_domain_four_02.jsp">跳转</a>
</body>
06_JSP_domain_four_02.jsp
<body>
<%
//获取域对象中的值
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>");
%>
</body>
使用forward
服务端跳转
page范围: null
request范围:lisi
session范围:wangwu
application范围: zhaoliu
使用超链接客户端跳转
page范围: null
request范围:null
session范围:wangwu
application范围:zhaoliu
跳转后,再次打开浏览器
page范围: null
request范围: null
session范围: null
application范围: zhaoliu
简单的登录页面
jsp
实现登录界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="loginServlet" 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("msg") %></span>
</form>
</body>
</html>
java
实现loginServlet
服务器
package com.xxxx.controller;
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("/loginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置客户端的编码格式
request.setCharacterEncoding("UTF-8");
//接受客户端传递的参数
String uname = request.getParameter("uname");
String upwd = request.getParameter("upwd");
//判断参数是否为空
if(uname == null || "".equals(uname.trim()) || upwd == null || "".equals(upwd.trim())) {
//提示用户信息
request.setAttribute("msg", "用户姓名或密码都不能为空");
//请求转发跳转到login.jsp
request.getRequestDispatcher("login.jsp").forward(request, response);
return;
}
//判断账号密码是否正确 要求:uname=admin upwd=123456
if(!"admin".equals(uname) || !"123456".equals(upwd)) {
//提示用户信息
request.setAttribute("msg", "登陆失败!");
//请求转发跳转到login.jsp
request.getRequestDispatcher("login.jsp").forward(request, response);
return;
}
//登陆成功
//设置登录信息到session作用域
request.getSession().setAttribute("uname", uname);
//跳转到index.jsp
response.sendRedirect("index.jsp");
}
}
jsp
实现登录后的界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录成功!</title>
</head>
<body>
<h2>欢迎<%=session.getAttribute("uname") %>登录!</h2>
</body>
</html>