简单的登录演示
下面是login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<html >
<head >
<meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" >
<title > Insert title heretitle >
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" %>
<html >
<head >
<meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" >
<title > Insert title heretitle >
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" %>
<html >
<head >
<meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" >
<title > Insert title heretitle >
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" %>
<html >
<head >
<meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" >
<title > Insert title heretitle >
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" %>
"-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" >
"Content-Type" content="text/html; charset=UTF-8" >
Insert title here
<%------------------------------EL表达式隐式对象-------------------------
EL隐式对象引用名称 类型 JSP内置对象名称 说明
pageContext * javax.servlet .jsp .PageContext pageContext 一样的
pageScope * java.util .Map 没有对应的 pageContext范围中存放的数据,页面范围
requestScope * java.util .Map 没有对应的 请求范围数据
sessionScope * java.util .Map 没有对应的 会话范围数据
applicationScope* java.util .Map 没有对应的 应用范围数据
param java.util .Map 没有对应的 一个请求参数
paramValues java.util .Map 没有对应的 重名请求参数
header java.util .Map 没有对应的 一个请求消息头
headerValues java.util .Map 没有对应的 重名请求消息头
initParam java.util .Map 没有对应的 web.xml 中全局参数
cookie * java.util .Map 没有对应的 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},只有智障会取一样名字,然后指定范围查找--%>
<%--如果表单里 用户名: "text" name="username" --%>
<%--${username}底层是getAttribute,是没用的,我们获取username
底层是
request.getParameter ("username" ) --%>
${param.username }
${paramValues.hobby }
${paramValues.hobby [0 ] } <%--取得数组,集合 --%>
${header["User-agent" ] } <%--了解:requet.getHeader () --%>
JSTL
<%@page import="java.util.ArrayList" %>
<%@page import="java.util.List" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<html >
<head >
<meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" >
<title > Insert title heretitle >
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 }" > aaac:when >
<c:when test ="${num==2 }" > bbbc: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 >