JSP.docx
《JSP.docx》由会员分享,可在线阅读,更多相关《JSP.docx(21页珍藏版)》请在冰豆网上搜索。
JSP
1,如果当刷新一个页面的时候,这个页面的值总是改变,这是由于什么原因引起?
是由于上一个页面在跳转是用的request.getRequestDispatcher(“页面”).forward(request,resonse);这样使得当前浏览器的地址是不会变的,从而在刷新页面的时候总是在之前的上一个页面的操作反复操作,故会有像上一个页面的跳转之后的效果
2,HttpSession创建对像的时候,有一个要注意的的是?
HttpSessionsession=request.getSession(false);//这是一个很容易放错的一个做法,他只适应那种只有当没有相关的请求的时候就返回一个null,如果有的话,将会返回一个session对象,如果在第一次访问一个带有HttpSessionsession=request.getSession(false);的时候,(服务器在响应客户端的之前),就会报nullpointerException错误,因为只有开始访问一个地址,然后服务器就会响应客户端,并发送一个sessionId(标示唯一的服务器与客户端之间的对话(第二次访问的时候只要通过sessionId与服务器所存储的ID匹配,从而获得自己所要的数据))
最好用request.getSession(true)等价与request.getSession();,如果存在用户的当前相关的请求那么就返回一个该session对象,如果没有就创建一个session,如果超过了一次会话的时间,那么用request.getSession(false);对应的所用的session对像将会报错,因为是空引用,故要包nullpointerException错误
首先服务器判断客户端是否有sessionid,如果没有则服务器将会创建一个sessionid,并发送给客户端,如果客户端存在sessionid,那么服务器将会和客户端的sessionid进行比较,。
。
。
。
Session编程保存的数据在服务器,Cookies编程数据保存在客户端,Cookies禁掉之后,将会禁止到服务器发送到客户端的sessionid故sessionid永远不能够保存到客户端,那么怎样防止这种情况呢?
可以重写URL路劲
session对象.isNew();//返回一个Boolean类型的数据
request.getRequestSessionId()是可以获得服务器发送给客户端的sessionid
request.isRequestedSessionIdFromCookie();//是否是从Cookies中读取
request.isRequestedSessionIdFromURL();//是否从地址栏中读取到的呢
request.isRequestedSessionIdValid();//从客户端取的sessionid是否是合法的sessionid
例如:
a//这就是所谓的URL重写,可以避免禁用Cookies后,不能够存储数据,这样做的原理是把数据在页面上存储
a
客户端向服务器发送sessionId有两种方式,1,Cookies(内存ccookie),2rewriterURL(重写URL)
3,在提交表单的时候,如果提交方式设置的是get的话,那么在提交到一个页面进行处理,获得值的时候,如果是中文的就会乱码;
4,如果在执行一个request.getRequestDispatcher(“页面”).forward(request,response);这句报错误的话,说明这个所要转向的这个页面有误;
5,在JAVA调试中可以在调试的代码之后,可以很轻松的获得该变量的值,就是选中之后,再点右键----查找就OK了
6,尽量不要用sessiong保存list对象,或其他的对象,可以用request.setAttribute(stringkey,Objectvallue)来设置一个值,用request.getAttribute(“key”)可以获得这个值,可以用request.removeAttribute(“key”);删除该对象
7,如果用了PrintWriterout=request.getWrite();//这个流对象那么在out.flush();out.close();之后不能做任何操作,因为该对象已关闭,故应该在关闭之前用一些对象
8,是否在客户端的JavaScript脚本一定能保证用户所输入的满足条件?
不能,因为发送给客户端的JavaScript脚本可以被用户可见,然而用户可以删除该JavaScript脚本,故所填写的就可以不管该网站的要求,所以一定要在网站的Servlet处理页面重新进行判断;
9,我在提交页面时,在form表单只有一个网站的相对路径,就OK了?
因为在地址栏中的地址的端口号是可以被服务器监听到的,故可以提交到该页面,尽管服务器的Servlet的页面上有out.print;//但这是不会在服务器端打印的,只会在客户端打印,out.Print是输出到当前页面,而脚本是不会显现出来的
10,服务器给客户端发送HTML页面的时候,其实这个发送之前,这是一个JSP页面,这就说明这个页面是一个其间含有jsp脚本的代码,故在这个HTML含有一个java类的文件,再发送给客户端,是解析成HTML,;
11,在一个页面中的任何位置都可以用jsp小脚本<%
Objectresu=request.getAttribute("result");
if(resu!
=null){
out.print("alert('"+resu.toString()+"');");
}
Stringname="";
StringpassWord="";
Useruser=(User)request.getAttribute("Login");
if(user!
=null){
name=user.getUsreName();
passWord=user.getPassWord();
}
%>
name="<%=name%>";//嵌套JSP脚本
password="<%=passWord%>";
document.login.userName.value=name;
document.login.password.value=password;
document.login.password.select();
functioncheck(){
varuserName=document.login.userName;
varpassWord=document.login.password;
if(userName.value==""||userName.value.length==0){
alert("请输入用户名");
userName.focus();
returnfalse;
}
if(passWord.value==""||passWord.value.length==0){
alert("密码不能为空");
passWord.focus();
returnfalse;
}
returntrue;
}
不能够用varUser=”<%=user%>”javaScript中的变量不能接受java中的对象,就算接受一个对象,也无法来用属性点对象的方法。
所谓的out.print();输出JS脚本只是说用在后台页面,而不是所谓的显示在客户端的页面
这样就可以实现了用户不存在在返回后,把用户原先的所输入的内容重新赋到用户文本框上,并且这可以用对象来传到request里面(例如List)
12,用include指令指定一个文件,则说明这个所指定的文件的代码已经在存在于当前的页面上了
13,因为表单在body中,故用js操纵表单的时候,必须保证在body加载的时候,才会或得到表单中的元素,所以操纵表单必须在body中的表单加载完就在后面用就OK了,再可以用onLoad(在body中加载之后,再调用方法);
14,在写JSP的时候,要将尽量写在html标签上面,如果多的话,就用另外用一个文件保存,在调用,一个完整的功能可以那样子做;tick('cn');
15,request.setAttribute(“asdf”,”asf”),request这个对象,只要转发之后,这个request的生命周期将会结束,故request中所存在的值都不会存在;
16,像js是一门弱类型语言,故可以写一个方法在单独的以后缀名为.js的文件中,再直接调用该方法就OK了,而jsp是不行,因为只能在一个包中用import可以用到该方法了,或者用方法的声明
%%>不过这也只能在一个JSP页面中调用即可
17,如果要HTML标签的时候,要确保标签一致,就是要标签在所对应的位置,否则将会报错;
18,在JSP页面用System.out.println(“这句话将打印在控制台上”);
19,建一个项目必须先要建好目录结构
如下com.项目名.common这个包是放一些公共的类,例如判断字符为空,或是数据连接类,日期格式化,还有把客户端输入的HTML标签XX,这样就可以原封不懂的保存到数据库中,然后显示在页面的时候自然就会有超链接的效果例如下面的工具类的使用实例,经常用到的
Com.项目名.tool;//这就是所谓的工具类;上面的就可以写入这个包中
Com.项目名.exception;//这个包是放一些自定义的异常
Com.项目名.dao;这个包是放一些访问数据库的类,
Com.项目名.entitys;//这是放一些实体对象;
Com.项目名.service;//这是一个业务逻辑,来调用数据访问层dao类,再根据需要写业务
Com.项目名.servlet;//这是一个处理页面请求,和调用相应业务逻辑层service的一个类;
20,当跳到一个页面的时候,可以使用绝对路径和相对路径,如果一个项目实现跳转都是用的是绝对路径,那么用response重定向的时候,需要加项目名,request转向的时候不需要项目名
21,MVC设计模式使得项目的层次更清楚,分工更明确
22,在创建一个Servlet的时候,如果对应的class-patter中的名字与要访问的Servlet的名称不同的话,将会报class-web容器加载不了的错误
23,从一个session中的值,或者是request获得的值,可以不用parseInt获得自己想要的值,((Integer)session.getAttribute(“Num”)).intValue();转换成double类型就是((String)session.getAttribute(“Num”)).stringValue();其余的也如此
24,使用JNDI技术的时候,获得Source中的连接的时候,返回如下错误,这是什么原因呢?
Needtospecifyclassnameinenvironmentorsystemproperty,orasanappletparameter,orinanapplicationresourcefile:
java.naming.factory.initial
atjavax.naming.spi.NamingManager.getInitialContext(UnknownSource)
atjavax.naming.InitialContext.getDefaultInitCtx(UnknownSource)
atjavax.naming.InitialContext.getURLOrDefaultInitCtx(UnknownSource)
atjavax.naming.InitialContext.lookup(UnknownSource)
//这是因为Source是由Web容器创建的,如果在Eclipse编辑器中使用主线程,用Contextco=newInitialContext();DataSourceds=(DataSource)co.lookup(“java:
comp/env/在context.xml中Resource标签配置的name”);
Connectionconn=ds.getConnection();//就可以得到Source中的一个连接;JVM是不能实例化Web的,因为这是JVM执行的
配置Tomcat中的conf下的Context.xml(如果是低版本的Tomcat可能没有context.xml那么可以包Source标签写在Server.xml配置文件中)之后,可以不需要配置web.xml,在把sqljdbc.jar包放到Tomcat下的lib或者common文件夹的下面
25,属性文件(properties)读取 ,新建一个初始化读取配置文件的类
publicclassReadPropetiesextendsProperties{
privatestaticReadPropetiesread;
publicstaticReadPropetiesgetInstance(){
if(read==null){
read=makeInstance();
returnread;
}else{
returnread;
}
}
privatestaticsynchronizedReadPropetiesmakeInstance(){
if(read==null){
read=newReadPropeties();
}
returnread;
}
privateReadPropeties(){
InputStreaminput=this.getClass().getResourceAsStream("/db.properties");
//getClass()返回一个对象的运行时类,可在new之后或在构造方法中用
try{
load(input);//Properties这个类的方法
}catch(IOExceptione){
//TODO自动生成catch块
e.printStackTrace();
}
}
再在别的类中用ReadPropetess.getInstance().getPropeties(key):
根据对象的getPropeties(key)来读取db.properties文件中的key=value的值配置文件如下
driverClass=com.microsoft.sqlserver.jdbc.SQLServerDriver
url=jdbc:
sqlserver:
//localhost:
1433;DatabaseName=restrant
user=sa
password=sa2005
26,toString();//返回该对象的字符串表示,在Object类中是返回对像的地址信息;每一个类都有一个toString()方法,故可以重写toString()返回,最好在转换类型的时候哦不要用toString();
27,工具类Dao类
packagecom.restrant.dao;
importjava.sql.Connection;
importjava.sql.PreparedStatement;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.util.List;
importjavax.servlet.jsp.jstl.sql.Result;
importjavax.servlet.jsp.jstl.sql.ResultSupport;
publicclassSQLCommand{
privateConnectionconn=null;//数据库的连接对象
privateStringsqlValue=null;//执行的操作的SQl语句
privateListlist=null;//执行SQL语句中的参数
publicvoidsetConn(Connectionconn){
this.conn=conn;
}
publicvoidsetList(Listlist){
this.list=list;
}
publicvoidsetSqlValue(StringsqlValue){
this.sqlValue=sqlValue;
}
publicResultexecuteQuery(){
Resultresult=null;
ResultSetrs=null;
PreparedStatementpstmt=null;
try{
pstmt=conn.prepareStatement(sqlValue);
if(list!
=null&&list.size()!
=0){
setValues(pstmt,list);
}
rs=pstmt.executeQuery();
result=ResultSupport.toResult(rs);
}catch(SQLExceptione){
//TODO自动生成catch块
e.printStackTrace();
}finally{
closeAll(rs,pstmt,conn);
}
returnresult;
}
/**
*执行增删改
*@return执行的结果
*/
publicintexecuteUpdate(){
intresult=-1;
PreparedStatementpstmt=null;
try{
pstmt=conn.prepareStatement(sqlValue);
if(list!
=null&&list.size()!
=0){
setValues(pstmt,list);
}
result=pstmt.executeUpdate();
}catch(SQLExceptione){
//TODO自动生成catch块
e.printStackTrace();
}finally{
closeAll(null,pstmt,conn);
}
returnresult;
}
privatevoidsetValues(PreparedStatementpstmt,Listlist){
try{
for(inti=0;ipstmt.setObject(i+1,list.get(i));
}
}catch(SQLExceptione){
//TODO自动生成catch块
e.printStackTrace();
}
}
/**
*释放资源
*@paramrs
*@parampstmt
*@paramconn
*/
privatevoidcloseAll(ResultSetrs,PreparedStatementpstmt,Connectionconn){
if(rs!
=null){
try{
rs.close();
}catch(SQLExceptione){
//TODO自动生成catch块
e.printStackTrace();
}
rs=null;
}
if(pstmt!
=null){
try{
pstmt.close();
}catch(SQLExceptione){
//TODO自动生成catch块
e.printStackTrace();
}
pstmt=null;
}
if(conn!
=null){
try{
conn.close();
}catch(SQLExceptione){
//TODO自动生成catch块
e.printStackTrace();
}
conn=null;
}
}
}
//Result不是Java包下的对象,故要添加包,点中自己的项目名----右键-------MyEclipse--------AddJSTLLib……..导入外界的包;这样才可以用Result对象和RResultSupport.toResult(rs)
SQLCommandcommand=newSQLCommand();
conn=DBConnection.getConnection();
command.setConn(conn);
command.setSqlValue(sql);
Resultrs=command.executeQuery();
introwCount=rs.getRowCount();//Result对象的getRowCount()的方法可以得到多少条记录
for(inti=0;iMapmap=rs.getRows()[i];//rs.getRows()[i]这是获得Result对象的所有行的第[i]条记录的Map对象//这样key就是数据库中的字段的名字,value就是对应的key的值
FoodBeanfood=newFoodBean();
food.setFoodId((String)map.get("foodID"));
food.setFoodName((String)map.get("foodName"));
food.setRemark((String)map.get("remark"));
food.setFoodPrice(((BigDecimal)map.get("foodPrice")).doubleValue());
food.set