JavaEE学习日志持续更新----> 必看!JavaEE学习路线(文章总汇)
JavaEE学习日志(五十五)
JSP
JSP简介
JSP成为Java的动态服务器端页面技术(Java Server Page)。
Java嵌入HTML语言
Java嵌入的HTML的方式
<% %>
<%= %>
向页面输出数据<%! %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
嵌入方式一:<% %>
--%>
<%
int a=1;
String s = "abc";
%>
<%--
嵌入方式二:<%= %> 向页面输出数据
--%>
<%=a%>
<%=s%>
<%--
嵌入方式三:<%! %>
--%>
<%!
double d=15.5;
%>
</body>
</html>
JSP运行原理
jsp页面,执行时被转化成java文件,再编译成.class
.java文件和.class文件的存储路径
C:\Users\admin\.IntelliJIdea2019.3\system\tomcat\Tomcat_8_5_32_JavaWeb_7\work\Catalina\localhost\Web05\org\apache\jsp
JSP本质就是Servlet
.java文件源码
/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/8.5.32
* Generated at: 2020-03-26 01:58:20 UTC
* Note: The last modified time of this file was set to
* the last modified time of the source file after
* generation to assist with modification tracking.
*/
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class a_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
double d=15.5;
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();
private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
private static final java.util.Set<java.lang.String> _jspx_imports_packages;
private static final java.util.Set<java.lang.String> _jspx_imports_classes;
static {
_jspx_imports_packages = new java.util.HashSet<>();
_jspx_imports_packages.add("javax.servlet");
_jspx_imports_packages.add("javax.servlet.http");
_jspx_imports_packages.add("javax.servlet.jsp");
_jspx_imports_classes = null;
}
private volatile javax.el.ExpressionFactory _el_expressionfactory;
private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;
public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
}
public java.util.Set<java.lang.String> getPackageImports() {
return _jspx_imports_packages;
}
public java.util.Set<java.lang.String> getClassImports() {
return _jspx_imports_classes;
}
public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
if (_el_expressionfactory == null) {
synchronized (this) {
if (_el_expressionfactory == null) {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
}
}
}
return _el_expressionfactory;
}
public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
if (_jsp_instancemanager == null) {
synchronized (this) {
if (_jsp_instancemanager == null) {
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
}
}
return _jsp_instancemanager;
}
public void _jspInit() {
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
return;
}
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write(" <title>Title</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write('\r');
out.write('\n');
int a=1;
String s = "abc";
out.write('\r');
out.write('\n');
out.write('\r');
out.write('\n');
out.print(a);
out.write('\r');
out.write('\n');
out.print(s);
out.write('\r');
out.write('\n');
out.write('\r');
out.write('\n');
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>\r\n");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try {
if (response.isCommitted()) {
out.flush();
} else {
out.clearBuffer();
}
} catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
JSP中的注释
<!-- HTML的注释 -->
—>JSP中存在,翻译后的.java文件中存在,浏览器中存在<% //或者/* %>
Java的注释,JSP中存在,翻译后的.java文件中存在,浏览器中没有<%-- JSP特有的注释--%>
只在JSP源码中存在
JSP九大内置对象
- request
- response
- ServletContext对象,在JSP中写对象,只能写application
final javax.servlet.ServletContext application;
- ServletConfig对象,在JSP中写对象,只能写config
final javax.servlet.ServletConfig config;
- session
- out
- page(this)
- pageContext 最小域对象,作用范围是当前页面
- exception异常
EL表达式
EL(Express Language)表达式:直接出现在JSP页面中,可以减少<%%>
的书写。
EL作用:从域对象中取出数据
EL语法:${}
EL取出域对象数据(String对象)
四大域对象
- application(ServletContext)
- session
- request
- pageContext
EL取出域对象:相当于<%=域对象.getAttribute("heima")%>
- 取出前三个域对象:
${域对象Scope.key}
,如${applicationScope.key}
- 取出pageContext:
${pageScope.key}
简化写法${key}
:EL自动从最小域开始找,一旦找到就不找了。
注意:EL取不出来,不显示null
,显示""
代码示例:从四个域对象中取出数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
EL表达式取出域对象中的数据
--%>
<%
//ServletContext域对象存储数据
application.setAttribute("heima","javaApplication");
//session域对象存储数据
session.setAttribute("heima","javaSession");
//request域对象存储数据
request.setAttribute("heima","javaRequest");
//pageContext域对象存储数据
pageContext.setAttribute("heima","javaPage");
%>
<%--
取数据
--%>
<%--取ServletContext--%>
<%--<%=application.getAttribute("heima")%>--%>
${applicationScope.heima}<br>
<%--取ServletContext--%>
${sessionScope.heima}<br>
<%--取request--%>
${requestScope.heima}<br>
<%--取pageContext--%>
${pageScope.heima}<br>
<%--简化写法--%>
${heima}
</body>
</html>
EL取出域对象数据(自定义对象)
自定义address类
public class Address {
private String city;
private String area;
...
省略get和set
}
自定义User类
public class User {
private String name;
private int age;
private Address addr;
...
省略get和set
}
需要在JSP页面中获取User中的address属性的city属性
<%@ page import="com.itheima.domain.Address" %>
<%@ page import="com.itheima.domain.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
向域对象存储自定义对象
EL表达式取出来
--%>
<%
Address addr = new Address();
addr.setCity("北京");
addr.setArea("昌平");
User user = new User();
user.setName("张三");
user.setAge(20);
user.setAddr(addr);
pageContext.setAttribute("user",user);
%>
<%--取出北京--%>
<%=((User)pageContext.getAttribute("user")).getAddr().getCity()%>
<%--
EL表达式取出北京
EL使用不需要强转
EL获取成员遍历,不需要调用getXXX方法
自己会调用,直接写成员变量名即可
--%>
${user.addr.city}
</body>
</html>
注意:EL表达式不用进行强制转换,也不要写get方法,它会自己调用
${user.addr.city}
EL取出域对象数据(自定义对象存储List)
同样也是使用上面案例的User和Address
<%@ page import="com.itheima.domain.Address" %>
<%@ page import="com.itheima.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
向域对象存储自定义对象
EL表达式取出来
--%>
<%
Address addr = new Address();
addr.setCity("北京");
addr.setArea("昌平");
User user = new User();
user.setName("张三");
user.setAge(20);
user.setAddr(addr);
Address addr2 = new Address();
addr2.setCity("天津");
addr2.setArea("武清");
User user2 = new User();
user2.setName("李四");
user2.setAge(22);
user2.setAddr(addr2);
List<User> list = new ArrayList<User>();
list.add(user);
list.add(user2);
pageContext.setAttribute("list",list);
%>
<%=((List<User>)pageContext.getAttribute("list")).get(1).getAddr().getCity()%><br>
<%--
集合索引,直接写索引编号,但需要加[]
--%>
${list[1].addr.city}
</body>
</html>
注意:
List<User> list = new ArrayList<User>();
低版本的Tomcat必须在后面的ArrayList中也写上泛型,否则可能会报错!- 集合索引,直接写索引编号,但需要加
[]
${list[1].addr.city}
EL取出域对象数据(自定义对象存储Map)
<%@ page import="com.itheima.domain.Address" %>
<%@ page import="com.itheima.domain.User" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
向域对象存储自定义对象
EL表达式取出来
--%>
<%
Address addr = new Address();
addr.setCity("北京");
addr.setArea("昌平");
User user = new User();
user.setName("张三");
user.setAge(20);
user.setAddr(addr);
Address addr2 = new Address();
addr2.setCity("天津");
addr2.setArea("武清");
User user2 = new User();
user2.setName("李四");
user2.setAge(22);
user2.setAddr(addr2);
Map<String,User> map = new HashMap<String,User>();
map.put("u1",user);
map.put("u2",user2);
pageContext.setAttribute("map",map);
%>
${map.u2.addr.city}
<%--
如果键名是"u.2"这种写法
--%>
<%--${map['u.2'].addr.city}--%>
</body>
</html>
正常写法:
${map.u2.addr.city}
注意:如果键名是"u.2",则必须写成
${map['u.2'].addr.city}
EL内置对象
内置对象:这个对象内置在EL中,直接可以使用
如JSP中内置对象,直接写对象名即可
- pageContext内置对象:它不是域对象,可以获取到其他的JSP内置对象
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
内置对象pageContext
--%>
<%--获取到JSP中的内置对象request,然后获取到Web应用名称--%>
${pageContext.request.contextPath}
</body>
</html>
- cookie内置对象:
${cookie.userName.value}
获取cookie对象的值
EL运算符
三元运算符
${num>4?"大于4":"不大于4"}
判空运算:如果空,结果是true;否则为false
注意:数组或集合的长度大于0就不为空。
<%
String[] str={"1","2","3"};
request.setAttribute("str",str);
%>
${empty str}
${!empty str}
记录上一次的用户名
前端:用户名和保存用户名部分
<input type="text" class="form-control" id="username" placeholder="请输入用户名" name="username" value="${cookie.username.value}">
...
<input type="checkbox" name="rem" value="rem"> 记住用户名
servlet
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = "/remUserName")
public class RemUserNameServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
获取提交的用户名和密码
判断和用户名密码是否匹配
如果匹配,重定向到首页
如果不匹配,转发回登陆页面
*/
String username = request.getParameter("username");
String password = request.getParameter("password");
//获取复选框rem
String rem = request.getParameter("rem");
if("rem".equals(rem)){
Cookie cookie = new Cookie("username",username);
cookie.setMaxAge(60*10);
cookie.setPath(request.getContextPath());
response.addCookie(cookie);
}
if("tom".equals(username)&&"123".equals(password)){
response.sendRedirect(request.getContextPath());
}else {
request.getRequestDispatcher("/login.jsp").forward(request,response);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}