[TOC]

一 参考老师给的war包,创建相应的项目,并完成相应的测试,修改相应的内容,打上自己的标签,再导出war包。
已完成
二 上传相应的war包到相应的QQ目录下
已上传
三 小结
j2019001001_18_jspBasic.war
思考1. JSP页中的HTML代码,注释,脚本,表达式,定义分别是什么?它们的标志是什么?
html代码:

<html>
    <head>
        <title>简单使用JSP</title>
    </head>
    <body>

    </body>
</html>

JSP脚本:

<%
    out.println("First<br />");
    response.getWriter().println("Second<br />");
%>    

<jsp:scriptlet>
    String s = "HelloWorld";
    out.println(s);
</jsp:scriptlet>

JSP注释:

<%--这是JSP注释--%>

JSP指令:用来声明JSP页面的相关属性,例如编码方式、文档类型

<%@page contentType="text/html; UTF-8" pageEncoding="utf-8" isELIgnored="false" %>
<%@page language="java" contentType="text/html; charset=UTF-8"%>

page指令errorPage和isErrorPage
jsp出现了错误,通过page指令的errorPage属性跳转到error.jsp页面上:

<%@page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>

error.jsp页面要通过page指令的isErrorPage属性设置页面就是错误页面:

<%@page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
  <html>
    <head>
      <title>友好提示页面</title>
    </head>
    <body>
      服务器正忙着呢!
    </body>
  </html>

在web.xml文件中全局设置错误页,只要发生了404错误或者空指针异常的错误都会跳转到error.jsp页面上

<error-page>
  <error-code>404</error-code>
  <location>/error.jsp</location>
</error-page>

<error-page>
  <exception-type>java.lang.NullPointerException</exception-type>
  <location>/error.jsp</location>
</error-page>

思考2. JSP中的中文乱码是如何产生的,应该如何避免这类问题?
没有在JSP页面中设置页面显示的编码。消除页面乱码的解决方案:

<%@page contentType="text/html; UTF-8" pageEncoding="utf-8" isELIgnored="false" %>

思考3. 在JSP页中,如何使用javabean?

<jsp:useBean id="实例化对象的名称" class="类的全名" scope="保存范围"/>
<jsp:setProperty name="类名" property="属性名"/>
<jsp:getProperty name="类名" property="属性名"/>
  1. jsp:useBean

在JSP页面中查找JavaBean对象或者实例化JavaBean对象。
JavaBean需要又无参的构造函数,因为jsp:useBean指令在new对象的时候没有传递参数进去。

  1. jsp:setProperty

设置JavaBean属性

  1. jsp:getProperty

获取JavaBean属性
思考4. 在JSP页中,如何实现类似于servlet中的转发和包含?
静态包含:include指令(把文件的代码内容都包含进来,再编译)

  <%@include file="head.jsp" %>
  <%@include file="foot.jsp" %>

动态包含:include行为(先编译被包含的页面,再将页面的结果写入到包含的页面中)

<jsp:include page="head.jsp"/>
<jsp:include page="foot.jsp"/>

forward行为:

<head>
  <title>访问1.jsp就跳转到head.jsp</title>
</head>

// 传递参数
<jsp:forward page="head.jsp">
  <jsp:param name="username" value="zhongfucheng"/>
</jsp:forward>

思考5. 在JSP页中,向用户显示结果时,如何实现换行操作?
最后Java代码在转换后成为了html代码。

out.print("<br>");

思考6. 在JSP页中,pageContext对象有哪些作用域可供操作?

  1. pageContext获取8个内置对象

pageContext是内置对象中最重要的一个对象,代表JSP页面编译后的内容,也封装了对其他8大内置对象的引用,也就是说通过pageContext可以获取到其他的8个内置对象。

  1. pageContext作为域对象

pageContext作为域对象代表当前的JSP页面,也就是说pageContext域对象只在page范围内有效。但是pageContext对象重载了set、get、removeAttribute这三个方法。

  1. pageContext中定义了一个forward和两个include方法

new java.util.Date().toLocaleString()
根据本地时间把Date对象转换为字符串。
思考7. 使用Date对象时,需要注意什么?

j2019001001_19_jspDemo.war
思考1. 在jsp页中,如何实现对它页的引入 or 嵌入?
动态包含或者静态包含。
思考2. JSP页面如何使用CSS样式?

  1. 外部样式

    <link rel="stylesheet" type="text/css" href="<%=uiPath%>hwtt_ui/skins/<%=skinName%>/css/login.css" />
    
  2. 内部样式

     <style type="text/css">
         .loginBtn{
             display:block;
             cursor: pointer;
             height: 32px;
             margin-bottom: 1px;
             width: 100px;
         }
     </style>
    
  3. 内联样式

    <input type="text" name="authCode" style="vertical-align: middle" />
    

    思考3. JSP页面如何使用javascript脚本?
    1:在页面中直接嵌入JavaScript

    2:链接外部JavaScript

    思考4.在email目录下,邮箱的检测使用的后台javabean功能增强的方式来完成,如何解耦成独立的工具类来检测?
    10.1 思考,如何在前台直接用javascript脚本来完成检测?

    <script>
    function check(){
      var reg = new RegExp("^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$"); //正则表达式
      var obj = document.getElementById("searchForm"); //要验证的对象
      if(obj.value === ""){ //输入不能为空
        alert("输入不能为空!");
        return false;
      }else if(!reg.test(obj.value)){ //正则验证不通过,格式不对
        alert("验证不通过!");
        return false;
      }else{
        alert("通过!");
        return true;
      }
    }
    </script>
    

    10.2置于前台检测和置于后台检测,有何差别?
    后端校验可以防止接口被私自调用导致破坏数据库结构;避免有人模拟浏览器行为直接给服务器发请求。
    但前端校验便于用户纠正(快速反馈),并且减少服务器压力、节省流量(减少无意义的请求),主要对用户友好。各有优缺点。

思考5. boolean类型的属性,getter和setter有何变化?
除了传统的get、set写法,还可以用以下写法:

public boolean is<PropertyName>();
public void set<PropertyName>(boolean m);

对于上述的变化,你有何思考?
POJO中boolean类型的变量,都不要加is,否则部分框架解析会引起序列化错误。
比如boolean isSuccess 的属性,它的方法也是isSuccess,RPC框架在反向解析的时候,
会以为对应的属性名是success,导致属性获取不到,进而抛出异常。

思考6. 使用正则表达式有何优势?
1. 灵活性、逻辑性和功能性非常的强
2. 可以迅速地用极简单的方式达到字符串的复杂控制

思考7. int类型和Integer类型有何差别?
1. Integer 是 int 包装类,int 是八大基本数据类型之一(byte,char,short,int,long,float,double,boolean)
2. Integer 是类,默认值为null,int是基本数据类型,默认值为0;
3. Integer 表示的是对象,用一个引用指向这个对象,而int是基本数据类型,直接存储数值。
思考8. getter/setter方法,为操作数据提供了什么方便?

  • 这两个方法可以方便增加额外功能(比如验证)。
  • 内部存储和外部表现不同。
  • 可以保持外部接口不变的情况下,修改内部存储方式和逻辑。
  • 任意管理变量的生命周期和内存存储方式。
  • 提供一个debug接口。
  • 能够和模拟对象、序列化乃至WPF库等融合。
  • 允许继承者改变语义。
  • 可以将getter、setter用于lambda表达式。(大概即作为一个函数,参与函数传递和运算)
  • getter和setter可以有不同的访问级别。

j2019001001_20_jspELBasic.war
思考1. 从控制器过来就有数据,而直接访问employee.jsp就没有数据,为啥?
从控制器过来request携带参数可以在jsp页面展示,而直接访问jsp获取不到任何数据,只能展示模板。

思考2. 在有数据和没有数据的情况下,el表达式的表现如何?
如果获取到的数据为null,输出空白字符串, 如果有数据,就输出相应的值。

思考3. 使用el表达式时,有哪两种方式来获取相应的值?
${name}、${list[0]}
思考4. 在el表达式中的值,是一个对象吗? 是对象中的变量。
思考5. 如何直接用el表达式显示浏览器请求的头信息里的键值?
${header}、${header[“user-agent”]}、${headerValues[“accept-language”][0]}
j2019001001_21_jspELAndJavaBean.war
思考4. 在jsp页里,如何获取基路径,它是什么?
设置了基路径之后,在该页面设置的其他路径都会以基路径为基准。
示例:
<base href="http://localhost:8080//MYTest">,那你下面的href属性就会以你上面设的为基准,如:
<a href="http://localhost:8080//MYTest/xxx.htm"></a><br />可以写成:<a href="xxx.htm"></a>

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<base href="<%=basePath%>">

思考5. 在jsp页里,使用绝对路径有什么好处?
如果多个页面是基路径不同,在进行转发操作时,由于浏览器会根据当前请求的路径去找资源,而其他页面由于基路径不同,就会导致把相对路径拼接到当前路径之后,另一个页面的请求路径出错的问题,而直接使用绝对路径则不会产生这个问题。

思考6. 结合之前的servlet里的内容,思考,用servlet来做控制器处理请求和这里直接用jsp页来处理请求,有何异同?
区别:servlet处理请求进入doGet和doPost方法执行相应的代码,jsp处理请求跳转到另一个jsp页面。
相同:都有get和post方法。

思考7. 思考jsp页的优势是什么?但不便之处在哪里?
JSP将Java和HTML组合成一个扩展名为.jsp的文件,侧重于文件展示。
缺点:不好调试,与其他脚本语言的交互,写在一个代码文件里使可读性变差。

思考8. 页面的渲染【对最终用户呈现完整的面页】包括哪些动作?
1.解析HTML文件,创建DOM树
2.解析CSS,形成CSS对象模型
3.将CSS与DOM合并,构建渲染树(renderingtree)
4.布局和绘制

思考9. 在jsp中,使用javabean时,是如何实现自动装配的?它的先决条件是什么?
根据已提交表单中的数据,设置这个javaBean中相应的属性值。
先决条件:JavaBean属性的名称和表单对象的名称相同时才能够赋值。

<jsp:useBean id="user" class="cn.edu.cuit.bean.User" scope="page"></jsp:useBean>
<!-- 这里使用了自动装配属性 -->
<jsp:setProperty property="*" name="user"/>

j2019001001_22_jspELAndJSTLBasic.war
思考1. el是如何判空的?
${ empty 对象 } 返回结果为Boolean值
只要满足下面三个条件都返回true;

  1. 对象是否为null
  2. 字符串是否为””
  3. 集合长度是否为0
    empty " " ${empty " "}<br/>
    empty "" ${empty ""}<br/>
    empty " sometext " ${empty " sometext "}<br/>
    // 运行结果
    empty " " false
    empty "" true
    empty " sometext " false
    
    思考2. jstl的引入指令是什么?
    tablib指令引入需要的jstl标签。
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
    思考3. 比较el和jstl标签的差别
    区别:就是像HTML标签 还带冒号的就是JSTL
    带美元符号$和花括号的就是EL表达式。

EL表达式:
1: Scriptlet

<% ... %>

2: 声明元素

<%! ... %>

3: Java表达式

<%= ... %>

4: 指令元素

<%@ ... %>

5: EL表达式

${ ... }

6: 标准动作元素

<jsp:*** ... />

7: 非标准动作

<***:*** ... />

JSTL:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<c:out>     用于在JSP中显示数据,就像<%= ... >
<c:set>     用于保存数据
<c:remove>     用于删除数据
<c:catch>     用来处理产生错误的异常状况,并且将错误信息储存起来
<c:if>     与我们在一般程序中用的if一样
<c:choose>     本身只当做<c:when>和<c:otherwise>的父标签
<c:when>     <c:choose>的子标签,用来判断条件是否成立
<c:otherwise>     <c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行
<c:import>     检索一个绝对或相对 URL,然后将其内容暴露给页面
<c:forEach>     基础迭代标签,接受多种集合类型
<c:forTokens>     根据指定的分隔符来分隔内容并迭代输出
<c:param>     用来给包含或重定向的页面传递参数
<c:redirect>     重定向至一个新的URL.
<c:url>     使用可选的查询参数来创造一个URL

思考4. 使用jstl需要额外引入的包是什么?
jstl.jar和standard.jar
**
思考5. 使用jstl可以在界面上实现哪些逻辑,思考,如果是在html中,这些逻辑控制由什么来完成?
实现流程控制和迭代输出,如果在html中,使用html连接到servlet。

思考6. 动态java web project额外导入jar包的方法是什么?在哪里获取这些需要的jar包?
把额外导入的jar包copy到WEB-INF的lib目标下,网上下载。

j2019001001_23_jspJSTLDemo.war
思考1. 在jstl里的choose…when…otherwise标签一般什么场合下用?
if标签没有else的功能,如果需要类似于java中的if else流程就需要使用choose标签。
choose标签需要联合when和otherwise标签一起使用。

<c:choose>
      <c:when test="${param.name=='zhongfucheng'}">
          你好啊,zhongfucheng
      </c:when>
      <c:when test="${param.name=='ouzicheng'}">
          你好啊,ouzicheng
      </c:when>
      <c:otherwise>
          你是谁啊?别随便过来!
      </c:otherwise>
  </c:choose>

思考2. 用户退出,一般如何在技术处理?
使session失效,同时重定向到登陆页面。

<% session.invalidate(); %>
<c:redirect url="index.jsp"/>

思考3. 在jstl里,如何迭代处理列表或是数组里的数据?
使用循环标签forEach,相当于Java中的while和for。

遍历session属性中的List集合,items:即将要迭代的集合。var:当前迭代到的元素

<c:forEach  var="list" items="${list}" >
      ${list}<br>
</c:forEach>

遍历map集合:

<c:forEach  var="me" items="${map}" >
      ${me.key}  ${me.value}<br>
</c:forEach>

思考4. 在jstl里,forEach签和forTokens签的异同有哪些?
forTokens标签类似于String类的split()和for循环的一种集合。
它与forEach标签非常相似,都有begin、end、step、items、var、varStatus属性,不同的是forTokens标签的items属性里面是字符串,这个字符串会被delims属性的内容分割成多个字符串。

<c:forTokens items="zhongfucheng,ouzicheng,xiaoming,xiaohong" var="name" delims="," >
      ${name}
</c:forTokens>

思考5. 在jstl里,if签适合什么场合下使用?
JSTL提供了if标签完成分支语句的实现,根据传递过来的参数的不同显示不同的内容。

<%--如果带过来的名字是zhongfucheng,那么可以登陆--%>
  <c:if test="${param.name=='zhongfucheng'}">
      用户名:<input type="text" name="username"><br>
      密码:<input type="password" name="password"><br>
      <input type="submit" value="登陆">
  </c:if>

  <%--如果带过来的名字是ouzicheng,那么就是注册--%>
  <c:if test="${param.name=='ouzicheng'}">
      用户名:<input type="text" name="username"><br>
      密码:<input type="password" name="password"><br>
      <input type="submit" value="注册">
  </c:if>

思考6. 使用import可以包含jsp文件的哪些内容?
import标签的属性:

  1. url【指定要包含的路径,Internet所有的url都可以】
  2. context【访问同一个web容器的其他资源,以”/“开头】
  3. var【保存导入的文件的内容,以String类型存储】
  4. socpe【保存的范围,默认是page】
  5. charEncoding【字符编码】
  6. varReader【保存导入文件的内容,以Reader类型存储】

思考7. 使用jstl里的out签和使用el输出上,有何差别?

<c:out value="${name}" default="您要的数据找不着" escapeXml="true"/>

基本没差别,上面的代码实现的效果和EL表达式是一样的它出色的地方就多了两个属性,default和escapeXml属性。
如果我们用到这两个属性,我们就使用该标签,如果没有用到这两个属性就用EL表达式就可以了。

思考8. 在jsp里如何实现重定向跳转,跳转时如何带上参数?
redirect标签用于实现Redirect功能,带参数配合param标签使用。

<c:redirect url="2.jsp" >
  <c:param name="name" value="zhongfucheng">
  </c:param>
</c:redirect>

思考9. 在jstl里,set签设置的值的作用域是如何指定的?
设置scope属性。

思考10. 在jsp页面,如何自己向自己传参?
用EL表达式,jstl表达式取值。

j2019001001_24_jspELJSTLModel.war
思考1.有哪些控制器?ComputerHandle、FileHandle、TriangleHandle
思考2.有哪些javabean? Computer、FileMessage、Triangle
思考3.有哪些页面,为何有些用html,有些用jsp?使用html的页面不需要展示动态数据。