JSP与tomcat学习

部署自己的项目: https://zhidao.baidu.com/question/511288865.html
配置页面:http://jingyan.baidu.com/article/90bc8fc864699af653640cf7.html
下载页面: http://hsk.oray.com/download/#type=windows|internet
已经部署花生壳的应用: http://linzx2016.qicp.io/MyBookStore/mybookstore.jsp

设置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中表示该应用无法获得其他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>404error-code>
     <location>/error404.jsplocation>
    error-page>

   <% page method="doPost"  %>
   <%@ include file="文件绝对URL或相对URL" %>   静态包含,目标可是HTML或JSP,但不能是Servlet
      静态导入:1.把多个页面合成一个页面(编译成一个页面),不能有相同的变量。
                          2.执行效率相对较高
                          3.通常用户没有java代码页面
                          4.耦合性相对较高
     动态包含  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注释  )
  
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:默认在本页面所有的超链接和路径前面加项目的根路径
    path              //http://localhost:8080/Demo/index.jsp
       req.getRequestDispather("/").forward(req,resp);      //请求转发   "/"  代表项目根路径   http://localhost:8080/Demo/
     resp.sendRedirect("/");        //重定向      "/" 代表服务器根路径   http://localhost:8080/
    /index.jsp  //  "/"代表项目的根路径

    1.相对路径:不能改变文件的相对位置 
       
     2.绝对路径:不能修改项目的名称(推荐使用绝对路径)
    
15.请求转发    动作指令:jsp:forward、jsp:param等只是运行时的动作
     请求转发之后的代码不会继续执行
   特点:执行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 Connectiondescription>
           < res-ref-name > jdbc/ bookdb res-ref-name>
          <res-type>javax.sql.DataSourceres-type>
          <res-auth>Containerres-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中通过向Servlet容器注册。

23.EL表达式:
    优点:1.不用导包 2.简洁 3.如果参数没有传过来,则什么都不显示
    User里存Address对象     
    EL表达式:$+{ }
       表达式获取参数信息
    
  • <%=request.getParameter("uname") %>
  •     
  • <%=request. getParameterValues("fav")[0] %>
  •     
  • <%=request. getAttribute("realname") %>
  •     
  • <%=((List)request.getAttribute("list")).get(2) %>
  •     
  • <%=((Map)request.getAttribute("map")).get("CC") %>
  •      
  • <%=((User)request.getAttribute ("user")).getAddress().getTown() %>
  •     
  • <%=((List)request.getAttribute("userList")).get(2).getAddress().getTown() %>
  •     
  • <%=((Map)request.getAttribute("userMap")).get("user3").getAddress().getTown() %>
  •     
          EL获取请求参数信息
        
  • ${param.uname }
  •     
  • ${ paramValues.fav[0] }
  •             getParamter则需要param获取
        
  • ${realname }
  •                              getAttribute直接获取属性
        
  • ${list[2] }
  •     
  • ${map.CC }
  •     
  • ${ user.address.town }
  •               address必须与User类中的address大小写一样
        
  • ${userList[2].address.town }
  •     
  • ${userMap.user3.address.town }

  • 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.default="zhansgan">
         2.name" value="kkk"  scope="session">       //设置参数    ${ sessionScope. name }
         3.                ${sessionScope.name  }     //移除name就找不到值,默认移除全部  
         4.
         5.
                :when test="${sex==1}">男:when>
                其他
           
         6.step="3">           //类似java中的for
               ${aa}                                                                                          //每隔3个输出一次
           
            vars" >
                  ${aa}--${ vars.first}--${vars.last}--${vars. index}                      //判断是否是list的第一个元素; index代表下标
           
           
                  ${aa.name}--${aa. address.city}                 address存放于user里的另一个类
           

    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位数版本不一致
    http://jingyan.baidu.com/article/9113f81b0607e42b3214c794.html
    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.0tlib-version>
        <short-name>SimpleTagLibraryshort-name>
         <uri> /jsp2-example-taglib.tld uri>      //tld文件路径
        <tag>
           <name>MyFirstTLDname>
           <tag-class>com.lzx.MyFirstTagtag-class>
           <body-content>emptybody-content>
        tag>
    taglib>
    引用tld: <%@   taglib   uri ="/jsp2-example-taglib.tld"  prefix = " first "   %>  
                      < first :MyFirstTLD />
    24.定义带属性的标签:
       带属性需增加:
                    ddd
                    true
                    true
                   

    你可能感兴趣的:(javaweb)