jsp快速入门

简单的登录演示

下面是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>
    <!--servlet的作用:获取表单数据,处理业务逻辑,分发转向
        jsp就是servlet,访问服务器时,jsp被翻译成.java文件,也就是Servlet
        代码,然后编译成.class文件    
      -->
      <!-- 表单发送到dologin这个Servlet处-->
      <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.  <%%>中写Java代码
          2.    <%=  2+3  %>   等价于out.print(2+3) 底层代码就是反义成out.print();


    <%
        int i=10;    //打印13
        out.print(i+3); 
    %>

    <%=i+3%>   //打印13  



    3.在类中定义全局成员,静态块
    <%!
        int num1=10;
        //可以声明方法  
    %>
    <%
        int num2=10;
        num1++;
        num2++;
        //这里不可以声明方法,不然翻译后就是方法里声明方法,

    %>
    <%=num1%> 
    <%=num2 %>       //第一次刷新两个11,第二次是12  11  , 第三次是 13  11因为num1是全局成员 

    <%--这是jsp注释,和html注释不同,这个算Java注释,不会在浏览器端被看见,是安全的,不耗流量 --%>

     -->

<%--  三个指令:六个动作用不到,九个内置对象必须掌握,四大域对象用到三个
        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>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值