一 参考老师给的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和isErrorPagejsp出现了错误,通过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="属性名"/>
- jsp:useBean
在JSP页面中查找JavaBean对象或者实例化JavaBean对象。
JavaBean需要又无参的构造函数,因为jsp:useBean指令在new对象的时候没有传递参数进去。
- jsp:setProperty
设置JavaBean属性
- 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对象有哪些作用域可供操作?
- pageContext获取8个内置对象
pageContext是内置对象中最重要的一个对象,代表JSP页面编译后的内容,也封装了对其他8大内置对象的引用,也就是说通过pageContext可以获取到其他的8个内置对象。
- pageContext作为域对象
pageContext作为域对象代表当前的JSP页面,也就是说pageContext域对象只在page范围内有效。但是pageContext对象重载了set、get、removeAttribute这三个方法。
- pageContext中定义了一个forward和两个include方法
new java.util.Date().toLocaleString()
根据本地时间把Date对象转换为字符串。
思考7. 使用Date对象时,需要注意什么?
j2019001001_19_jspDemo.war
思考1. 在jsp页中,如何实现对它页的引入 or 嵌入?
动态包含或者静态包含。
思考2. JSP页面如何使用CSS样式?
外部样式
<link rel="stylesheet" type="text/css" href="<%=uiPath%>hwtt_ui/skins/<%=skinName%>/css/login.css" />内部样式
<style type="text/css"> .loginBtn{ display:block; cursor: pointer; height: 32px; margin-bottom: 1px; width: 100px; } </style>内联样式
<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;
- 对象是否为null
- 字符串是否为””
- 集合长度是否为0
思考2. jstl的引入指令是什么?empty " " ${empty " "}<br/> empty "" ${empty ""}<br/> empty " sometext " ${empty " sometext "}<br/> // 运行结果 empty " " false empty "" true empty " sometext " false
tablib指令引入需要的jstl标签。
思考3. 比较el和jstl标签的差别<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
区别:就是像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标签的属性:
- url【指定要包含的路径,Internet所有的url都可以】
- context【访问同一个web容器的其他资源,以”/“开头】
- var【保存导入的文件的内容,以String类型存储】
- socpe【保存的范围,默认是page】
- charEncoding【字符编码】
- 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的页面不需要展示动态数据。
