分类目录归档:jsp

Jsp EL

1、什么是EL

        EL是JSP表达式语言,全称是ExpressionLanguage,使用EL的目的是简化在JSP中访问变量的方式,简单静态HTML与Java代码的耦合。

2、JSP EL 表达式用于以下情形

静态文本
标准标签和自定义标签
安装支持Servlet2.4/JSP2.0的Container

3、基本语法格式

${ EL Expression}

示例:
${ “Helloworld” }  //输出字符串常量
${ str }  //输出字符串变量str的值
${ 3 + 2 }  //输出3+2的结果
${ user.name} //输出user对象的name属性
${user[“name”] }  //同上
${ sessionScope[“user”].name } //同上
${user.name}
访问对象user的getName()方法以得到name成员的值。
${list[1]}
访问list对象的第二项。
${map[“key”]}
访问map指定键的值。

4、操作符

算术操作符(+,-,*,/,%)
逻辑操作符(&&,||,!或and,or,not)
XML操作符
lt  <
le  <=
gt   >
ge  >=
比较操作符(>,>=,<,<=,==,!==)—可以自动转换数据类型
空操作符(empty)//当值为null时返回true

EL的算术运算符和Java中的运算符的大致相同,优先级也相同。

注意:'+' 运算符不会连接字符串了,他只用于加法运算。

EL关系运算符有以下六个运算符

关系运算符      说明                范例             结果
= = 或 eq   |    等于   |${ 5 = = 5 } 或 ${ 5 eq 5 } | true
!= 或 ne    |   不等于 |${ 5 != 5 } 或 ${ 5 ne 5 } | false
< 或 lt     |   小于    |${ 3 < 5 }或 ${ 3 lt 5 }    | true
> 或 gt     |   大于    |${ 3 > 5 }或 ${ 3 gt 5 }    | false
<= 或 le    | 小于等于 |${ 3 <= 5 }或 ${ 3 le 5 }   | true
>= 或 ge    | 大于等于 |${ 3 >= 5 }或 ${ 3 ge 5 }   | false

5、集合访问

数组访问

${}   //如request.getAttribute(“name”);

List访问
Map访问

6、隐式对象

JSP 表达式语言定义了一组隐式对象,其中许多对象在 JSP scriplet 和表达式中可用:

允许对以下对象进行简易访问:

术语 定义

param

将请求参数名称映射到单个字符串参数值(通过调用 ServletRequest.getParameter (String name) 获得)。getParameter (String) 方法返回带有特定名称的参数。表达式 $(param.name) 相当于 request.getParameter (name)。

paramValues

将请求参数名称映射到一个数值数组(通过调用 ServletRequest.getParameter (String name) 获得)。它与 param 隐式对象非常类似,但它检索一个字符串数组而不是单个值。表达式 ${paramvalues.name) 相当于 request.getParamterValues(name)。

header

将请求头名称映射到单个字符串头值(通过调用 ServletRequest.getHeader(String name) 获得)。表达式 ${header.name} 相当于 request.getHeader(name)。

headerValues

将请求头名称映射到一个数值数组(通过调用 ServletRequest.getHeaders(String) 获得)。它与头隐式对象非常类似。表达式 ${headerValues.name} 相当于 request.getHeaderValues(name)。

cookie 将 cookie 名称映射到单个 cookie 对象。向服务器发出的客户端请求可以获得一个或多个 cookie。表达式 ${cookie.name.value} 返回带有特定名称的第一个 cookie 值。如果请求包含多个同名的 cookie,则应该使用 ${headerValues.name} 表达式。
initParam 将上下文初始化参数名称映射到单个值(通过调用 ServletContext.getInitparameter(String name) 获得)。

除了上述两种类型的隐式对象之外,还有些对象允许访问多种范围的变量,如 Web 上下文、会话、请求、页面:

术语 定义

pageScope

将页面范围的变量名称映射到其值。例如,EL 表达式可以使用 ${pageScope.objectName} 访问一个 JSP 中页面范围的对象,还可以使用 ${pageScope.objectName.attributeName} 访问对象的属性。

requestScope

将请求范围的变量名称映射到其值。该对象允许访问请求对象的属性。例如,EL 表达式可以使用 ${requestScope.objectName} 访问一个 JSP 请求范围的对象,还可以使用 ${requestScope.objectName.attributeName} 访问对象的属性。

sessionScope

将会话范围的变量名称映射到其值。该对象允许访问会话对象的属性。例如:

$sessionScope.name}

applicationScope

将应用程序范围的变量名称映射到其值。该隐式对象允许访问应用程序范围的对象

 特别说明:

cookie对象

所谓的cookie是一个小小的文本文件,它是以key、value的方式将SessionTracking的内容记录在这个文本文件内,这个文本文件通常存在于浏览器的暂存区内。JSTL并没有提供设定cookie的动作,因为这个动作通常都 是后端开发者必须去做的事情,而不是交给前端的开发者。如果我们在cookie中设定一个名称为userCountry的值,那么可以使 用${cookie.userCountry}来取得它。

header和headerValues(请求报头对象)
header储存用户浏览器和服务端用来沟通的数据,当用户要求服务端的网页时,会送出一个记载要求信息的标头文件,例如:用户浏览器的版本、用户计算机所设定的区域等其他相关数据。如果要取得用户浏览器的版本,即${header["User-Agent"]}。另外在很少机会下,有可能同一标头名称拥有不同的值,此时必须改为使用headerValues来取得这些值。
注意:因为User-Agent中包含“-”这个特殊字符,所以必须使用“[]”,而不能写成${header.User-Agent}。
initParam
就像其他属性一样,我们可以自行设定web应用的环境参数(Context),当我们想取得这些参数时,可以使用initParam隐含对象去取得它,例如:当我们在web.xml中设定如下:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<context-param>
<param-name>userid</param-name>
<param-value>mike</param-value>
</context-param>
</web-app>
那么我们就可以直接使用 ${initParam.userid}来取得名称为userid,其值为mike的参数。下面是之前的做法:String userid =(String)application.getInitParameter("userid");

pageContext对象

我们可以使用 ${pageContext}来取得其他有关用户要求或页面的详细信息。下面列出了几个比较常用的部分。
Expression 说 明
${pageContext.request} |取得请求对象
${pageContext.session} |取得session对象
${pageContext.request.queryString} |取得请求的参数字符串
${pageContext.request.requestURL} |取得请求的URL,但不包括请求之参数字符串
${pageContext.request.contextPath} |服务的web application的名称
${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是否为新的,所谓新的session,表示刚由 server产生而client尚未使用
${pageContext.session.id} |取得session的ID
${pageContext.servletContext.serverInfo}|取得主机端的服务信息

7、特别强调

1、注意当表达式根据名称引用这些对象之一时,返回的是相应的对象而不是相应的属性。例如:即使现有的 pageContext 属性包含某些其他值,${pageContext} 也返回 PageContext 对象。

2、 注意 <%@ pageisELIgnored="true" %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言。

..

JSP & tomcat

设置jsp默认pageEncoding;windows->preference->myeclipse->files and editors->jsp->encoding  utf-8
设置jsp为编辑模式,没有预览界面:https://zhidao.baidu.com/question/581118605.html?qq-pf-to=pcqq.group
tomcat:多线程,每一个客户都会创建一个新的线程,线程之间互不影响。单例模式
单例模式:
饿汉模式:
       优点:确保一个类被调用的时候只创建一个对象,节省时间和内存
       缺点:只要加载到这个类,对象就会被创建,会造成资源浪费
懒汉模式:
       优点:确保一个类被调用的时候只创建一个对象,只有在调用的时候才生出对象,节省时间和内存
       缺点:实现比较复杂
1.Tomcat:免费的开源的轻量级的服务器,中小型企业常用
    bin:  startup.bat 和startup.sh(linux)   shutdown.bat和shutdown.sh
    conf:  server.xml  服务器配置文件 和 web.xml  项目配置
    lib: 常用类库
    logs: 运行日志文件
    webapps:放置运行的项目
    work:放置jsp编译后的class文件
2.Tomcat的lib目录,存放的jar不仅能被tomcat访问,还能被在tomcat上发布的web应用访问。
   JavaWeb应用的lib目录下的jar只能被当前web应用访问。
3.打包web应用: jar  cvf e:\TestWeb.war *.*
   解包web应用:jar xvf e:\TestWeb.war *.*
4.Cookie:位于请求头或者响应头
   a.浏览器第一次访问服务器,没有cookie,在服务器第一次应答时会对浏览器发送一个cookie.
      Cookie mcookie=new Cookie("username","tom");
      res.addCookie(mcookie);
   b.setMaxAge(0) 指定浏览器删除cookie
      setMaxAge(-1) 指定浏览器不保存cookie
  c.setPath(path)和setDomain(domain)  控制cookie的读写范围
      cookie.setPath("/");    //整个tomcat服务器的应用都能读到
      cookie.setPath("/app/");  //只有app应用能读取到
      cookie.setDomain(" .cat.com");  //只有域名为 .cat.com的应用能访问到。
7.不同web应用通讯:Tomcat中<Context=false>表示该应用无法获得其他web应用的ServletContext对象
8.避免并发:为保证Servlet能同时相应多个客户的请求,通过为每个请求分配一个工作线程。或者同步代码
9.JSP指令:
   1.一个完整的JSP页面是由普通的模板元素(html)、注释元素、指令元素、 脚本元素  、动作元素构成。
   2.指令标记、JSP动作标记统称为  jsp标记   。
   3.JSP页面的程序片中可以插入 html 标记。

4.当JSP页面的一个客户线程在执行  synchronized 方法时,其他客户必须等待。

jsp在执行过程中经过(  翻译)阶段,由web容器将之转换成java源代码

jsp在执行过程中经过(编译)阶段,会将java源码转换成class文件( b  )

   特点:
   1.Servlet:优点:业务逻辑处理很方便,写java代码方便
                     缺点:页面表现麻烦
   2.jsp:优点:页面表现方便                        //动态网页技术,动态生成网页数据,而不是动态效果的网页
             缺点:业务逻辑处理麻烦,
      两者通常结合使用。
  为什么说jsp是Servlet?
   因为jsp页面被访问时会被tomcat编译生成对应的java文件,java文件对应的类继承org.apache.jasper.runtime.HttpJspBase类
   而HttpJspBase又继承于HttpServlet.
  Jsp的执行过程:
     1.客户端发送以 .jsp结尾的请求(url)
     2.服务器接收请求后,会进行拦截(tomcat的web.xml),调用JspServlet类,处理jsp文件,生成对应的java文件和class文件(work文件夹下)
     3.tomcat会调用生成好的class文件生成html代码,返回给客户端
  web.xml关于jsp文件配置
   <%@ 指令名 属性="值"  %>   常见指令:page  include  taglib   编译指令,通知Servlet引擎处理消息
    errorPage="error.jsp"          //只能处理运行时错误,不能处理编译时的错误
    web.xml错误处理:
       <error-page>
     <error-code>404</error-code>
     <location>/error404.jsp</location>

</error-page>

   <% page method="doPost"  %>
   <%@ include file="文件绝对URL或相对URL" %>   静态包含,目标可是HTML或JSP,但不能是Servlet
      静态导入:1.把多个页面合成一个页面(编译成一个页面),不能有相同的变量。
                          2.执行效率相对较高
                          3.通常用户没有java代码页面
                          4.耦合性相对较高
   <jsp:include page="目标的绝对URL或相对URL"/>  动态包含  HTML、JSP(目标响应结果会被加到源组件)或Servlet都可以
   无论是静态还是动态包含,源组件和目标组件都共享请求范围内的共享数据。
     动态导入:1.分别生成各自的java文件和class文件,互不影响,可以有相同的变量
                         2.执行效率相对较低
                         3.通常用在java代码较多的页面
                         4.耦合性相对较低
  不能同一个页面,两次forward,类似servlet
10.声明:
   <% ! declar;declar;...  %>
  <%! int a=10,b,c; String d="ww"; %>   声明全局变量:不建议使用,因为Servlet中不建议声明全局变量
11.代码段:
   <% %>
  <% a++; %>
12.表达式:
  <%=a++%>
13.注释: <%--aaaa--%>        直接不会被编译,其他的注释写在jsp中会被编译(如html注释  <!--aa--->)
14.隐含对象:
    四大作用域
     request:
     session:
     application:最大作用域,全局共享信息
     pageContext:作用域最小,只作用于当前的页面;但可以通过pageContext获取其他八个作用域
     out:向客户端发送数据的对象(如html页面代码)
     response:  jsp中不推荐使用
     config:getInitParameter()和getInitParamterValues()   获取servlet的配置信息,但不建议在jsp用
     page:
     exception:使用<% page isErrorPage='true'%>
   路径问题:
     服务器根路径:http://localhost:8080/      D:\MainSoftWare\tomcat7\apache-tomcat-7.0.72\webapps
     项目根路径:http://localhost:8080/Demo/       D:\MainSoftWare\tomcat7\apache-tomcat-7.0.72\webapps\Demo
     String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    <base href="<%=basePath%>">           //base:默认在本页面所有的超链接和路径前面加项目的根路径
    <a href="index.jsp">path</a>              //http://localhost:8080/Demo/index.jsp
      req.getRequestDispather("/").forward(req,resp);      //请求转发   "/"  代表项目根路径  http://localhost:8080/Demo/
     resp.sendRedirect("/");        //重定向      "/" 代表服务器根路径   http://localhost:8080/
    <url-pattern>/index.jsp</url-pattern>  //  "/"代表项目的根路径
    1.相对路径:不能改变文件的相对位置
     2.绝对路径:不能修改项目的名称(推荐使用绝对路径)
15.请求转发    动作指令:jsp:forward、jsp:param等只是运行时的动作
   <jsp:forward  page="目标的绝对URL或相对URL"/>  请求转发之后的代码不会继续执行
   特点:执行forward时,用户请求的地址没有发生改变,但是请求的参数、属性不丢失
16.异常页:
     <%@ page errorPage="errorpage.jsp" %>  应先声明为异常页<% pageisErrorPage="true" %>
17.预编译:
    http://localhost:8080/app/hello.jsp?jsp_precompile=true
18.JNDI(负责将对象和名字绑定,对象工厂负责生产出对象):
   JDBC2.0开始提供javax.sql.DataSource,负责建立与数据库的链接,在程序中访问数据时
   不必编写连接数据库的代码,可以直接从数据源中获取数据库连接。
    Context:服务端:bind(String str,Object obj);      将对象与一个名字绑定
                            lookup(String name);      返回指定名字绑定的对象
   在META-INF下配置context.xml:
   <Context reloadable="true">
  <Resource name="jdbc/bookdb" auth="Container" type="javax.sql.DataSource"
          maxActive="100" maxIdle="30" maxWait="10000"
          username="root"  password="123456"
          driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://localhost:3306/bookdb?autoReconnect=true"/>

</Context>

   并且在web.xml中配置:
   <web-app>
    <resource-ref>
          <description>MYSQLDB Connection</description>
          <res-ref-name>jdbc/bookdb</res-ref-name>
          <res-type>javax.sql.DataSource</res-type>
          <res-auth>Container</res-auth>
    </resource-ref>

</web-app>

   public BaseDao() throws Exception{
        //引入JNDI对象与名字绑定
        Context ctx=new InitialContext();
        if(null==ctx)
            throw new Exception("No Exception");
        ds=(DataSource) ctx.lookup("java:comp/env/jdbc/bookdb");

}

19.session会话:
  invalidate();   销毁当前的会话,Servlet容器释放HttpSession对象占用的资源
  cookie机制通常用于保存客户的状态信息,设置最大存活时间后,会保存到浏览器的硬盘,所以要求cookie的属性值必须是可序列化的
  Servlet容器创建新的HttpSession:
  a.一个浏览器进程第一次访问Web应用中支持会话中的任一个网页。
  b.当浏览器与web应用的一次会话已经被销毁后,浏览器进程再次访问web应用中的支持会话的任一个网页。
  JSP默认支持会话,HttpServlet默认不支持会话。
 response.encodeURL(url)   会在浏览器不支持会话的情况,使用URL支持会话。
 response.sendRedirect(response.encodeRedirectURL("mail.jsp"));  重定向时用
 Cookie:
  Cookie cookie=new Cookie("name","kkk");
  res.addCookie(cookie);
 cookie支持中文
 发送前先编码:
      java.net.URLEncoder.encode("书","utf-8");
  接收端解码:
     java.net.URLDecoder.decode(cookies[i].getValue(),"utf-8");
20.Tomcat会话管理:
   a.StandardManager:标准会话管理器。
   b.PersistentManager:更多会话管理功能。
   会话存储:
   FileStore:将HttpSession对象保存在一个文件中
   JDBCStore:将HttpSession对象保存在数据库的一张表中
21.会话监听:
 HttpSessionListener和HttpSessionAttributeListener,必须在web.xml中通过<listener>向Servlet容器注册。
23.EL表达式:
    优点:1.不用导包 2.简洁 3.如果参数没有传过来,则什么都不显示
    User里存Address对象
    EL表达式:$+{ }
       表达式获取参数信息
     <li><%=request.getParameter("uname") %></li>
     <li><%=request.getParameterValues("fav")[0] %></li>
     <li><%=request.getAttribute("realname") %></li>
     <li><%=((List<String>)request.getAttribute("list")).get(2) %></li>
     <li><%=((Map<String,String>)request.getAttribute("map")).get("CC") %> </li>
      <li><%=((User)request.getAttribute("user")).getAddress().getTown() %> </li>
     <li><%=((List<User>)request.getAttribute("userList")).get(2).getAddress().getTown() %> </li>
     <li><%=((Map<String,User>)request.getAttribute("userMap")).get("user3").getAddress().getTown() %> </li>
      EL获取请求参数信息
     <li>${param.uname }</li>
     <li>${paramValues.fav[0] }</li>             getParamter则需要param获取
     <li>${realname }</li>                              getAttribute直接获取属性
     <li>${list[2] }</li>
     <li>${map.CC }</li>
     <li>${user.address.town }</li>               address必须与User类中的address大小写一样
     <li>${userList[2].address.town }</li>
     <li>${userMap.user3.address.town }</li>
24.EL取值范围:
     1.el表达式取值默认从小到大取值(pageContext->request->session->application)
     2.pageScope: requestScope:sessionScope: applicationScope:
      导入fmt.tld文件
25. .和[]    访问一个bean属性或者Map entry        . 取值方便,[]功能强大
      ${user.name }    ${user["name"]}      ${user[name]}
      empty:用来对一个空变量值进行判断:null、一个空String、空Map、没有条目的Collection集合
      ${ empty name}
      +  作为算术符,加操作(但没有字符串相连的操作)
      ${1/0}   Infinity    ${ 1+"a"}  不能显示,结果为NaN      ${ 1+"1" }    2
26.JSTL: 替代在jsp中写java代码
       主要是get/set/remove    导入 <%@ taglib uri="http://java.sun.com/jsp/jstl/core  " prefix="s"%>
     1.<c:out value="${ name}"  default="zhansgan"> </c:out>
     2.<c:set var="name" value="kkk"  scope="session"></c:set>       //设置参数    ${ sessionScope.name }
     3.<c:remove var="name" >                ${sessionScope.name  }     //移除name就找不到值,默认移除全部
     4.<c:if test="${sex==1}">男</c:if>
     5.<c:choose>
            <c:when test="${sex==1}">男</c:when>
            <c:otherwise>其他</c:otherwise>
        </c:choose>
     6.<c:foreach  var="aa"  begin="1"  end="9"   step="3">           //类似java中的for
           ${aa}                                                                                          //每隔3个输出一次
        </c:foreach>
        <c:foreach  items="${list}" var="aa"  varStatus="vars" >
              ${aa}--${vars.first}--${vars.last}--${vars.index}                      //判断是否是list的第一个元素;index代表下标
        </c:foreach>
       <c:foreach items="${userList}"  var="aa">
              ${aa.name}--${aa.address.city}                 address存放于user里的另一个类
       </c:foreach>
Session:本质是一个哈希表,哈希表的key就是传递给浏览器的名为jessionid的Cookie值。
当一个值要保存到Session中,须有以下步骤:
(jessionid的Cookie值在浏览器关闭时会自动删除;或者将其MaxAge的值设为-1,也能达到浏览器关闭时自动删除目的)
   a.获取jsessionid的值,没有就调用request.getSession()生成
   b.得到session对象之后,通过setAttribute()往哈希表中写数据
   c.同时还可以通过getAttribute获取该属性值。
fail to load the jni shared library    由于jdk版本与eclipse位数版本不一致
Tomcat7路径:D:\MainSoftWare\tomcat7\apache-tomcat-7.0.72\webapps\ROOT
taglib definition not consistent with specification version  问题:http://www.ithao123.cn/content-37861.html
23.自定义标签: 继承SimpleTagSupport
    TLD:标签库定义
  taglib是根元素,一般包含三个元素:
      tlib-version:标签库实现的版本
      short-name:标签库短名
      uri:指定该标签库的唯一标识
  tag:包含下列子元素:
      name:标签的名称,jsp通过此名称来使用该标签
      tag-class:指定标签由哪个处理类来处理。
        body-content:指定标签体内容
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    <tlib-version>1.0</tlib-version>
    <short-name>SimpleTagLibrary</short-name>
    <uri>/jsp2-example-taglib.tld</uri>     //tld文件路径
    <tag>
       <name>MyFirstTLD</name>
       <tag-class>com.lzx.MyFirstTag</tag-class>
       <body-content>empty</body-content>
    </tag>
</taglib>
引用tld: <%@ taglib uri="/jsp2-example-taglib.tld" prefix="first" %>
                 <first:MyFirstTLD/>
24.定义带属性的标签:
   带属性需增加:<attribute>
                <name>ddd</name>
                <required>true</required>
                <fragment>true</fragment>
               </attribute>
来源:
https://blog.csdn.net/q2857864700/article/details/56676319