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
此条目发表在jsp分类目录。将固定链接加入收藏夹。