JSP面试知识Word文档下载推荐.docx
《JSP面试知识Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《JSP面试知识Word文档下载推荐.docx(24页珍藏版)》请在冰点文库上搜索。
把请求转到一个新的页面。
plugin:
根据浏览器类型为Java插件生成OBJECT或EMBED标记
4、getAttribute()和setAttribute()的作用是什么?
5、get和post的区别?
Form中的get和post方法,在数据传输过程中分别对应了HTTP协议中的GET和POST方法。
二者主要区别如下:
1、Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据。
2、Get将表单中数据的按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?
”连接,而各个变量之间使用“&
”连接;
Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL。
3、Get是不安全的,因为在传输过程,数据被放在请求的URL中,而如今现有的很多服务器、代理服务器或者用户代理都会将请求URL记录到日志文件中,然后放在某个地方,这样就可能会有一些隐私的信息被第三方看到。
另外,用户也可以在浏览器上直接看到提交的数据,一些系统内部消息将会一同显示在用户面前。
Post的所有操作对用户来说都是不可见的。
4、Get传输的数据量小,这主要是因为受URL长度限制;
而Post可以传输大量的数据,所以在上传文件只能使用Post(当然还有一个原因,将在后面的提到)。
5、Get限制Form表单的数据集的值必须为ASCII字符;
而Post支持整个ISO10646字符集。
6、Get是Form的默认方法。
6、写一个JSP页面,里面要包含一个表单、表单包含文本框、列表框、单选按扭、复选框。
7、当前页面是a.jsp,用forward显示b.jsp的内容。
8、什么是taglib?
如何使用?
有哪些方式?
1、问题:
Tag究竟是什么?
如何实现一个Tag?
一个tag就是一个普通的java类,它唯一特别之处是它必须继承TagSupport或者BodyTagSupport类。
这两个类提供了一些方法,负责jsp页面和你编写的类之间的交互,例如输入,输出。
而这两个类是由jsp容器提供的,无须开发人员自己实现。
换句话说,你只需把实现了业务逻辑的类继承TagSupport或者BodyTagSupport,再做一些特别的工作,你的类就是一个Tag。
并且它自己负责和jsp页面的交互,不用你多操心。
“特别的工作”通常有以下几个步骤:
1)提供属性的set方法,此后这个属性就可以在jsp页面设置。
以jstl标签为例<c:
outvalue="
"
/>,这个value就是jsp数据到tag之间的入口。
所以tag里面必须有一个setValue方法,具体的属性可以不叫value。
例如:
setValue(Stringdata){this.data=data;
}
这个“value”的名称是在tld里定义的。
取什么名字都可以,只需tag里提供相应的set方法即可。
2)处理doStartTag或doEndTag。
这两个方法是TagSupport提供的。
还是以<c:
/>为例,当jsp解析这个标签的时候,在“<”处触发doStartTag事件,在“>”时触发doEndTag事件。
通常在doStartTag里进行逻辑操作,在doEndTag里控制输出。
3)编写tld文件。
4)在jsp页面导入tld
这样,你的jsp页面就可以使用自己的tag了。
通常你会发现自己绝大多数活动都集中在doStartTag或doEndTag方法里。
确实如此,熟悉一些接口和类之后,写taglib很容易。
正如《jsp设计》的作者所言:
里面的逻辑稍微有点复杂,但毕竟没有火箭上天那么难。
2、一个简单的例子:
OutputTag
packagediegoyun;
importjavax.servlet.jsp.JspException;
importjavax.servlet.jsp.JspWriter;
importjavax.servlet.jsp.tagext.TagSupport;
/**
*@authorchenys
*/
publicclassOutputTagextendsTagSupport
{
privateStringname=null;
publicvoidsetName(Stringname)
this.name=name;
publicintdoStartTag()throwsJspException{
try
JspWriterout=pageContext.getOut();
out.print("
Hello!
"
+name);
catch(Exceptione)
{
thrownewJspException(e);
returnEVAL_PAGE;
简要说明:
1、如何输出到jsp页面:
调用JspWriterJspWriterout=pageContext.getOut();
out.print......
记住这个方法就可以了。
2、输出后如何作处理
函数会返回几个值之一。
EVAL_PAGE表示tag已处理完毕,返回jsp页面。
还有几个值,例如EVAL_BODY_AGAIN和EVAL_BODY_INCLUDE等,后面我们会作讨论
编写tld
<?
xmlversion="
1.0"
encoding="
ISO-8859-1"
?
>
<!
DOCTYPEtaglib
PUBLIC"
-//SunMicrosystems,Inc.//DTDJSPTagLibrary1.2//EN"
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>diego</short-name>
--OutputTag-->
<tag>
<name>out</name>
<tag-class>diegoyun.OutputTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>name</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
</taglib>
在WEB-INF下新建tlds文件夹,把这个文件取名为diego.tld,放到tlds文件夹下。
路径应该这样:
WEB-INF\tlds\diego.tld
关于tld的简单说明:
short-name:
taglib的名称,也称为前缀。
比如<c:
/>里的“c”
name:
tag的名字。
例如<c:
/>里的"
out”,我们的类也取名为out,由于有前缀作区分,不会混淆
tag-class:
具体的tag类。
带包名
body-content:
指tag之间的内容。
>......</c>起始和关闭标签之间就是body-content。
由于没有处理body-content,所以上面设为empty
<attribute>里的name:
属性名字。
/>里的value。
名字可任意取,只要类里提供相应的set方法即可。
required:
是否必填属性。
rtexprvalue:
是否支持运行时表达式取值。
这是tag的强大功能。
以后我们会讨论。
暂时设为false
编写jsp页面
<%@pagelanguage="
java"
%>
<%@tagliburi="
/WEB-INF/tlds/diego.tld"
prefix="
diego"
<html>
<body>
TestTag:
<diego:
outname="
diegoyun"
/>
</body>
</html>
我的编程环境是eclipse+tomcat.启动服务器,如果一切按照上面步骤的话,就能看到TestTag:
Hello!
diegoyun字样
最简单的tag就这么出来了。
并不难,是不是?
9、Jsp跳转有几种方式?
分别是什么?
10、JavaBuan的范围?
<
useBean>
标签里有一属性scope,它用来设定JavaBean的范围,它的值只能为Page,request,session,application,不可为其它值。
使用不同的scope属性值,能在不用的范围共享JavaBean.
11、JSP中动态INCLUDE与静态INCLUDE的区别?
答:
动态INCLUDE用jsp:
include动作实现
includepage="
included.jsp"
flush="
true"
/>
它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数
静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面
%@includefile="
included.htm"
%>
12、两种跳转方式分别是什么?
有什么区别?
有两种,分别为:
>
forwardpage="
nextpage.jsp"
/>
前者页面不会转向include所指的页面,只是显示该页的结果,主页面还是原来的页面。
执行完后还会回来,相当于函数调用。
并且可以带参数.后者完全转向新页面,不会再回来。
相当于goto语句。
JAVA方面
1、Java的类型转换,日期与字符串间的转换。
如果低级类型为char型,向高级类型(整型)转换时,会转换为对应ASCII码值,例如\r
charc='
c'
;
inti=c;
System.out.println("
output:
+i);
输出:
99;
对于byte,short,char三种类型而言,他们是平级的,因此不能相互自动转换,可以使用下述的强制类型转换。
shorti=99;
charc=(char)i;
System.out.println("
+c);
c;
但根据笔者的经验,byte,short,int三种类型都是整型,因此如果操作整型数据时,最好统一使用int型。
2.2强制类型转换
将高级变量转换为低级变量时,情况会复杂一些,你可以使用强制类型转换。
即你必须采用下面这种语句格式:
inti=99;
byteb=(byte)i;
floatf=(float)i;
可以想象,这种转换肯定可能会导致溢出或精度的下降,因此笔者并不推荐使用这种转换。
2.3包装类过渡类型转换
在我们讨论其它变量类型之间的相互转换时,我们需要了解一下Java的包装类,所谓包装类,就是可以直接将简单类型的变量表示为一个类,在执行变量类型的相互转换时,我们会大量使用这些包装类。
Java共有六个包装类,分别是Boolean、Character、Integer、Long、Float和Double,从字面上我们就可以看出它们分别对应于boolean、char、int、long、float和double。
而String和Date本身就是类。
所以也就不存在什么包装类的概念了。
在进行简单数据类型之间的转换(自动转换或强制转换)时,我们总是可以利用包装类进行中间过渡。
一般情况下,我们首先声明一个变量,然后生成一个对应的包装类,就可以利用包装类的各种方法进行类型转换了。
例1,当希望把float型转换为double型时:
floatf1=100.00f;
FloatF1=newfloat(f1);
Doubled1=F1.doubleValue();
//F1.doubleValue()为Float类的返回double值型的方法
当希望把double型转换为int型时:
doubled1=100.00;
DoubleD1=newDouble(d1);
inti1=D1.intValue();
当希望把int型转换为double型时,自动转换:
inti1=200;
doubled1=i1;
简单类型的变量转换为相应的包装类,可以利用包装类的构造函数。
即:
Boolean(booleanvalue)、Character(charvalue)、Integer(intvalue)、Long(longvalue)、Float(floatvalue)、Double(doublevalue)
而在各个包装类中,总有形为×
×
Value()的方法,来得到其对应的简单类型数据。
利用这种方法,也可以实现不同数值型变量间的转换,例如,对于一个双精度实型类,intValue()可以得到其对应的整型变量,而doubleValue()可以得到其对应的双精度实型变量。
3字符串型与其它数据类型的转换
通过查阅类库中各个类提供的成员方法可以看到,几乎从java.lang.Object类派生的所有类提供了toString()方法,即将该类转换为字符串。
Characrer,Integer,Float,Double,Boolean,Short等类的toString()方法toString()方法用于将字符、整数、浮点数、双精度数、逻辑数、短整型等类转换为字符串。
如下所示:
inti1=10;
floatf1=3.14f;
doubled1=3.1415926;
IntegerI1=newInteger(i1);
//生成Integer类\rFloatF1=newFloat(f1);
//生成Float类\rDoubleD1=newDouble(d1);
//生成Double类\r//分别调用包装类的toString()方法转换为字符串Stringsi1=I1.toString();
Stringsf1=F1.toString();
Stringsd1=D1.toString();
Sysytem.out.println("
si1"
+si1);
sf1"
+sf1);
sd1"
+sd1);
五、将字符型直接做为数值转换为其它数据类型
将字符型变量转换为数值型变量实际上有两种对应关系,在我们在第一部分所说的那种转换中,实际上是将其转换成对应的ASCII码,但是我们有时还需要另一种转换关系,例如,'
1'
就是指的数值1,而不是其ASCII码,对于这种转换,我们可以使用Character的getNumericValue(charch)方法。
六、Date类与其它数据类型的相互转换
整型和Date类之间并不存在直接的对应关系,只是你可以使用int型为分别表示年、月、日、时、分、秒,这样就在两者之间建立了一个对应关系,在作这种转换时,你可以使用Date类构造函数的三种形式:
Date(intyear,intmonth,intdate):
以int型表示年、月、日
Date(intyear,intmonth,intdate,inthrs,intmin):
以int型表示年、月、日、时、分
Date(intyear,intmonth,intdate,inthrs,intmin,intsec):
以int型表示年、月、日、时、分、秒\r
在长整型和Date类之间有一个很有趣的对应关系,就是将一个时间表示为距离格林尼治标准时间1970年1月1日0时0分0秒的毫秒数。
对于这种对应关系,Date类也有其相应的构造函数:
Date(longdate)
获取Date类中的年、月、日、时、分、秒以及星期你可以使用Date类的getYear()、getMonth()、getDate()、getHours()、getMinutes()、getSeconds()、getDay()方法,你也可以将其理解为将Date类转换成int。
而Date类的getTime()方法可以得到我们前面所说的一个时间对应的长整型数,与包装类一样,Date类也有一个toString()方法可以将其转换为String类。
有时我们希望得到Date的特定格式,例如20020324,我们可以使用以下方法,首先在文件开始引入,
importjava.text.SimpleDateFormat;
importjava.util.*;
java.util.Datedate=newjava.util.Date();
//如果希望得到YYYYMMDD的格式SimpleDateFormatsy1=newSimpleDateFormat("
yyyyMMDD"
);
StringdateFormat=sy1.format(date);
//如果希望分开得到年,月,日SimpleDateFormatsy=newSimpleDateFormat("
yyyy"
SimpleDateFormatsm=newSimpleDateFormat("
MM"
SimpleDateFormatsd=newSimpleDateFormat("
dd"
Stringsyear=sy.format(date);
Stringsmon=sm.format(date);
Stringsday=sd.format(date);
结束语:
当然,笔者的论述只是一人之见,如果希望更多了解有关JAVA数据类型转换的知识,笔者建议参考JAVA类库java.util.*下面的
Integer类\r
Boolean类\r
Character类\r
Float类\r
Double类\r
String类\r
Date类
根据自己的需要,参考不同类的各种成员方法进行数据类型之间的转换。
大家可以参考JAVA的网上类库或下载一份,来更灵活的利用其中的成员方法进行数据类型之间的转换,IP地址:
补充:
如何将字串String转换成整数int?
A.有两个方法:
1).inti=Integer.parseInt([String]);
或i=Integer.parseInt([String],[intradix]);
2).inti=Integer.valueOf(my_str).intValue();
注:
字串转成Double,Float,Long的方法大同小异.2如何将整数int转换成字串String?
A.有叁种方法:
1.)Strings=String.valueOf(i);
2.)Strings=Integer.toString(i);
3.)Strings="
+i;
Double,Float,Long转成字串的方法大同小异.这是一个例子,说的是JAVA中数据数型的转换.供大家学习
2、连一个数据库。
给一个SQL语句,对返回的结果集进行操作。
packagecom.bluedot.util;
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.SQLException;
publicclassConnDB
publicstaticStringjdbcDriver="
org.gjt.mm.mysql.Driver"
publicstaticStringurl="
jdbc:
mysql:
//localhost:
3306/test_user"
publicstaticStringname="
root"
publicstaticStringpassword="
publicConnDB()
{
super();
}
publicstaticConnectiongetConnection()
Connectionconn=null;
try
{
Class.forName(jdbcDriver).newInstance();
conn=DriverManager.getConnection(url,name,password);
}
catch(InstantiationExceptione)
//TODOAuto-generatedcatchblock
e.printStackTrace();
catch(IllegalAccessExceptione)
catch(ClassNotFoundExceptione)
//TODOAuto-generatedcatch