5、JSP

(1)JSP是什么?
和servlet一样都是Sun公司提供的一门动态资源开发技术,servlet是前台页面代码和后台逻辑代码分开编写,而jsp是在html页面内编写java代码,简化了前台和后台代码的切换操作,提升了开发的便利性。
那JSP的原理是什么?
Jsp页面在第一次被访问的时候,会被jsp翻译引擎翻译成一个servlet文件,具体怎么翻译?JSP里类继承HttpJspBase,这是一个servlet,所以当前类也是servlet。
Jsp页面被翻译成一个servlet文件后,该页面里的HTML和java代码就全部包含在文件内,那访问jsp页面就是访问这个servlet文件,会执行里面的service方法。
(2)JSP怎么用?
1)JSP语法
正如前面所述,JSP可以看作HTML+JAVA,Java代码不需要JSP翻译引擎翻译成Java代码,所以JSP语法主要指的HTML部分,当然不只是HTML,还有脚本表达式、脚本片段、声明和注释等,下面提到el表达式替代的例子其实就是脚本表达式,用<%= %>表示;jstl标签库替代的例子其实就是脚本片段。
2)JSP常见指令
A、page指令
这个是定义页面的属性,比如编码、是否有session等;
在Eclipse中创建好JSP,则page默认已经存在,只需要把pageEncoding的值改成utf-8即可。
B、include指令
这个是用于引入其他页面,比如在index.jsp里引入_head.jsp,用<%@ include file ="_head.jsp"%>;当然引入其他页面还可以用request的请求包含功能,具体写法是<%request.getRequestDispatcher("/_head.jsp").include(request,response);%>(注意这里的分号要加上)
C、taglib指令
这个是用于引入外部的标签库,比如引入jstl标签库,代码如下:
<%@taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
3)JSP九大隐式对象
page
request
response
out
application
exception
session
config
pageContext 这个是其他八个隐式对象的入口,比如在注册功能设置form表单中提交地址即
action="<%=request.getContextPath%>/RegistServlet",如果以pageContext为入口,那就可以改写成
action="${pageContext.request.contextPath}/RegistServlet",改写后的式子也叫作el表达式,具体形式是${},而jQuery的选择器$(),前者是大括号,后者是小括号,注意区分。
4)四大作用域(即下面的面试题里:JSP的四种范围)
上面提到的pageContext是最小的作用域,代表一个JSP页面,依次往上分别是request代表HTTP请求对象,session代表当前会话的对象(session销毁原因:服务器意外宕机、超时),servletContext代表当前web应用的对象。
5)标签技术
JSP页面主要以HTML为主,有java代码其实不好看,所以可以引入一些标签代替java代码。用的比较多的是el表达式和jstl标签库:el表达式主要用于获取数据,用${}表示,比如要在regist.jsp中获取request域中的msg,原来是<%=request.getAttribute(“msg”)==null?"";request.getAttribute(“msg”)%>,而现在只要${msg}即可,这个没有设置在request域寻找没事吗?没事,el表达式会自动从范围最小的pageContext到request再到session直至范围最大的servletContext搜索msg。
注意el表达式只能获取数据,不能设置或者遍历数据,所以如果设置和遍历数据必须用jstl标签库,这个标签库的用处很大,这里举个在登录功能中用的:
1)不使用jstl标签库的代码(脚本片段):

<%
			//判断是否存在登录状态  
			if(request.getSession(false) != null 
			&& request.getSession().getAttribute("username")!=null){
			//第一个判断是确认session对象是否存在,如果存在仍然不能确定是否包含username域属性(登录状态) 
			//第二个判断是确认当前session对象中是否包含username属性,如果包含才从中取出用户名,在页面中显示 
			%>
			<a href="#">欢迎<%=request.getSession().getAttribute("username") %>,回来</a>&nbsp;&nbsp;|&nbsp;&nbsp;
			<a href="${pageContext.request.contextPath}/LogOutServlet">注销</a>
			<% 
			}else{
				%>
			<a href="${pageContext.request.contextPath}/login.jsp">登录</a>&nbsp;&nbsp;|&nbsp;&nbsp;
			<a href="${pageContext.request.contextPath}/regist.jsp">注册</a>
				<%
			}
		 %> 

2)使用jstl标签库的代码:

	 <c:if test="${sessionScope.user != null }">
			<a href="#">欢迎${sessionScope.user.username},回来</a>&nbsp;&nbsp;|&nbsp;&nbsp;
			<a href="${pageContext.request.contextPath}/LogOutServlet">注销</a>
		 </c:if>
		<c:if test="${sessionScope.user ==null }">
			<a href="${pageContext.request.contextPath}/login.jsp">登录</a>&nbsp;&nbsp;|&nbsp;&nbsp;
			<a href="${pageContext.request.contextPath}/regist.jsp">注册</a>
		</c:if>

面试题:
1、JSP有哪些内置对象?作用分别是什么?
2、JSP有哪些动作?作用分别是什么?
include:当页面被请求的时候引入一个文件;
forward:将请求转到另一个页面;
useBean:获取javaBean的一个实例;
3、JSP常用指令有哪些?
4、JSP中动态include和静态include的区别?
动态include能够自动检查被包含文件,实时更新;
静态include相当于复制,如果内容变化,则不会再次编译,所以不易维护。
5、页面间对象传递的方法?
Request(request作用域)、session(session作用域)、application(ServletContext)、cookie。
6、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
Servlet是单纯java代码,和html分开(但相关);
JSP是html+java代码,有了标签技术(el表达式(和jQuery一样用$符)、jstl标签库)后就代替了java代码,看起来就是html。
JSP本质上也是Servlet,被访问的时候会被jsp翻译引擎翻译成Servlet;
在MVC模型中,JSP是View技术,Servlet是Controller技术。
7、详细描述MVC
M是Model(SSM里的Service层),即模型,表示处理业务逻辑的模块;
V是View,即视图,负责把数据渲染到页面上,采用JSP技术;
C是Controller(SSM里的Controller层,理论上还包括上面的View),即控制,采用Servlet技术分发每个请求,比如把表单数据传递给Model进行处理,处理之后的数据返回到View显示给用户。
8、JSP的四种范围
9、JSP页面是如何被执行的?JSP执行效率比Servlet低吗?
JSP第一次被客户端访问请求的时候,会被JSP翻译引擎翻译成Servlet文件,然后把编译后的Servlet文件加载到内存中执行,执行的结果response到客户端。
注意只是第一次会翻译成Servlet文件,之后再访问这个JSP页面那就直接去执行Web容器里的Servlet对象,所以就第一次执行效率比Servlet低,之后都一样。
10、JSP如何处理运行时异常?
可以使用页面的errPage属性捕捉没有处理的运行时异常,然后自动转到一个错误处理页面。
11、如何避免JSP页面自动生成Session对象?为什么要这样做?
Session是比较消耗资源的,所以像宣传产品的网页这种没有必要使用Session来保存信息的场景就可以在JSP的三大指令中的Page指令里,把自动创建Session设置为false即可。
12、在Servlet和JSP之间能共享session对象吗?

13、使用JSP连接数据库连接缓存池最好的方法是什么?
法1:使用JDBC2.0带有此服务的Driver;
法2:使用提供此服务的applicationServer。
14、JSP的缺点?
不易对java程序进行调试
和其他脚本语言有交互
15、如何实现Servlet的单线程模式?
在JSP中使用Page指令ThreadSafe属性设置为false。
16、EL表达式的功能,为什么要用EL表达式?
功能是从四个域对象中取出数据显示和取出请求参数显示;
因为在HTML页面中用jsp脚本和jsp表达式来获取数据显示比较麻烦,用这个表达式可以把java代码标签化;
17、说说自动登录功能的编码实现?
自动登录中自动是用cookie实现的,就是登录时把用户的信息保存为持久化cookie;
登录是用session实现的,就是向session对象中保存当前用户的对象。
所以下次访问时,读取请求中如果有用户信息的cookie就可以自动登录。
18、如何防止表单重复提交?
使用Session技术:
第一步是在注册的jsp页面生成一个唯一的随机值,将其保存到session中,并将这个值发送给客户端的表单中,在表单中使用隐藏域来存储这个值;
第二步是发起注册的请求,则表单中隐藏域里的这个值和服务器端生成的值对比。
19、Request对象的主要方法有哪些?
getCookies():返回客户端的所有Cookie对象,结果是一个Cookie数组
getSession():如果服务器中有session对象,则取出使用,如果没有就创建一个新的
session对象使用。
getAttribute(Stringname):返回由name指定的属性值
getParameter(Stringname):获得客户端传送给服务器的由name指定的参数值
getMethod():获得客户端向服务器端传送数据的方法
20、session和application的区别?
后者是servletContext对象,所以从二者作用范围和生命周期来对比。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值