JSP编程2

关于Servlet与JSP的比较:

In short: servlets should be used if you have more Java than HTML and JSP should be used if you have more HTML than Java.

It is very common to combine servlets and JSP so that the initial request gets sent to a servlet which does some Java work and then forwards it to a JSP which actually makes the HTML output.

  • In MVC, jsp act as a view and servlet act as a controller.
  • The advantage of JSP programming over servlets is that we can build custom tags(自定义标签) which can directly call Java beans. There is no such facility in servlets.

jsp文件与Servlet文件调试的不同

jsp文件是运行时编译的,所以修改后无需重新部署,修改就可以应用。而Servlet文件则不同

.jsp文件在被部署到服务器后,直到有对该页面的第一次请求,服务器才会把该jsp文件转译为java文件(则俗称的Servlet),并编译得到class文件来运行。当JSP网页在执行时,JSP Container会做检查工作,如果发现JSP网页有更新修改时,JSP Container才会再次编译JSP成Servlet; 如果JSP没有更新时,就直接执行前面所产生的Servlet。


A.jsp文件转译成A_jsp.java后变的复杂(与自己编写的Servlet(MyServlet)相比)的原因


1.服务器对httpServlet又进行了一层封装(httpJspBase),所以A_jsp.java与MyServlet不是同一个Servlet(至少不是同一个类,虽然是继承关系)


2.对于同一种行为(forward,include等等)A_jsp.java的写法和MyServlet的写法有可能不同:

(A.jsp里的java程序段的写法和MyServlet的区别只在于MyServlet需要通过request获得内置对象,而这部分在转译时服务器帮做了 所不用)

虽然我们并不需要关心(去记)A_jsp.java的写法,但通过写法才能了解服务器是如何处理这种行为的。


3.A_jsp.java里的内置对象的获取通过ServletContext获得,而MyServlet一般是通过request和respons获得



ServletContext(context:语境; 上下文; 背景; 环境;)

里面封装了一个Servlet的request和reponse,也提供了各种内置对象的获得方法





有了某个行为的写法,我们就知道了参与完成这个行为的类和方法。

既然是服务器的行为,你会发现大部分这些类和方法都来自服务器的类库


服务器各种行为的详解:

1.指令<%@

指令是编译期间执行的代码,常用的有:page、include、taglib。语法是<%@page ... %>。
page用法:导入包,jsp输出内容的类型,指定处理异常的错误页面(相当于捕捉页面异常)
include用法:等价于代码复制(所以有可能出现相同变量错误,但编译器不会发现)

2.声明

声明的变量和方法最终编译成Servlet中的成员变量和方法。语法是<%! ... %>。这里的代码
都会生成在service()方法外,所以声明的变量是编译后Servlet的成员变量,而且可以声明方法。
这是声明与后面将要介绍的普通JSP代码的区别。

3.动作 <jsp:  使用xml格式控制服务器的行为
动作是运行期执行的代码。<jsp:include>、<jsp:forward>、<jsp:useBean>等等。<jsp:include>
是动态引入其他文件,如果代码不执行到这里就不会引入,一定要与include指令区分开。
<jsp:forward>与Servlet中的forward方法功能相同,而<jsp:useBean>、<jsp:property>稍后在JSP
转换成的Servlet源文件中会看到它们的真身。

include:与include指令不同的是,include动作只把文件的输出包含进来(所以没有java代码,也就不会出现相同变量的情况)。而且,由于include指令是编译期的,所以进入运行期后就算改变include进来的文件,被include的内容仍然是编译期include进来的文件的内容;而include动作是运行期的,每次页面被请求时都被引入,所以include进来的文件是可以在运行期改变的,改变后重新请求include进来的就是改变后的文件。

forward:相当于不要现有页面内容的include动作,跳转后地址栏仍然是跳转前的地址。forward后其实仍然在当前页面,只是显示的是forward的页面的内容(即跳转没有重新请求,自然request的内容仍然是当前页面的内容(即共享request))



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值