(一)项目描述
项目名称 |
所用知识点 |
实验效果 |
Lab 09 |
javaBean的使用,同页面的值获取,不同页面传值的方法,EL表达式,JSTL的基本用法 |
getInfoPage页面中,能通过EL表达式直接与java类交互,输出相应结果。 easyJSTL页面中,实现了通过JSTL标签,进行简单输出、比较数字大小、使用Empty运算符、获取Exception信息、进行不同域的信息设置(由此可跨页面传值)、查看浏览器信息等功能。 |
Lab 10 |
javaBean的使用,过滤器,css文件的设置,jsp中类库的调用,EL表达式,javascript |
register页面,只要输入信息合法,就能注册用户。 login页面,能用已经注册过的用户名和及匹配的密码登录并进入欢迎页。 welcome页面展示出欢迎信息,并且列表说明已经注册的用户队列。 |
Lab 11 |
javaBean的使用,同页面的值获取,部分域的变量设置,Servlet |
easyChange页面,能对输入的明文进行简单的加密。 guessNumber页面,能猜测答案数字的大小,能设置答案数字,默认猜测机会为5次。重设答案数字能恢复最大猜测机会。猜测过程中伴有提示。 |
(二)错误
【1】
①错误描述:
严重: Servlet.service() for servlet [jsp] in context with path [/j2017051046_09_jspELAndJST] threw exception [The absolute uri: [http://java.sun.com/jsp/jstl/core] cannot be resolved in either web.xml or the jar files deployed with this application] with root cause
org.apache.jasper.JasperException: The absolute uri: [http://java.sun.com/jsp/jstl/core] cannot be resolved in either web.xml or the jar files deployed with this application
②问题分析:错误提示上有表示是core代码并未匹配到。xml文件与之前项目无甚差别,主要应该在lib库中。
③问题解决:将一些jar包放入lib库中。如图:
【2】
①错误描述:Type Exception Report
Message An exception occurred processing [/getInfoPage.jsp] at line [71]
Description The server encountered an unexpected condition that prevented it from fulfilling the request.
Stacktrace:] with root cause
javax.el.MethodNotFoundException: Method not found: class myBeans.User.getName()
at javax.el.Util.findWrapper(Util.java:368)
②问题分析:先检查User类中是否有此方法,再与老师的代码比对,
③问题解决:检查User类中确实存在此方法,将此类暂时替换成老师的类,发现能成功运行,说明不是路径问题、不是jsp页面问题。对比代码发现,自己的类成员是private,而set、get方法并未声明为public,导致jsp没有权限访问类方法。
④配图:
【3】①错误描述:使用EL表达式时,发现${user.getName()}使用失败。
②问题分析:首先明确有这个类、有这个类方法、并且类方法是public,那为什么呢?代码明明很有逻辑的感觉。百度查关键字“EL获取成员变量失败”,但这样的关键字直接导致寻找方向错误,趁还在上实验,咨询老师。
③问题解决:将${user.getName()}变成${user.name}。
④经验:EL表达式${user.getName()}中的user是直接获取成员的,其信息已经在页面中获取了,直接用前面的get、set方法。而如果我要使用user.getName(),就可以用<% user.getName()%>,而这里面的user是对象。
【4】
①错误描述:中文输入,打印出乱码。
②问题分析:先检查编码问题,发现都是UTF-8,再联系到页面格式问题,最后百度时候发现是EL表达式的中文问题。
③问题解决:先将页面代码检查一遍,在加上<% request.setCharacterEncoding("utf-8"); %>将EL表达式中文显示乱码解决。
【5】
①错误描述:语法正确,却出现:
②问题分析:确定语法没错。先剪切再复制。
③问题解决:其实只是编辑器慢,ctrl+s保存下,就没有红线了。如图:
(三)知识点总结
1、jsp:setProperty用法
|
|
|
|
使用
2、EL表达式
EL表达式语法结构:${ expression} ,其采用“.”或者“[]”两种方式来存储数据,当表达式中存在除了字母或者数字之外的特殊符号时,必须用“[]”。
在页面使用中,我们可以取值的方法中<% %>,${ }有等价关系,如表。
<%=request.getParameter("userName")%> |
${param.userName}; |
<%=request.getAttrbute(userList)%> |
${requestScope.userList}; |
3、JavaBean传值的形式
任何数据类型封装在javaBean中,我们在属性中定义需要传递的参数,然后加入get和set方法就可以了。但是在实验中,发现get、set方法一定需要public的范围,否则网页没有权限访问。
4、JSP九大隐式对象
JSP中叫法 |
Servlet中叫法 |
request |
HttpServletRequest |
response |
HttpServletResponse |
session |
HttpSession |
application |
ServletContext |
config |
ServletConfig |
out |
JspWriter |
exception |
特殊情况下使用 |
page |
this 本jsp页面 |
pageContext |
无 |
5、jsp:setProperty
property = "*"表示所有名字和Bean属性名字匹配的请求参数都将被传递给相应的属性set方法。
6、DOCTYPE
DOCTYPE(Document Type),文档类型,一个DOCTYPE是一种标准通用标记语言的文档类型声明,它的目的是要告诉标准通用标记语言解析器,它应该用什么样的文档类型定义(DTD)来解析文档。只有确定了一个正确的文档类型,超文本或可扩展超文本中的标签和层叠样式表才能生效,甚至对JavaScript都会有所影响
而此项目中:。该 DTD 包含所有 HTML 元素和属性,包括展示性的和弃用的元素(比如 font)。不允许框架集(Framesets)。
7、中文乱码
EL表达式中文显示乱码解决方法:<% request.setCharacterEncoding("utf-8"); %>
8、listener总结
实验中我使用listener主要是:我曾经在servlet中将listener里将seesion对象添加的代码做了,嫌弃listener多余继而将其删除。却发现创建session的代码在listener中,没有listener我根本就没创建session,何谈添加seesion中变量呢? 如下是我搜集到的资料:
可以监听的事件 |
为何使用监听器? |
特殊对象(Request、Session、ServletContext对象)的创建和销毁 |
JavaEE的很多组件,其创建和销毁有自己的生命周期,不由开发者控制 |
特殊对象中存入了值、修改值、删除值 |
开发者有时需要在一个特定的事件发生后,指定自定义的逻辑 |
其他 |
由于很多类都不是开发者提供的,开发者无法在类中添加自己的代码 |
|
JavaEE提供了对应的监听器,监听具体的事件,开发者可以提供监听器的实现类,添加具体事件的处理逻辑 |
|
由服务器保证,一旦事件发生,开发者添加的处理逻辑可以被执行 |
(四)心得体会
郑老师调动的十分浓烈的学习氛围,让我深切感受学无止境,也十分珍惜这几次写文档有反馈的机会。言归正传,下面讲述实验心得。
文档方面。编写文档是为了归纳整理实验收获,方便以后查看。分块描述方便自己查阅时缩小范围,节约时间。使用表格会使知识点清晰,并且帮助自己归纳总结。
在实验中,自己浪费很多时间在重构上。这说明自己在写项目之前只有一个大概的方向,没有明确的构思。将项目推翻重写说明自己有优化代码的心思,值得鼓励,但是以后自己应该在写代码之前完成以下步骤:①认真阅读所有老师的相关参考资料。②归纳项目需求,最好简略写下需要使用的知识点。③建立包含所有知识点的简单页面逻辑设计。
实验中我对前期项目进行代码复用(例如过滤器之类),反而发现自己对之前实验并没有完全吸收(例如listener的具体作用)。这是由于上一个项目关于listener,我是直接复制老师代码的,并且只是大概了解了情况之后修改了而已。以后除了前端的界面布局,不允许自己这样直接使用别人的代码。
之前的实验中,我为了在导航页中显示servlet类,故意将各种情况都写入项目中,保证项目的健壮性。现在换了一个思路:servlet之类的东西在MVC里是C,完全不需要展示给用户。
以上是自己这次实验的心得,对未来自己,我的展望是:做一个对项目架构有能力的程序员!从每次的小项目开始认真设计框架、填充代码逻辑。