JavaEE 技术规范 平台
servlet 缺点,为什么会出现jsp 技术?
因为Servlet 当初的设计目的是用来产生网页的程序,所以所有的页面必须在Servlet
中进行构造,这样做的效率在当今来说,真的很低下,所以对于Servlet 来说,它是很不利
于展现的,不过它很适合于对数据的处理,所以很适合于充当控制器来使用。因为Servlet
构建页面实在够差,所以后来SUN 推出了JSP 来一改Servlet 引入的尴尬。
jsp = html+java 片段+jsp 标签+javascript+css
JSP(Java Server Pages):在HTML 中嵌入java 脚本语言;由引用服务器中的JSP 引擎来编
译和执行嵌入的java 脚本语言命令;然后将生成的整个页面信息返回给客户端。
jsp 功能强大是因为可以与javabean 结合使用(即jsp 作前台,javabean 作后台
===>Model1)
jsp+javabean 的基础上再结合servlet(做控制),就会构成MVC 的开发模式
MVC 模式是目前软件公司通用的开发模式。
如何手工部署一个web 项目?
WebRoot 项目名
|-WEB-INF
|-web.xml 部署文件
|-classes .class
|-lib *.jar
|-jsp
|-js
|-css
|-index.jsp
虚拟路径配置
<Context path="/hello" docBase="D:\webSite"/>
path="/hello" url
docBase="D:\webSite" 项目路径
JSP 页面的元素包括:
静态内容:HTML 静态文本
(一)指令元素: 以"<%@ "开始,以"%>"结束,用于从jsp 发送一个信息到容器,
如设置文字编码,引入包等
如:
设置MIME 类型<%@ page contentType="text/html;charset=gbk" %>
ps:MIME 类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩
展名文 件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客
户端自 定 义的文件名,以及一些媒体文件打开方式。
导入所需要的包<%@ page import="java.util.*,java.io.*"%>
包含某个文件 <%@ include file="filename" %>
<%@ tagilb url="" prefix="" %> jstlJSP (标准标记库 JSP Standard Tag
Library)
(二)脚本元素:在一定程度上可以理解就是java 的片段
1、脚本: <% java 代码 %> 局部变量
2、表达式: <%=java 表达式 %> 输出变量 表达式
3、声明: <%! 变量、方法%> 全局变量
(三)动作元素:
<jsp:include page="filename" />
<jsp:forward page=""/>
===>request.getRequestDispatcher("xxx").forward(request,response); forward
(服务器端跳转) redirect(客户端跳转)
<jsp:flugin >
<jsp:usebean id="" class=""/>class 值指明用到的哪个bean,id 是bean 的一个实例,
相当于指定对象名
<jsp:setProperty name="" property="" value="" />name 表示某一个对象名,
property 表示哪个属 性,value 是具体的值,相当于调用了name .setProperty(value)
这个方法
<jsp:getProperty name="" property="" />相当于调用name.getProprty();
其中scope 四大属性范围:
1 page: 当前页面(默认)
2 request 一次请求
3 session 一次会话
4 application web 应用程序
用法一:
<jsp:include page=""/>
用法二:
<jsp:include page="">
<jsp:param name="" value=""/>
</jsp:include>
<jsp:include page=""/> 与<%@ include file="" %>有何区别?
答:{ ~前者是指令元素、后者是行为元素。<%@ include file=” ”%>,jsp 的include
指令元素读入指定页面的内容。并把这些内容和原来的页面融合到一起。(这个过程是在翻
译阶段:也就是jsp 被转化成servlet 的阶段进行的。jsp 页面是把include 指令元素所指定
的页面的实际内容(也就是代码段)加入到引入它的jsp 页面中,合成一个文件后被jsp 容器
将它转化成servlet。可以看到这时会产生一个临时class 文件和一个java 文件。
~主要有两个方面的不同;
一:执行时间上:
<%@ include file=”relativeURI”%> 是在翻译阶段执行
<jsp:include page=”relativeURI” flush=”true” /> 在请求处理阶段执行.
二:引入内容的不同:
<%@ include file=”relativeURI”%>
引入静态文本(html,jsp),在JSP 页面被转化成servlet 之前和它融和到一起.
<jsp:include page=”relativeURI” flush=”true” />引入执行页面或servlet 所生成
的应答文本.
另外在两种用法中file 和page 属性都被解释为一个相对的URI.如果它以斜杠开头,那么它
就是一个环境相关的路径.将根据赋给应用程序的URI 的前缀进行解释,如果它不是以斜杠开
头,那么就是页面相关的路径,就根据引入这个文件的页面所在的路径进行解释.更多有关
URL 是如何解释的请参考相关资料或书籍. }
注释:
<!- - html 中的注释,客户端可以看到源代码 - ->
<%- - jsp 中的注释,客户端不可以看到源代码 - -%>
JSP 脚本中使用的注释:
<% //单行注释 %>
<% /*多行注释*/ %>
总结:只用html 的注释在客户端是看得到的
JSP 执行过程:(翻译-->编译-->执行)
WEB 容器处理JSP 文件请求需要经过3 个阶段:
1 、翻译阶段: JSP 文件会被WEB 容器中的JSP 引擎转换成JAVA 源码
\Tomcat6.0\work\Catalina\localhost\hello\org\apache\jsp\xxx.java
2、编译阶段:Java 源码会被编译成可执行的字节码.class
3、执行阶段:容器接受了客户端的请求后,执行编译成字节码的JSP 文件;处理请求后,
容器把生成的页面反馈给用户端进行显示
第一次请求之后,WEB 容器可以重用已经编译好的字节码文件。就不用再翻译、编译。
注意:如果对JSP 文件进行了修改,WEB 容器会重新对JSP 文件进行翻译和编译。
传值方式:
方式1:
<a href="4.jsp?a=1&b=2" >xx.jsp</a>
String s=request.getParameter("a");
String d=request.getParameter("b");
方式2:
<jsp:forward page="xx.jsp">
<jsp:param name="stuName" value="lishiming"/>
</jsp:forward>
方式3:
form 表单
JSP 的内置对象:
JSP 内置对象是 Web 容器创建的一组对象
JSP 内置对象是可以直接在JSP 页面使用的对象 ,无需使用“new”获取实例
JSP 内置对象的名称是 JSP 的保留字
九大内置对象:
out==============>JspWriter 向客户端输出数据,字节流
pageContext=========>PageContext 代表jsp 页面的上下文
request============>HttpServletRequest 接受客户端的请求
response===========>HttpServletResponse 响应
session============>HttpSession 用于保存用户的信息,跟踪用户的行为
application========>ServletContext 多个用户共享该对象,可以做计数器
this.getServletContext().setAttribute(name,value);
--------------------------------------------------------------------------------
config============>ServletConfig 代表jsp 对应的servlet 的配置,
可以得到web.xml 中的参数
page=============>Object 代表jsp 这个实例本身(使用较少)
exception==========>Throwable 代表运行时的一个异常
out 对象用于向客户端输出数据
out 对象常用方法:
print():在页面中打印出字符串信息<% out.print("hello world"); %>
out.println()与<%= %> 区别?
发现使用表达式输出(<%=%>)明显要比使用out.println()输出更好。所以在JSP
的开发页面中绝 对不能出现任何的out.println()语句。
request 对象主要用于处理客户端请求,方法有:
String getParameter(String name) 根据页面表单组件名称获取页面提交数
据
String[ ] getParameterValues (String name) 获取一个页面表单组件对应多个值时的
用户的请求数据
void setCharacterEncoding (String charset) 指定每个请求的编码 在调用
request.getParameter()之前进行设定,可以解决中文乱码问题
request.getRequestDispatcher(String path) 返回一个
javax.servlet.RequestDispatcher 对象,该对象的forward 方法用于转发请求
request.setAttribute("key",value);
Object request.getAttribute("key");
get: URL 不安全
http://localhost:8080/webLesson1/7.jsp?uname=aa&upass=bb&sex=man&fav=sp
ort&fav=music
post: http
response 对象用于响应客户请求并向客户端输出信息。
response 对象常用的方法:
response.setHeader("refresh","1");//每隔1 秒刷新一次
response.setHeader("refresh","2;url=xxx.jsp")
等同于:
<meta http-equiv="refresh" content="2;url=xxx.jsp">
定时跳转后,页面的地址就被改变了,所以跳转称为客户端跳转。
但是如果有些页面中是需要跳转的话,将其声明为动态页则肯定执行速度不如静态页快,那
么此时就可以使用第二种设置头信息的方式完成
response.sendRedirect(String location);将请求重新定位到一个不同的URL 客户端跳转
response.addCookie(cc);
一个会话就是浏览器与服务器之间的一次通话,它包含浏览器与服务器之间的多次请求、响
应过程
session 是JSP 内置对象,与浏览器一一对应,允许用户存储和提取会话状态的信息,浏览
器关闭,本次会话结束
重新开启一个浏览器,相当于重新创建了一个session 对象。
session 对象用来存储有关用户会话的所有信息
session 对象常用方法:
void setAttribute(String key, Object value):以键/值的方式,将一个对象的值存放到
session 中
session.setAttribute("name","zhangsan");
Object getAttribute(String key):根据名称去获取session 中存放对象的值
String name = (String) session.getAttribute("name");
session.getId(); 得到session 的ID
session.isNew(); 判断该session 是否是新的
session.Invalidate(); 销毁session
application 类似于系统的“全局变量”,用于实现用户之间的数据共享
application 对象的常用方法:
void setAttribute(String key, Object value):以键/值的方式,将一个对象的值存放到
application 中
Object getAttribute(String key):根据键去获取application 中存放对象的值
aaplication.getRealpath("/"); 得到项目的路径
在JavaEE 的开发中有几个重要的开发模式:
1.Model1 模式 2.Model2 模式 3.MVC 模式
Model1 模式
Model1 的基础是jsp 文件,它由一些相互独立的jsp 文件,和一些java Class 组成(它不
是必须的),这些jsp 从HTTP Request 中获得
所需的数据,处理业务逻辑,然后将结果通过Response 返回浏览器端。
可分为两类:
1.model1(纯jsp 技术,不带任何java class)
2.jsp+java class(java class 也就是我们所指的javabean 业务逻辑)
缺点:
1、表现层和业务逻辑层混合在一起
2、在开发过程中,不利于多人的协同开发
3、不利于后期的维护
优点:
1、简单、开发速度较快
2、比较适合开发小的项目
MVC 模式:强制性的使应用程序的输入、处理、输出分开。
M:Model 模型层 由java class 来做,也可以是javabean、ejb 等
V:View 视图层 由jsp 来做
C:Controller 控制层 由servlet 来做
Mvc 模式的处理过程:
首先控制器接受用户的请求,并决定调用哪个模型来进行处理,然后模型用业务逻辑来处理
用户的请求并返回数据,
最后控制器用相应的视图显示模型返回数据,并通过浏览器呈现给用户。
MVC 是优秀的设计思想,但是也存在缺点:
1、工作量增加了
2、不使用小型项目
3、调试应用程序难度加大
当数据库中出现中文时,乱码问题的解决:
方法:
1. 重新编码: new
String(request.getParameter("uname").getBytes("iso-8859-1"),"gbk");
2、使用过滤器来解决
3、通过配置文件server.xml(不太稳定):在Connector 元素中增加属性URIEcoding="gbk",
表示客户端请求传来的值均以gbk 的标准来编码 <Connector port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEcoding="gbk" />
GBK 是GB2312的后续标准,添加了更多的汉字和特殊符号,GBK还是现如今中文Windows
操作系统的系统默认编码
EL 表达式
思考:JSP 标准动作的局限:
1、一般是操作JavaBean 的属性
2、JavaBean 的属性只能为基本数据类型
3、不能进行逻辑操作
如何解决这个问题?
什么是EL :
EL 即Expression Language(表达式语言)
EL 的功能:
与<jsp:getProperty />类似 简化<jsp:getProperty />
EL 的语法:
${ EL exprission }
${ bean.name } 或 ${ bean['name'] }
当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要用[ ]。
例如: ${user.My-Name}应当改为${user["My-Name"] }
如果要动态取值时,就可以用[ ]来做,而“.“无法做到动态取值。
例如: ${sessionScope.user[data]}中data 是一个变量
没有指定哪个范围的变量,所以搜索的顺序:
page requset session application
最终都找不着返回null
EL 内置对象:
pageScope requestScope sessionScope applicationScope
pageContext param paramValues(checkbox)
pageContext 取得其他有关用户要求或页面的详细信息。
${pageContext.request.queryString} 取得请求的参数字符串
${pageContext.request.requestURL} 取得请求的URL,但不包括请求之参
数字符串
${pageContext.request.contextPath} 服务的web application 的名称
${pageContext.request.method} 取得HTTP 的方法(GET、POST)
${pageContext.request.protocol} 取得使用的协议(HTTP/1.1、
HTTP/1.0)
${pageContext.request.remoteUser} 取得用户名称
${pageContext.request.remoteAddr } 取得用户的IP 地址
${pageContext.session.new} 判断session 是否为新的
${pageContext.session.id} 取得session 的ID
${pageContext.servletContext.serverInfo} 取得主机端的服务信息
注意 <%@ page isELIgnored="true" %> 表示是否禁用EL 语言,TRUE 表示禁止.FALSE
表示不禁止.JSP2.0 中默认的启用EL 语言。
自动类型转换
JSTL
<c:forEach >