jsp快速入门

来源:互联网 发布:ezzy付强 知乎 编辑:程序博客网 时间:2024/06/03 19:34

简单的登录演示

下面是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>
/** * 服务器端的相对路径 、绝对路径相对*.do,绝对/*.do;DD(web.xml)文件中的url-pattern只能绝对路径,即/*.do,根地址为应用目录。<form action=”" >中的路径一般写相对,即为DD文件中定义的servlet-mapping的url-pattern。例如DD中<url-pattern>/proName</url-pattern>,action=”proName”。若action要写绝对地址,则必须从服务器根写起,因为container是从server开始分析的。例如action=”/webapp/proName”。HttpServletResponse.sendRedirect(String)参数可以指定为相对路径、绝对路径或其它WebURL。假设通过http://localhost/myApp/cool/bar.do请求到达该方法所属的Servlet。相对路径:response.sendRedirect(“foo/stuff.do”)。容器相对于原来请求URL的目录加参数来生成完整的URL—http://localhost/myApp/cool/foo/stuff.do。绝对路径:response.sendRedirect(“/foo/stuff.do”)。容器相对于Web应用本身加参数建立完整的URL—http://localhost/foo/stuff.do。其它Web应用:response.sendRedirect(“http://niye.name)。容器直接定向到该URL。HttpServletRequest.getRequestDispatcher(String)参数可以指定为相对路径或绝对路径。相对路径情况下生成的完整URL与sendRedirect方法相同。绝对路径与重定向不同,容器将相对于Web应用的根目录加参数生成完整的URL,即:request.getRequestDispatcher(“/foo/stuff.do”)生成的URL是http://localhost/myApp/foo/stuff.do。 二:/表示根路径,但是jsp的根路径和servlet的根路径不一样jsp的根路径:http:/ /localhost:8080 而servlet的根路径 http:localhost:8080/weapp */@WebServlet("/doLogin")public class doLogin extends HttpServlet {    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        //获取表单数据        String username=request.getParameter("username");        String password=request.getParameter("password");        //处理业务逻辑        if("tom".equals(username)&&"123".equals(password)){            request.getRequestDispatcher("/success.jsp").forward(request, response);            //response.sendRedirect(request.getContextPath()+"/success.jsp");//这样重定向是获取不到数据的        }else{            response.sendRedirect(request.getContextPath()+"/login.jsp");        }        //分发转向    }    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        doGet(request, response);    }}

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_SCOPEfindAttribute(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>
原创粉丝点击