• Java基础——JSP(三)


    一、 JavaBean

    是一种特殊的java类,它遵从一定的设计模式,开发工具和其他组件可以根据这种模式来调用javaBean。它是使用一种符合某些命名方法和设计规范的java类。

    -- 这个类是可序列化的(能够持久保存也能恢复状态),也就是,它必须实现java.io.Serializable接口

    -- 这个类必须带有一个无参数的构造方法。

    -- 这个类的属性必须通过使用get、set和其他按标准命名规范来命名的方法来操作:

    getXxx()和setXxx()用于非布尔属性,isXxx()用于布尔属性。这些方法称之为getters和setters

    -- 这个类包含所有必须的事件处理方法。

    二、JSP标准动作

    标准动作是这样一些标记,它影响JSP运行时的行为和发送给客户的应答,它们应当由所有的包容器来提供,而不管它们的实现如何

    ==jsp动作元素

    <jsp:include> //向一个页面中包含别一个页面(动态引入),  过去霃的是静态引入 <@ include file="xxx" >
    <jsp:forward> //页面跳转,服务跳转
    <jsp:param> //用来传参数
    <jsp:useBean> //用来声明javaBean
    <jsp:setProperty>  //用来设置参数
    <jsp:getProperty>  //用来得到参数
    <jsp:plugin> 

    ==<jsp: useBean> 标记

    <%--
        UserInfo user=new UserInfo();        
        user.setNote("这是备注");
        user.setUserName("这是名字");
                                    
         session.setAttribute("user",user);
    --%>
    // 相当于下面的写法
                
    //声明一个Bean
    <jsp:useBean id="user" class="cat.bean.UserInfo" scope="session" />
                            
         /往Bean中存值
         <jsp:setProperty name="user"  property="userName" value="这是用userBean加的姓名"/>
         <jsp:setProperty name="user" property="note"  value="这是用userBean备注"/>
                            
         //取值
         <jsp:getProperty name="user" property="userName" />
         <jsp:getProperty name="user" property="note" />

    == <jsp:include>  标记

    把另外一个资源输出的内容插入到当前JSP页面中,称为动态引入.

    语法: <jsp:include page="relativeUrl  | <%=expression %> " flush="true/false">

    page属性用于指定被引入资源的相对路径,也可以通过执行一个表达式来获得

    1) 在当前jsp页面被执行期间插入被引入资源的输出内容,两者是独立的实体,被引入的资源必须是一个能独立被web容器调用和执行的资源

    2) 被引入页面不能改变响应状态码,也不能设置响应头

    3) 灵活性好

    4) 两种include都可以把页面内容分为多个组件来开发

    <jsp:include page="top.html">
    <jsp:include page="down.html">

    5) 两者都应注意 最终输出结果的内容要遵循 html 语法结构,如果当前页面产生了 <html></html><body></body>,被引入的文件中,就不该带有这些标记

    6) 对引擎翻译 JSP 页面没有任何影响

    ==<jsp:forward> 和 <jsp:param >

    //相当于服务端跳转
    <jsp:forward page="localURL">   //这里的localURL是服务器上存在的一个地址
    <jsp:param name="userId" value="zhangsan" />
    <jsp:param name="password" value="123" />      
    </jsp:forward>

    ===跳转方式的总结

    1) form 表单  <form action="XXXServlet" method="get/post" >

    2) 超链接 <a href="XXXXServlet" >转</a>

    3) <meta http-equiv="refresh" content="3;URL=XXXServlet" />  //隔三秒转向另一个页面

    4) response.sendRedirect(URL)

    5) <jsp:forward page="localURL">

    6) request.getRequestDispatch("XXXServlet").forward(request,response);

    7) pageContext.forward("XXXServlet")            

    跳转的方式:

    请求转发的特点:

    1.只能在同一个工程内进行页面跳转

    2.服务器端的行为

    3.多个页面之间共享同一个request对象。

    4.跳转后RUL地址栏不变

    请求重定向的特点:

    1.可以多个工程之间跳转

    2.客户端的行为

    3.多个页面之间不共享一个request对象

    4.跳转后URL地址栏显示跳转后的页面地址

    三、EL 表达式

    EL (Expression Lanaguage ),jsp 2.0 中新增的一种可以简单化JSP开发的技术

    1.语法为 ${表达式}

    -- 能访问变量,javaBean属性,集合,数组

    -- 能进行算术运算 ,关系,逻辑运算

    -- 能访问内置对象

    -- 可以在标签中直接使用

    优点

    1) 可以方便的访问jsp页面的相关数据   

    登录的Servlet中 request.getSession().setAttribute("user",user);

    在 top.jsp中 <%=((UserInfo)session.getAttribute("user")).getUserName() %>

    如果用EL   ${user.userName}

    //例如:这个写法可以改成
    <input type="text" name="num1" value="<%=request.getParameter("num1")==null?"":request.getParameter("num1") %>" >
    //这个写法
    <input type="text" name="num2" value="${param.num2}" >

    什么时候用param ? 如果想代替的是 request.getParameter() ,就用 param,如果想代替的是 request.getAttribute,就不用param了

    //例子 在 TestServlet 中
    request.setAttribute("goodstudent", "赵明");
    request.getRequestDispatcher("test.jsp").forward(request, response);
    //test.jsp
    
    <script>
      alert('${goodstudent}');
    </script>

    可以访问嵌套属性   ${userInfo.school.schoolName }

    2) 如果计算结果为 null,jsp脚本将输出内容为null 的字符文本,而el会强制将它转换成 "" 后输出这样的处理结果非常有用

    <form action="a.jsp" method="get">
       <input type="text" name="userName" value='<%=request.getParameter("userName")%>'/>  //这样第一次会有null
       <input type="text" name="password" value="${param.password }"/> //用el表达式.第一次不会有null
       <input type="submit"/>
    </form>

    3) 可以用 empty()  操作来判断一个参数是否为 null,某个集合或字符串中的内容是否为空

    4) 具有类似 javaScript 等脚本语言的优点,能够对字符串,数字等各种类型的数据进行处动转换

    2.EL 的基本用法

    访问作用域中的变量  ${变量名}--->${userName}

    request -> session-> application 顺序依次去找,找到为止,找不到返回null, 如果找到了,则返回其值

    如果想显示的指定作用域

    ${ pageScope.userName}

    ${ requestScope.userName }   //只从request中找

    ${ sessionScope.userName }   //只从session中找

    ${ applicationScope.userName }   //只从session中找
                            

    <%    
    String str="aaaaaa";
    session.setAttribute("STR",str);
                                
    List xxxxList=Dao.getList...
    %>
    ${STR }
    ${sessionScope.STR } //指定从 session中查找 

    --访问 map list array

    List aList=new ArrayList();
    aList.add("a");
    aList.add("b");
     aList.add("c");
    aList.add("d");    
    request.setAttribute("A_LIST",aList);
                             
    ${A_LIST[0]}
    ${A_LIST[1]}
    ${A_LIST[2]}
    ${A_LIST[3]}

    -- 进行运算

    ${100*99 }
    ${100>99 }
    ${100/99 }

    --三元运算符

    ${user!=null?user.name:"用户值为空"}

    附: EL 11个内置对象

    1 2 3 4)pageScope、requestScope、sessionScope、applicationScope 四个数据范围,用来取值。

    5)pageContext 当前jsp上下文 ----- ${pageContext.request.contextPath }   服务的web application 的名称

    ${pageContext.request.queryString}// 取得请求的参数字符串
    ${pageContext.request.requestURL}//取得请求的URL,不包括参数字符串    
    ${pageContext.request.method}// 取得HTTP 的方法(GET、POST)
    ${pageContext.request.protocol} //取得使用的协议(HTTP/1.1、HTTP/1.0)
    ${pageContext.request.remoteUser}//取得用户名称
    ${pageContext.request.remoteAddr }//取得用户的IP 地址
    ${pageContext.session.new}//session 是否为新的
    ${pageContext.session.id}// 取得session 的ID
    ${pageContext.servletContext.serverInfo}//取得主机端的服务信息

    6)${param.name} 等价于 request.getParameter("name")

    7)${paramValues.hobby} 等价于 request.getParameterValues("hobby")

    8)${header.referer} 等价于 request.getHeader("referer")

    9)${headerValues["Accept-Encoding"]} 等价于 request.getHeaders("Accept-Encoding")

    10)${initParam.name} 等价于 getServletContext().getInitParamter("name")

    11)${cookie.address.value }  //取 key 为 address 的 cookie 值

    相当于下面的写法:

    Cookie[] cookies = request.getCookies();
        if(cookies==null){
           out.println("cookie不存在!");
        }else{
         for(Cookie cookie : cookies){
         if(cookie.getName().equals("address")){
         out.println(cookie.getValue());
         break;
          }
     }

    四、jstl 标签库

    JSTL:Java Server Page Standard Tag Library  JSP标准标签库

    JSTL由五个不同功能的标签库组成

    功能范围  URI 前缀
    core http://java.sun.com/jsp/jstl/core c
    I18N http://java.sun.com/jsp/jstl/fmt  fmt
    SQL http://java.sun.com/jsp/jstl/sql sql
    XML http://java.sun.com/jsp/jstl/xml xml
    Functions http://java.sun.com/jsp/jstl/functions fn

    --- 一般用途标签

    <c:out>
    <c:set>
    <c:remove>
    <c:catch>

    --- 条件标签

    <c:if>
    <c:choose>
    <c:when>
    <c:otherwise>

    --- 循环标签

    <c:forEach>
    <c:forTokens>

    --- URL相关标签

    <c:import>
    <c:url>
    <c:redirect>
    <c:param>

    要引入标签库

    jstl1.0的引入方式为:

    <taglib uri="http://java.sun.com/jstl/core" prefix="c" />

    jstl1.1的引入方式为:

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

     <c:out> ========================== // 用于输出内容

    输出一个字符串

    --<c:out value="this is a cat" />

    输出一个作用域中的变量

    --<c:out value="${name}" />   = ${name}

    输出javaBean中的属性

    <c:out value="${user.name}" />

    输出缺省值

    --<c:out value="${cat_name}" default  ="--------------------"/>

    <c:set>============================== //在某个作用域中设置变量或javaBean的属性值

    scope 属性 可以取 page,reqesut,session,application

    --<c:set var="num1" value="ooooooooo" scope="request" />  //<% request.setAttribute("num1","ooooooooo")%>

    --<c:set var="num2">qqqqqqqq</c:set>   

    给javaBean 赋值

    <jsp:useBean id="userInfo" class="cn.bean.UserInfo" />
    
    <c:set target="${userInfo}" property="userName" value="张四" />   
    
    <c:set target="${userInfo}" property="password" value="123456" />   
    
    <c:out value="${userInfo.userName}" />
    
    ${userInfo.password} //这样取值更简洁    

    <c:if>===============================  //条件判断

    //例子
    <c:set var="age" value="18" />
    <c:if test="${ age<20 }">  
         处对象
    </c:if>
    //例子
    <c:set var="role" value="admin" />
    
    <c:if test="${role!='supperadmin'}">
    <input type="button" value="删除" disabled="disabled" />
    </c:if>
                        
    <c:if test="${role=='supperadmin'}">
    <input type="button" value="删除"/>
    </c:if>

    <c:choose><c:when><c:otherwise>==========================//分支条件判断

    //例子
    <c:set var="fenshu" value="94" scope="request"/>  //<% int score=90 ; reqesut.setAttribute("fenshu",90); %>
    <c:choose>
       <c:when test="${fenshu>90}"> 成绩优秀</c:when>
       <c:when test="${fenshu<90&&fenshu>80}">成绩良好</c:when>
       <c:otherwise>估计美术会不错</c:otherwise>
       </c:choose>

    <c:forEach>=============================================//循环

    <table ... >
      <c:forEach var="u" items="${adminList}" >  //非常容易错写成: items=${"adminList"}
        <tr>
           <td>${u.id }</td>
           <td>${u.userName }</td>
           <td>${u.password }</td>
           <td>${u.note }</td>
           <td><a href="admin/admin_edit.jsp?id=${u.id }" >修改</a> | <a  onclick="return confirm('确定要删除吗?')" 
    href="AdminServlet?flag=del&id=${u.id }" >删除</a></td> </tr> </c:forEach>
    </table>

    固定次数的迭代

     <c:forEach begin="1" end="10" var="i">
       ${i}
     </c:forEach>

    指定步长的迭代

    <c:forEach begin="1" end="10" var="i" step="2">
         ${i}   // 1,3,5,7,9
    </c:forEach>

    带 status 属性的迭代

    <c:forEach begin="1" end="10" var="i" varStatus="s" step="2" >
      <br>
      值是 ${i} <br>
      索引是  ${s.index} <br>
      count 是 ${s.count} <br>
      是否第一个${s.first} <br>
      是否最后一个${s.last}
    <hr>
    </c:forEach>

     URL 操作标签==============================

    == <c:import> 把其他静态或动态文件包含到 JSP 页面。

    与<jsp:include>的区别是后者只能包含同一个web应用中的文件,前者可以包含其他web应用中的文件,甚至是网络上的资源。

    语法:

     <c:import url="url" [context="context"] [value="value"] [scope="..."] [charEncoding="encoding"]></c:import>
    
    <c:import url="url"  varReader="name" [context="context"][charEncoding="encoding"]></c:import>

    == 在 a.jsp 中引用百度:

    <%@ page contentType="text/html;charset=utf-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
       <html>
         <body>
          绝对路径引用的实例
          <c:import url="http://www.baidu.com"  charEncoding="utf-8"/>  

    //注意,这里和上面,都必须是utf-8 ,要不会乱码。使用字符串输出、相对路径引用的实例,并保存在session范围内" <c:catch var="errorMsg"> <c:import var="userName" url="1.txt" scope="session" charEncoding="gbk"></c:import> <c:out value="${userName}"></c:out> </c:catch> <c:out value="${errorMsg}"></c:out> <%=session.getAttribute("userName")+"ssssssssss" %> "本例相当于把 1.txt文本中的内容,放到session中,等于 session.setAttribut("userName","文本中内容"); //注意一下catch 的用法 </body> </html>
     //例子
    
    <%request.setAttribute("url",url); %>       
    <c:import url="${url}/xtcx/foot/index.htm" />
    
    //注意,它不接受这么写<c:import url="<%=url%>/xtcx/foot/index.htm" />,

     == <c:redirect> =========================================

    该标签用来实现请求的重定向。例如,对用户输入的用户名和密码进行验证,不成功则重定向到登录页面。或者实现Web应用不同模块之间的衔接

    语法:

    <c:redirect url="url" [context="context"]/>

    或:

    <c:redirect url="url" [context="context"]>

    <c:param name="name1" value="value1">

    </c:redirect>

    //例子
    <c:redirect url="http://127.0.0.1:8080">
    <c:param name="uname">lihui</c:param>
    <c:param name="password">11111</c:param>
    </c:redirect>

     == <c:url> 用于动态生成一个 String 类型的URL,可以同上个标签共同使用,也可以使用HTML的<a>标签实验超链接。

    语法:

    <c:url value="value" [var="name"] [scope="..."] [context="context"]>

    <c:param name="name1" value="value1">

    </c:url>

    或:<c:url value="value" [var="name"] [scope="..."] [context="context"]/>

    //例子
    
    <c:url value="http://127.0.0.1:8080" var="url" scope="session"></c:url>
    
    <a href="${url}">Tomcat首页</a>

    五、日期格式化

    1、首先包引入:

    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> //严注意里面不要有多余的空格

    2、日期参数:

    Date: 2004/04/01:13:30:00 Java format: Thu Apr 01 13:30:00 CST 2004

    isoDate: 20040531T235959 Java format: Mon May 31 23:59:59 CDT 2004

    3、标签结果:

    (日期显示)

    <fmt:formatDate value="${date}" type="both"/>   显示格式:2004-4-1 13:30:00
                
    <fmt:formatDate value="${isoDate}" type="both"/>   显示格式:2004-5-31 23:59:59
    <fmt:formatDate value="${date}" type="date"/>   显示格式:2004-4-1
    <fmt:formatDate value="${isoDate}" type="time"/>   显示格式:23:59:59
    <fmt:formatDate value="${isoDate}" type="date" dateStyle="default"/>   显示格式:2004-5-31
    <fmt:formatDate value="${isoDate}" type="date" dateStyle="short"/>   显示格式:04-5-31
    <fmt:formatDate value="${isoDate}" type="date" dateStyle="medium"/>   显示格式:2004-5-31
    <fmt:formatDate value="${isoDate}" type="date" dateStyle="long"/>   显示格式:2004年5月31日
    <fmt:formatDate value="${isoDate}" type="date" dateStyle="full"/>  显示格式:2004年5月31日星期一

    (日期时间显示)

    <fmt:formatDate value="${date}" type="both" pattern="EEEE, MMMM d, yyyy HH:mm:ss Z"/>

    显示格式:星期四, 四月 1, 2004 13:30:00 -0600

    <fmt:formatDate value="${isoDate}" type="both" pattern="d MMM yy, h:m:s a zzzz" />

    <fmt:formatDate value="${这里可以放日期和字符串}" pattern="yyyy年MM月dd日"/>

     //例子:
     <%
          UserInfo u=new UserInfo();
          u.setBirthday(new java.util.Date());
          request.setAttribute("user",u);
    %>

    <fmt:formatDate value="${user.birthday}"  type="both" />
  • 相关阅读:
    HTML5 WEB SQL
    Android-day04
    Android-day03
    Android-day02
    Android-day01
    java.lang.ClassNotFoundException: org.apache.jsp.index_jsp
    事务管理、整合Junit、整合Web、SSH整合
    AOP、AspectJ、JdbcTemplate
    Spring基础
    Hibernate对连接池的支持
  • 原文地址:https://www.cnblogs.com/1693977889zz/p/7484045.html
Copyright © 2020-2023  润新知