JSP笔记

作者: fanyank | 来源:发表于2017-02-27 22:21 被阅读32次

    title: JSP笔记
    date: 2017-02-24 21:51:49
    tags: JSP


    JSP&Servlet 笔记

    命名规则

    • 包名完全小写
    • 类名采用驼峰命名法
    • 方法名首字母小写

    文件位置

    • 一般所用包为:entity dao util web 这些包里全部为Java程序,位于src文件夹下。
    • web文件夹下主要存放和网页相关的东西
    • WEB-INF文件夹下可建一个lib文件夹,用来存放项目相关jar包
    • index.jsp单独放置在WEB-INF的直接目录下,其他文件位于另外所建views文件夹下。

    Servlet和JSP之间传值的两种方式

    1. 重定向跳转
      • 修改地址栏,在浏览器端工作
      • 传值只能依靠URL重写,且仅能是String
      • resp.sendRedirect(“/home.jsp?error=1”);
    2. 请求转发跳转
      • 地址栏不变,在服务器端工作
      • 依靠req.setAttibute()传值,值可以为任意类型
      • 缺点为会产生重复提交
    req.getRequestDispatcher("/WEB-INF/views/webjsp/list.jsp").forward(req,resp);
    

    两个Servlet之间的通信只能通过session,但可以通过session也可以间接地创建JSP和Servlet之间的通信

    • 使用session要在web.xml文件中配置session的存活时间
    //在web.xml中配置
    <web-app...>
            <servlet>
          ...
        </servlet>
            <session-config>
           <session-timeout>20</session-timeout>
        </session-config>
    </web-app>
    //也可以单独给某一个servlet中的seesion设置超时值,注意是以秒来计算
    session.setMaxInactiveInterval(20*60);
    

    配置上下文参数和servlet参数:

    • 上下文参数:
    //web.xml中配置文件
            <servlet>...</servlet>
            <context-param>
            <param-name>mainEmail</param-name>
            <param-value>fanyank@126.com</param-value>
        </context-param>
    //servlet中调用上下文参数
    getServletContext().getInitParameter("mainEmail");
    //或者...
    ServletContext context = getServletContext();
    context.getInitParameter("mainEmail");
    
    • servlet参数
    //web.xml中配置文件
    <servlet>
            <servlet-name>...</servlet-name>
            <servlet-class>...</servlet-class>
    
            <init-param>
                <param-name>adminEmail</param-name>
                <param-value>fanyank@126.com</param-value>
            </init-param>
    </servlet>
    //servlet中的调用
    getServletConfig.getInitParameter("adminEmail");
    //调用过程:
    //容器初始化一个servlet时,会为这个容器创建唯一的一个ServletConfig,容器从DD中读取初始化参数并把键值交给ServletConfig,再把ServletConfig传递给servlet中的init()方法。
    
    

    为防止出现错误类型为500的错误:

    if(isbn == null || "".equals(isbn)){
                resp.sendError(404);
            }
    

    将页面上请求的表单写入数据库时应采用UTF-8编码防止写入乱码的情况

    req.setCharacterEncoding("UTF-8");
    //如果通过URL传入中文,则需进行编码
    String tagTypeName = new String(req.getParameter("newTagTypeName").getBytes("ISO-8859-1"), "UTF-8");
    

    搜索功能应通过URL重写来传值

    删除功能需要二次确认,然后通过JS跳转到Servlet

    $(".del").click(function () {
    
                    if(confirm("确定要删除吗")) {
                        var id = $(this).attr("rel");
                        window.location.href = "/product/del?id=" + id;
                    }
    
                });
    

    JSTL 和 EL表达式

    // <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    //
    // <c:forEach items="${names}" var="item">
    //         <li>${item}</li>
    // </c:forEach>
    //
    // <c:choose>
    //         <c:when test="${name == 'Alex'}">
    //             <h1>Hello,Alex</h1>
    //         </c:when>
    //         <c:when test="${name == 'Tom'}">
    //             <h1>Hello,Tom</h1>
    //         </c:when>
    //         <c:otherwise>
    //             <h1>Hello,Other</h1>
    //         </c:otherwise>
    // </c:choose>
    //
    // <c:if test="${12 > 2}">
    //         <h1>Hehe</h1>
    // </c:if>
    // <h1> EL表达式  page->request->session->application </h1>
    //     <h1> ${name} </h1>
    //     <h1> ${user.id} </h1>
    //     <h1>${user.username}</h1>
    //     <h1>${user.niceName}</h1>
    //     <h1>${requestScope.name}</h1>
    //     <h1>${applicationScope.name}</h1>
    //     <h1>${1+1}</h1>
    //     <h1>${name == 'Alex'}</h1>
    //     <h1>${name eq 'Alex'}</h1>
    //     <h1>${12 >= 2}</h1>
    //     <h1>${empty name}</h1>
    //     <h1>${not empty name}</h1>
    

    JSP

    • JSP表达式:
      所有的scriptlet和表达式都放在服务方法(_jspService)中,也就是说在scriptlet中声明的变量总是局部变量

    • JSP声明:

      <% ! int count = 0; %>
      

      JSP声明总是在类中定义,即独立于服务方法之外,这样也就可以使用静态变量和静态方法了

    • JSP九大隐式对象

      1. application 对应servlet中 getServletContext()
      2. request 对应servlet中 request
      3. session 对应servlet中 request.getSession()
      4. pageContext 包含以上三个隐式对象
      5. out
      6. ServletConfig
      7. page
      8. response 对应servlet中 response
      9. exception
    • JSP指令(<%@ %>)

      1. page指令
      2. taglib指令
      3. include指令
    • JSP动作(<jsp:useBean>)

      <jsp:include page="nav.jsp">
             <jsp:param name="state" value="1"></jsp:param>
      </jsp:include>
      
    • EL表达式中的”.”运算符和”[]”运算符:

      1. 点运算符访问性质和映射值
      2. 中括号运算符若包含的是String直接量,这可以是一个
        • Map键
        • bean性质
        • List或数组中的索引
          如果不是String直接量,先找到该量映射的值,最终得到一个映射的String直接量
    • EL隐式对象

      1. pageScope
      2. requestScope
      3. sessionScope
      4. applicationScope
      5. param
      6. paramValues 请求参数的Map
      7. head
      8. headValue 请求头部的Map
      9. cookie
      10. initParam 上下文初始化参数
      11. pageContext
    • include指令和<jsp:include>标准动作

      1. 两者都对位置敏感
      2. include指令在转换时发生,<jsp:include>标准动作在运行时发生
      3. 各自语法格式
      //include指令
      <%@ include file="header.jsp"%>
      //<jsp:include标准动作>
      <jsp:include page="header.jsp"/>
      
    1. 如果需要对被包含的jsp文件内容进行定制,那么就只能使用jsp标准动作了
    //使用<jsp:param>定制包含内容
    // <jsp:include page="header.jsp">
    //        <jsp:param name="subTitle" value="This is value!" />
    // </jsp:include>
    //被包含的header.jsp
    <em>${param.subTitle}</em>
    //使用<c:import>可以达到同样的效果
    // <c:import url="header.jsp">
    //        <c:param name="subTitle" value="This is value" />
    // </c:import>
    

    动作中也可以使用EL表达式

    url中文传值乱码

    将请求值设为UTF-8编码

    String tagName = new String(req.getParameter("tagName").getBytes("ISO-8859-1"),"UTF-8");
    

    EL隐式对象

    • 作用域属性Map

      1. pageScope
      2. requestScope
      3. sessionScope
      4. applicationScope
    • 请求参数Map

      1. param
        关于该隐式对象的一个小应用
      //当前jsp页面中
      <jsp:include page="header.jsp">
          <jsp:param name="subTitle" value="This is this page subTitle">
      </jsp:inlude>
      //header.jsp中
      //接受传过来的param
      <p>${param.subTitle}</p>
      
      1. paramValues
    • 请求头部Map

      1. header
      2. headValue
    • 上下文初始化参数的Map(${initParam.mainEmail})

      1. initParam
    • 该隐式对象不是映射(Map),他是对pageContext对象的实际引用(JavaBean)

      1. pageContext
    • 其他的隐式对象

      1. cookie

    EL表达式示例,${person.name},就上式来说,点运算符左边可以是一个Map或一个Bean,点运算符右边可以是一个映射键或者Bean性质(${getName()}).

    建立自己的错误界面

    如果用户访问你的网站出现了一些错误,并且不希望访问你网站的用户看到你的栈跟踪记录,也不想让用户得到一个404的错误代码,那么就可以用一个优雅的方式去解决这些问题。
    DD中(web.xml) 中进行一下配置:

    <error-page>
        //根据HTTP状态声明错误页面
        <error-code>404</error-code>
        //根据抛出错误类型来声明错误页面
        <exception-type>java.lang.ArithmeticException</exception-type>
        <location>/notFound.jsp</location>
    </error-page>
    

    相关文章

      网友评论

        本文标题:JSP笔记

        本文链接:https://www.haomeiwen.com/subject/ggytgttx.html