|
三.html&JavaScript&ajax
1.判断第二个日期比第一个日期大
如何用脚本判断用户输入的的字符串是下面的时间格式2004-11-2112等等,另外我需要用户输入两个,并且后一个要比前一个晚,只允许用JAVASCRIPT,请详细帮助作答,,
//这里可用正则表达式判断提前判断一下格式,然后按下提取各时间字段内容
window.onload=function()
{
//这么写是为了实现jshtml代码的分离,当我修改js时,不能影响html代码。
document.getElementById("frm1").onsubmit=
function(){
vard1=this.d1.value;
vard2=this.d2.value;
if(!verifyDate(d1)){alert("第一个日期格式不对");returnfalse;}
if(!verifyDate(d2)){alert("第二个日期格式不对");returnfalse;}
if(!compareDate(d1,d2)){alert("第二个日期比第一日期小");returnfalse;}
};
}
functioncompareDate(d1,d2)
{
vararrayD1=d1.split("-");
vardate1=newDate(arrayD1[0],arrayD1[1],arrayD1[2]);
vararrayD2=d2.split("-");
vardate2=newDate(arrayD2[0],arrayD2[1],arrayD2[2]);
if(date1>date2)returnfalse;
returntrue;
}
functionverifyDate(d)
{
vardatePattern=/^\d{4}-(0?[1-9]|1[0-2])-(0?[1-9]|[1-2]\d|3[0-1])$/;
returndatePattern.test(d);
}
2.用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
|
window.onload=function()
{
vartbl=document.getElementById("tbl");
rows=tbl.getElementsByTagName("tr");
for(i=0;i {
varj=parseInt(i/3);
if(j%2==0)rows[i].style.backgroundColor="#f00";
elserows[i].style.backgroundColor="#0f0";
}
}
3、HTML的?form提交之前如何验证数值文本框的内容全部为数字?否则的话提示用户并终止提交?
functionchkForm(this)
{
varvalue=thist.d1.value;
varlen=value.length;
for(vari=0;i {
if(value.charAt(i)>"9"||value.charAt(i)<"0")
{
alert("含有非数字字符");
returnfalse;
}
}
returntrue;
}
4、请写出用于校验HTML文本框中输入的内容全部为数字的javascript代码
functionchkNumber(eleText)
{
varvalue=eleText.value;
varlen=value.length;
for(vari=0;i {
if(value.charAt(i)>"9"||value.charAt(i)<"0")
{
alert("含有非数字字符");
eleText.focus();
break;
}
}
}
除了写完代码,还应该在网页上写出实验步骤和在代码中加入实现思路,让面试官一看就明白你的意图和检查你的结果。
5、说说你用过那些ajax
四.Javaweb
1、Tomcat
答:web.xml的监视,把jsp提前编辑成Servlet。
有富余物理内存的情况,加大tomcatjvm的内存
2、HTTPGET与POST方式的区别
答:servletjavax.servlet.Servlet接口的init,service和destroy方法表达。
3、解释一下什么是servlet;
答:servletjavax.servlet.Servlet接口的init,service和destroy方法表达。
4、说一说Servlet?
答:servletjavax.servlet.Servlet接口的init,service和destroy方法表达。
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do()方法。结束服务,web容器调用servlet的destroy()方法。
5、Servlet
publicclassServletNameextendsHttpServlet{
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throws
ServletException,IOException{
}
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws
ServletException,IOException{
}
}
6、SERVLETAPI中forward()与redirect()的区别?
答:forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用
sendRedirect()方法。
7、什么情况下调用doGet()doPost()?
Jsp页面中的FORM标签里的method属性为get时调用doGet(),为post时调用doPost()。
8、Request
setAttribute(Stringname,Object):设置名字为name的request的参数值
getAttribute(Stringname):返回由name指定的属性值
getAttributeNames():返回request对象所有属性的名字集合,结果是一个枚举的实例
getCookies():返回客户端的所有Cookie对象,结果是一个Cookie数组
getCharacterEncoding():返回请求中的字符编码方式
getContentLength():返回请求的Body的长度
getHeader(Stringname):获得HTTP协议定义的文件头信息
getHeaders(Stringname):返回指定名字的requestHeader的所有值,结果是一个枚举的实例
getHeaderNames():返回所以requestHeader的名字,结果是一个枚举的实例
getInputStream():返回请求的输入流,用于获得请求中的数据
getMethod():获得客户端向服务器端传送数据的方法
getParameter(Stringname):获得客户端传送给服务器端的有name指定的参数值
getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例
getParametervalues(Stringname):获得有name指定的参数的所有值
getProtocol():获取客户端向服务器端传送数据所依据的协议名称
getQueryString():获得查询字符串
getRequestURI():获取发出请求字符串的客户端地址
getRemoteAddr():获取客户端的IP地址
getRemoteHost():获取客户端的名字
getSession([Booleancreate]):返回和请求相关Session
getServerName():获取服务器的名字
getServletPath():获取客户端所请求的脚本文件的路径
getServerPort():获取服务器的端口号
removeAttribute(Stringname):删除请求中的一个属性
9、forwardredirect的区别
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
redirect就是服务端根据逻辑,,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。
10、request.getAttribute()request.getParameter()有何区别?
11.jsp有哪些内置对象??分别有什么方法?
答:JSP9个内置的对象:
request?用户端请求,此请求会包含来自GET/POST请求的参数
response?网页传回用户端的回应
pageContext?网页的属性是在这里管理
session?与请求有关的会话期
applicationservlet?正在执行的内容
out?用来传送回应的输出
config?servlet的构架部件
pageJSP
exception?针对错误网页,未捕捉的例外
request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie,essay-header,和session数据的有用的方法。
response表示HttpServletResponsecookies,头信息等)
out对象是javax.jsp.JspWriter
pageContext表示一个javax.servlet.jsp.PageContextservlet相关的对象的API,并且包装了通用的servlet相关功能的方法。
session表示一个请求的javax.servlet.http.HttpSessionSession可以存贮用户的状态信息
applicaton?表示一个javax.servle.ServletContextservlet引擎和servlet环境的信息
config表示一个javax.servlet.ServletConfigservlet实例的初始化参数。
page表示从该页面产生的一个servlet
12.jsp有哪些动作??
(这个问题似乎不重要,不明白为何有此题)
答:JSP6种基本动作
jsp:include:在页面被请求的时候引入一个文件。
jsp:useBean:寻找或者实例化一个JavaBean。
jsp:setProperty:设置JavaBean的属性。
jsp:getProperty:输出某个JavaBean的属性。
jsp:forward:把请求转到一个新的页面。
jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记
13、JSP
isErrorPage(是否能使用Exception对象),isELIgnored(是否忽略表达式)
14.JSP中动态INCLUDEINCLUDE的区别?
答:动态INCLUDEjsp:include动作实现
它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面?<%@includefile=included.htm%>
15、两种跳转方式分别是什么??
(下面的回答严重错误,应该是想问forwardsendRedirect的区别,毕竟出题的人不是专业搞文字艺术的人,可能表达能力并不见得很强,用词不一定精准,加之其自身的技术面也可能存在一些问题,不一定真正将他的意思表达清楚了,严格意思上来讲,一些题目可能根本就无人能答,所以,答题时要掌握主动,只要把自己知道的表达清楚就够了,而不要去推敲原始题目的具体含义是什么,不要一味想着是在答题)
答:有两种,分别为:
前者页面不会转向include.后者完全转向新页面,不会再回来。相当于goto语句。
16、页面间对象传递的方法
requestsession,application,cookie等
17、JSPServlet有哪些相同点和不同点,他们之间的联系是什么?
JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。
18、MVC?如何实现?
答:MVCModel-View-Controller的简写。Model代表的是应用的业务逻辑(通过JavaBean,EJB组件实现),View是应用的表示面(由JSP页面产生),Controller是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。
19、我们在webiso8859-1等,如何输出一个某种编码的字符串?
PublicStringtranslate(Stringstr){
StringtempStr="";
try{
tempStr=newString(str.getBytes("ISO-8859-1"),"GBK");
tempStr=tempStr.trim();
}
catch(Exceptione){
System.err.println(e.getMessage());
}
returntempStr;
}
20.现在输入nreset
五.
1、用两种方式根据部门号从高到低,工资从低到高列出每个员工的信息。
employee:
eid,ename,salary,deptid;
selectfromemployeeorderbydeptiddesc,salary
2、列出各个部门中工资高于本部门的平均工资的员工数和部门号,并按部门号排序
创建表:
mysql>createtableemployee921(idintprimarykeyauto_increment,namevarchar(5
0),salarybigint,deptidint);
插入实验数据:
mysql>insertintoemployee921values(null,''zs'',1000,1),(null,''ls'',1100,1),(null
,''ww'',1100,1),(null,''zl'',900,1),(null,''zl'',1000,2),(null,''zl'',900,2),(null,''z
l'',1000,2),(null,''zl'',1100,2);
编写sql
()selectavg(salary)fromemployee921groupbydeptid;
()mysql>selectemployee921.id,employee921.name,employee921.salary,employee921.dep
tidtidfrom?employee921wheresalary>(selectavg(salary)fromemployee921wheredeptid=tid);
效率低的一个语句,仅供学习参考使用(在groupby之后不能使用where,只能使用having,在groupby之前可以使用where,即表示对过滤后的结果分组):
mysql>selectemployee921.id,employee921.name,employee921.salary,employee921.dep
tidtidfrom?employee921wheresalary>(selectavg(salary)fromemployee921groupbydeptidhavingdeptid=tid);
()selectcount(),tid
from(
selectemployee921.id,employee921.name,employee921.salary,employee921.deptidtid
fromemployee921
wheresalary>
(selectavg(salary)fromemployee921wheredeptid=tid)
)ast
groupbytid;
另外一种方式:关联查询
selecta.ename,a.salary,a.deptid
fromempa,
(selectdeptd,avg(salary)avgsalfromempgroupbydeptid)b
wherea.deptid=b.deptidanda.salary>b.avgsal;
3、存储过程与触发器必须讲,经常被面试到?
createprocedureinsert_Student(_namevarchar(50),_ageint,out_idint)
begin
insertintostudentvalue(null,_name,_age);
selectmax(stuId)into_idfromstudent;
end;
callinsert_Student(''wfz'',23,@id);
select@id;
mysql>createtriggerupdate_StudentBEFOREupdateonstudentFOREACHROW
->selectfromstudent;
触发器不允许返回结果
createtriggerupdate_StudentBEFOREupdateonstudentFOREACHROW
insertinto?studentvalue(null,''zxx'',28);
mysql的触发器目前不能对当前表进行操作
createtriggerupdate_StudentBEFOREupdateonstudentFOREACHROW
deletefromarticles?whereid=8;
这个例子不是很好,最好是用删除一个用户时,顺带删除该用户的所有帖子
这里要注意使用OLD.id
触发器用处还是很多的,比如校内网、开心网、FacebookUCH没有用触发器,效率和数据处理能力都很低。
存储过程的实验步骤:
mysql>delimiter|
mysql>createprocedureinsertArticle_Procedure(pTitlevarchar(50),pBidint,out
pIdint)
->begin
->insertintoarticle1value(null,pTitle,pBid);
->selectmax(id)intopIdfromarticle1;
->end;
->|
QueryOK,0rowsaffected(0.05sec)
mysql>callinsertArticle_Procedure(''传智播客'',1,@pid);
->|
QueryOK,0rowsaffected(0.00sec)
mysql>delimiter;
mysql>select@pid;
+------+
|@pid|
+------+
|3?|
+------+
1rowinset(0.00sec)
mysql>selectfromarticle1;
+----+--------------+------+
|id|title?|bid|
+----+--------------+------+
|1?|test|1|
|2?|chuanzhiboke|1|
|3?|?传智播客?|1|
+----+--------------+------+
3rowsinset(0.00sec)
触发器的实验步骤:
createtableboard1(idintprimarykeyauto_increment,namevarchar(50),ar
ticleCountint);
createtablearticle1(idintprimarykeyauto_increment,titlevarchar(50)
,bidintreferencesboard1(id));
delimiter|
createtriggerinsertArticle_Triggerafterinsertonarticle1foreachro
wbegin
->updateboard1setarticleCount=articleCount+1whereid=NEW.bid;
->end;
->|
delimiter;
insertintoboard1value(null,''test'',0);
insertintoarticle1value(null,''test'',1);
还有,每插入一个帖子,都希望将版面表中的最后发帖时间,帖子总数字段进行同步更新,用触发器做效率就很高。下次课设计这样一个案例,写触发器时,对于最后发帖时间可能需要用declare方式声明一个变量,或者是用NEW.posttime来生成。
4、数据库三范式是什么?
第一范式(1NF,不可再分。所有关系型数据库系统都满足第一范式)
数据库表中的字段都是单一属性的,不可再分。例如,姓名字段,其中的姓和名必须作为一个整体,无法区分哪部分是姓,哪部分是名,如果要区分出姓和名,必须设计成两个独立的字段。
第二范式(2NF
第二范式(2NF1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。
第二范式(2NF
第三范式的要求如下:
满足第三范式(3NF2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
所以第三范式具有如下特征:12,每一行都能区分。3,每一个表都不包含其他表已经包含的非主关键字信息。
例如,帖子表中只能出现发帖人的idid,还同时出现发帖人姓名,否则,只要出现同一发帖人id的所有记录,它们中的姓名部分都必须严格保持一致,这就是数据冗余。
5、说出一些数据库优化方面的经验?
用PreparedStatementStatement性能高:一个sql发给服务器去执行,涉及步骤:语法检查、语义分析,编译,缓存
“inertintouservalues(1,1,1)”-à二进制
“inertintouservalues(2,2,2)”-à二进制
“inertintouservalues(?,?,?)”-à二进制
有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在设计数据库时就去掉外键。(比喻:就好比免检产品,就是为了提高效率,充分相信产品的制造商)
(对于hibernateempleyee->Deptment对象,现在设计时就成了employeeàdeptid)
看mysql
1.?selecte.name,e.salarywheree.managerid=(selectidfromemployeewherename=''zxx'');
2.?selecte.name,e.salary,m.name,m.salaryfromemployeese,employeesmwhere
e.managerid=m.idandm.name=''zxx'';
表中允许适当冗余,譬如,主题帖的回复数量和最后回复时间等
将姓名和密码单独从用户表中独立出来。这可以是非常好的一对一的案例哟!
sqlsql命令的缓存功能,更加需要统一大小写,sql语句à发给oracle服务器à语法检查和编译成为内部指令à缓存和执行指令。根据缓存的特点,不要拼凑条件,而是用?和PreparedStatment
还有索引对查询性能的改进也是值得关注的。
备注:下面是关于性能的讨论举例
43个城市
mn
selectfromflight,citywhereflight.startcityid=city.cityidandcity.name=''beijing'';
m+n
selectfromflightwherestartcityid=(selectcityidfromcitywherecityname=''beijing'');
selectflight.id,''beijing'',flight.flightTimefromflightwherestartcityid=(selectcityidfromcitywherecityname=''beijing'')
6、union和unionall有什么不同?
假设我们有一个表Student
droptablestudent;
createtablestudent(idintprimarykey,namenvarchar2(50)notnull,scorenumbernotnull);
insertintostudentvalues(1,''Aaron'',78);insertintostudentvalues(2,''Bill'',76);insertintostudentvalues(3,''Cindy'',89);insertintostudentvalues(4,''Damon'',90);insertintostudentvalues(5,''Ella'',73);insertintostudentvalues(6,''Frado'',61);insertintostudentvalues(7,''Gill'',99);insertintostudentvalues(8,''Hellen'',56);insertintostudentvalues(9,''Ivan'',93);insertintostudentvalues(10,''Jay'',90);
commit;
Union和UnionAll的区别。
selectfromstudentwhereid<4
union
selectfromstudentwhereid>2andid<6
结果将是
1Aaron782Bill763Cindy894Damon905Ella73
如果换成UnionAll
1Aaron782Bill763Cindy893Cindy894Damon905Ella73
可以看到,UnionUnionAll的区别之一在于对重复结果的处理。
UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如:selectfromgc_dfysunionselectfromls_jg_dfys这个SQL而UNIONALL从效率上说,UNIONALLUNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNIONALL,
7.分页语句
取出sql表中第3140的记录(以自动增长ID为主键)
sqlserver方案1:
selecttop10fromtwhereidnotin(selecttop30idfromtorderbyid)ordebyid
sqlserver2:
selecttop10fromtwhereidin(selecttop40idfromtorderbyid)orderbyiddesc
mysqlselectfromtorderbyidlimit30,10
oracle方案:selectfrom(selectrownumr,fromtwherer<=40)wherer>30
|
|