JSP笔记


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>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • jsp概述 jsp全称是 Java Server Page,它和servlet技术一样,都是SUN公司定义的一种用...
    持续进步者阅读 609评论 0 2
  • JSP 基本结构JSP 页面组成:模板文本(HTML,XML,纯文本),JSP 元素;JSP 元素:脚本元素,指令...
    jslancer阅读 819评论 0 11
  • 1.什么是JSP (1)jsp全称是Java Server Pages,它和Servlet技术一样都是sun公司定...
    yjaal阅读 3,620评论 5 99
  • 1.学习内容 JSP技术入门和常用指令 JSP的内置对象&标签介绍 EL表达式&EL的内置对象 2.JSP技术入门...
    WendyVIV阅读 2,111评论 1 18
  • 这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答...
    杂货铺老板阅读 1,390评论 0 10