简单的登录演示
下面是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 >