简单的登录演示
下面是login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/JSP/doLogin" method="post">
用户名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
<input type="submit" value="登录"/><br/>
</form>
</body>
</html>
jsp的API
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%-- 三个指令:六个动作用不到,九个内置对象必须掌握,四大域对象用到三个
1、page:
作用:用于定义JSP页面的各种属性
属性:
1.1、 import 和java代码中的import是一样的
<%@ page import="java.util.Date,java.util.List"%>
或者:
<%@ page import="java.util.Date"%>
<%@ page import="java.util.List"%>
JSP会自动导入以下的包:
import java.lang.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
1.2、 session: 是否会自动创建session对象。默认值是true;
1.3、 buffer: JSP中有javax.servlet.jsp.JspWriter输出字符流。设置。输出数据的缓存大小,默认是8kb.
1.4 errorPage: 如果页面中有错误,则跳转到指定的资源。
errorPage="/uri" 如果写“/”则代表当前应用的目录下,绝对路径。
如果不写“/”则代表相对路径。
1.5、 isErrorPage: 是否创建throwable对象。默认是false;
1.6、 contextType: 等同于response.setContextType("text/html;charset=utf-8");
1.7、 pageEncoding: 告诉JSP引擎要翻译的文件使用的编码。
1.8、 isELIgnored: 是否支持EL表达式。 默认是false
<%@ page pageEncoding="gbk" %>
2、include:
静态包含:把其它资源包含到当前页面中。
<%@ include file="/include/header.jsp" %>
动态包含:
<jsp:include page="/include/header.jsp"></jsp:include>
两者的区别:翻译的时间段不同
前者:在翻译时就把两个文件合并
后者:不会合并文件,当代码执行到include时,才包含另一个文件的内容。
原则:能用静的就不用动的。
3、taglib
作用:在JSP页面中导入JSTL标签库。替换jsp中的java代码片段。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
--%>
<%--九大内置对象:标*是重要的
指在JSP的<%=%> 和<% %>中可以直接使用的对象
对象名 类型 说明
request * javax.servlet.http.HttpServletRequest
response javax.servlet.http.HttpServletResponse
session * javax.servlet.http.HttpSession 由session="true"开关
application* javax.servlet.ServletContext
exception java.lang.Throwable 由isErrorPage="false"开关
page java.lang.Object 当前对象this 当前servlet实例
config javax.servlet.ServletConfig
out javax.servlet.jsp.JspWriter 字符输出流,相当于 printWriter对象
pageContext* javax.servlet.jsp.PageContext 可以创建其他八个对象,做自定义标签时用
----------------------------------------------------------------------------------------
pageContext(重要) 当前页面有效,出了页面就没人认识了
1、本身也是一个域对象:它可以操作其它三个域对象(request session application)的数据(重点)
void setAttribute(String name,Object o);
Object getAttribute(String name);
void removeAttribute(String name);
操作其它域对象的方法
void setAttribute(String name,Object o,int Scope);
Object getAttribute(String name,int Scope);
void removeAttribute(String name,int Scope);
scpoe的值:
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext.SESSION_SCOPE
PageContext.APPLICATION_SCOPE
findAttribute(String name); 自动从page request session application依次查找,找到了就取值,结束查找。
2、它可以创建其它的8个隐式对象
在普通类中可以通过PageContext获取其他JSP隐式对象。自定义标签时就使用。
3、提供了的简易方法
pageContext.forward("2.jsp");
pageContext.include("2.jsp");
--%>
<%
pageContext.setAttribute("key", "pageContext");
//pageContext.setAttribute("key", "value", PageContext.PAGE_SCOPE);和上面的等价
request.setAttribute("key", "request");
//pageContext.setAttribute("key", "value", PageContext.REQUEST_SCOPE);和上面等价
session.setAttribute("key", "session");
//pageContext.setAttribute("key", "value", PageContext.SESSION_SCOPE);和上面等价
application.setAttribute("key", "app");
//pageContext.setAttribute("key", "app");和上面等价
//所以以上四个等价的pageContext方法毫无卵用。-----findAttribute(String name)这才是有用的方法------
//此方法自动从 page request session application依次查找,找到就取值
pageContext.findAttribute("key");
request.getRequestDispatcher("2.jsp").forward(request, response);
//2.jsp中getAttribute(“key")是取不到value的,因为pageContext只是当前页面有效
%>
<%--
四大域对象:
PageContext:存放的数据只有在当前页面有效,开发用的少
ServletContext:存放的数据在整个应用,范围太大,尽量不用。统计一下在线人数吧。
ServletRequest:存放的数据只有在一次请求(转发)中有效,用的非常!!!多。
HttpSession:存放的数据在一次会话中有效,用的多。
--%>
</body>
</html>
<%@page import="com.hero.show.Student"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Student s=new Student();
s.setStuName("tom");
request.setAttribute("stu", s);
request.getRequestDispatcher("/show5.jsp").forward(request, response);
%>
</body>
</html>
show5.jsp
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="com.hero.show.Student"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Student student=(Student)request.getAttribute("stu");
out.print(student);
%>
<%--
${stu}==pageContext.findAttibute("stu");+out.print(student);
--%>
${stu }
${stu.StuName } <%--这是通过反射StuName的get方法 --%>
<%--如果Student student=(Student)request.getAttribute("empty");
这个会是空指针但是${empty.StuName}不会报错,自动转换成空字符串
--%>
${stu.city.address } <%--属性导航 --%>
<%-- [] 运算符:点能做的它都行,点不能的它也行 --%>
${stu.city["address"] }
<%
List list=new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("list", list);
%>
${list } <%--输出list:[aaa,bbb,ccc] --%>
${list[1] } <%--输出bbb ,这个不像map.b,没法写成list.1--%>
<%
Map map=new HashMap();
map.put("a", "aa");
map.put("b", "bb");
map.put("c", "cc");
request.setAttribute("map", map);
%>
${map["b"] } <%--等于${map.b} --%> ${map.b}
<%----------------------------------------------------------------------- --%>
<%--空字符串和没有元素的集合都是看做null,即使集合不是null,都返回true --%>
${empty str1 }
${empty list1 }
<%--支持三元运算符 --%>
${empty list3 ? "你没有买东西" : "你有东西在购物车"}
</body>
</html>
EL表达式
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%------------------------------EL表达式隐式对象-------------------------
EL隐式对象引用名称 类型 JSP内置对象名称 说明
pageContext * javax.servlet.jsp.PageContext pageContext 一样的
pageScope * java.util.Map<String,Object> 没有对应的 pageContext范围中存放的数据,页面范围
requestScope * java.util.Map<String,Object> 没有对应的 请求范围数据
sessionScope * java.util.Map<String,Object> 没有对应的 会话范围数据
applicationScope* java.util.Map<String,Object> 没有对应的 应用范围数据
param java.util.Map<String,String> 没有对应的 一个请求参数
paramValues java.util.Map<String,String[]> 没有对应的 重名请求参数
header java.util.Map<String,String> 没有对应的 一个请求消息头
headerValues java.util.Map<String,String[]> 没有对应的 重名请求消息头
initParam java.util.Map<String,String> 没有对应的 web.xml中全局参数
cookie * java.util.Map<String,Cookie> 没有对应的 key:cookie对象的name值
--%>
<%
//pageContext.setAttribute("p", "pp")
pageContext.setAttribute("p", "pp", PageContext.PAGE_SCOPE)
//pageContext.setAttribute("p", "pp", PageContext.REQUEST_SCOPE)
request.setAttribute("p", "request")
//pageContext.setAttribute("p", "pp", PageContext.SESSION_SCOPE)
session.setAttribute("p", "session")
//pageContext.setAttribute("p", "pp", PageContext.APPLICATION_SCOPE)
application.setAttribute("p", "application")
%>
${requestScope.p } <%--不指定那个是,只会按照顺序,这样直接指定了范围 ,其实开发用不到--%>
${sessionScope.p } <%--直接用${stu},只有智障会取一样名字,然后指定范围查找--%>
<%--如果表单里 用户名:<input type="text" name="username" --%>
<%--${username}底层是getAttribute,是没用的,我们获取username
底层是
request.getParameter("username") --%>
${param.username }
${paramValues.hobby }
${paramValues.hobby[0] } <%--取得数组,集合 --%>
${header["User-agent"] } <%--了解:requet.getHeader() --%>
</body>
</html>
JSTL
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%--JSTL(JavaServerPages Standard Tag Library)JSP标准标签库
--%>
<%--通用标签:set out remove ,-----------这三个开发根本不用 --%>
<%--声明一个变量num ,scope是作用域--%>
<c:set var="num" value="10" scope="session"></c:set>
<%--这里用$比较好 --%> ${num }
<c:out value="${num }" default="aaa"></c:out>
<c:remove var="num" scope="session"></c:remove>
<%-------------------------------------------------------- --%>
<%--条件标签,重点了 --%>
<c:if test="${5>4 }">
aaaaaa
</c:if> <%--没有否则这个属性 --%>
<c:choose >
<c:when test="${num==1 }">aaa</c:when>
<c:when test="${num==2 }">bbb</c:when>
<c:otherwise>
cccc
</c:otherwise>
</c:choose>
<%------循环------------- --%>
<c:forEach var="i" begin="1" end="10" step="1">
${i }</br>
</c:forEach>
<%
List list=new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("list", list);
%>
<c:forEach items="${list }" var="k">
${k } 遍历集合所有元素
</c:forEach>
-------------------------------------迭代器-------------------------------------
varStatus指向一个字符串,该字符串引用一个对象,map.put("myvs",一个对象)
这个对象记录着当前遍历元素的一些信息
getIndex()返回索引,从0开始
getCount()返回计数,从1开始
islast()是否是最后一个元素
isfirst()是否是第一个元素
<table border="1">
<tr>
<td>数据</td>
<td>索引</td>
<td>计数</td>
<td>第一个</td>
<td>最后一个</td>
</tr>
<c:forEach items="${list }" var="k" varStatus="myvs"> myvs是随便取的名字vs
<tr>
<td>${k }</td>
<td>${myvs.index }</td>
<td>${myvs.count }</td>
<td>${myvs.first }</td> 返回布尔值
<td>${myvs.last }</td>
</tr>
</c:forEach>
</table>
</body>
</html>