cms知识总结.docx
《cms知识总结.docx》由会员分享,可在线阅读,更多相关《cms知识总结.docx(61页珍藏版)》请在冰豆网上搜索。
cms知识总结
Cms第一天3.23
CMS开发全过程介绍
1.Web项目开发的一般流程
a)需求确定
b)需求分析
i.架构分析和设计
ii.业务逻辑分析和设计
iii.界面设计
iv.数据库的设计
c)开发环境搭建
d)开发和测试
e)文档编写
2.项目简介
a)项目名称:
CMS(体育网站内容发布系统)
b)项目简介:
体育视频交流网站是一个利用p2p技术来分享交流视频内容的一个网站,本网站建立的基础是在网上网民提供视频连接的基础上,而不是直接来提供视频直播与分享,只是分享P2P连接.
c)职责:
负责需求的调研、系统设计、编码和单元测试,以及产品上线后的bug跟踪,服务器流量和性能的监控。
d)使用技术:
jsp/jdbc/servlet/jsptag.
3.CMS业务流程
国家->参赛队赛事-比赛->体育项目用户权限角色广告赔率(与外部网站的接口)
4.CRUD(Create、Read、Update、Delete)
5.搭建开发环境
a)启动Oracle进入sqlplus,以system用户登录,执行如下命令
Sqlplussys/sysassysdba
i.@D:
\share\cms.sql
b)Oracle常用命令
i.selecttable_namefromuser_tables;
ii.selectview_namefromuser_views;
iii.selecttrigger_namefromuser_triggers;
iv.selectsequence_namefromuser_sequences;
v.run、/、r执行当前缓存区中的命令
vi.L(list)显示当前缓冲区中的命令
vii.showuser显示当前连接用户
viii.selectnamefromv$database;当前执行的那个instance下面
ix.setlinesize400输出一行字符串的个数(缺省为80)\
x.alteruserxxxxxaccountunlock
xi.selectconstraint_name,constraint_type,table_namefromuser_constraintswheretable_name='CMS_USER';
c)采用MyEclipse建立cms项目
d)将demo下的所有文件拷贝到webroot下
e)将Oracle的jdbc驱动拷贝到WEB-INF/lib下
6.在本项目中具体会用到的知识
a)Servlet
i.Filter
ii.Httpsession
iii.JDBC
iv.AJAX
v.Jsp
vi.Html
vii.Javascrip
ERRORatline1:
ORA-01940:
cannotdropauserthatiscurrentlyconnected
当前有用户正在使用当前数据库
selectsid,serial#fromv$session
2whereusername='AA';
altersystemkillsession'136,33';
学习智慧和提问的智慧:
学习好基础,基础比什么都重要
学会学习,学会思考,google并不是我们唯一利用的工具,比如jdbc有些用法不清楚,观看api,你不明白,到哪里去找,www.jcp.org或者,找相关官方文档
学习不要求内容多,但要求每个内容都理解透,能够融会贯通。
学习java就要首先学会,debug以及单元测试,等你debug过后不明白然后才问别人。
Java知识体系都是有据可寻的,不是只有从搜索来的,任何一部分知识内容的来源都是来源于规范。
解决问题的能力,绝对脑子死记灌输的知识更加重要。
Myeclipse6.01的安装使用,安装完毕后设置几个参数%Myeclpse_home%/eclipse/eclipse.ini
-showsplash
com.genuitec.myeclipse.product
--launcher.XXMaxPermSize
256m
-vmargs
-Xms128m
-Xmx512m
-Duser.language=en
-XX:
PermSize=128M
-XX:
MaxPermSize=256M
关于oracle会出现的问题,有以下几种情况
1:
TNSlistener问题,可以删除listener重新建一个
2:
如果有使用代理软件的,用客户端连不上oracle的,请关掉代理软件
3:
有的人可以改了oracle的1521端口,或者不确认这个端口被杀毒软件或者其他软件屏蔽的问题,可以telnet127.0.0.11521看看能否telent上去,如果能的话也不能确定是oracle开放的这个端口,如果确认呢?
Netstat/hnestat–abn
如果哪一个端口占用了比如8080端口,你可以杀掉这个进程ntsd-cq-pPID
关于需求方面的知识,请仔细看PPT
CMS第二天3.24
1:
建立webproject
a):
建立webproject选择J2ee1.4不用选择jstl,拷贝prototype到WebRoot
b)Myeclipse建立一个server,并且要enbale
c部署web到建立好的server上去
d)拷贝ojdbc14.jar到web-inf/lib下面
e)写一个DB测试类。
f)注意检查自己的jdk的设置,编译如果用5.0那么jre也要选择5,最好选择一个版本
不要出现一个1.4一个5的情况
2:
JDBCdriver4种类型
a:
jdbc-odbc桥接方式
依靠sun提供的一个 jdbcodbcdirver,可移植性差
publicstaticConnectiongetBridgedConnection(){
Connectionconn=null;
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn=DriverManager.getConnection("jdbc:
odbc:
cms","cms","cms");
}catch(ClassNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnconn;
}
b:
依赖数据库供应商提供的客户端的实现,可移植性差,但是效率比较高
publicstaticConnectiongetOciConnection(){
Connectionconn=null;
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection(
"jdbc:
oracle:
oci:
@127.0.0.1:
1521:
sxt","cms","cms");
}catch(ClassNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnconn;
}
c:
中间件来实现,适合分布式应用,中间件会优化
用tomcat建立connectionpool就是其中的一种(详见3用tomcat创建一个数据库连接池)
d:
纯javadirver实现,可移植性很好,我们最常用的一种方式。
publicclassDB{
publicstaticConnectiongetConnection(){
Connectionconn=null;
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection(
"jdbc:
oracle:
thin:
@127.0.0.1:
1521:
bjsxt","cms","cms");
}catch(ClassNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnconn;
}
3:
用tomcat创建一个数据库连接池(第四天课程会涉及到)
publicstaticConnectiongetConnectionFromPool(){
Connectionconn=null;
DataSourceds=null;
Contextcontext=null;
try{
context=newInitialContext();
ds=(DataSource)context.lookup("java:
comp/env/jdbc/cms");
conn=ds.getConnection();
}catch(NamingExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnconn;
}
4:
自己手写一个连接池
ackagecom.bjsxt.cms.util;
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.SQLException;
importjava.util.Vector;
/**
*数据库连接池
*
*@authorAdministrator
*
*/
publicclassDBConnectionPool{
privatefinalstaticintMAX_SIZE=10;
privatefinalstaticintMIN_SIZE=3;
privatefinalstaticVectorpool=newVector();
static{
for(inti=0;ipool.add(createConnection());
}
}
/**
*得到一个数据库的连接,如果当前池里面没有连接,创建一个新的联机,如果数据库联机池里面有连接,那么从池里面得到
*
*@return
*/
publicstaticsynchronizedConnectiongetConnection(){
System.out.println(pool.size());
Connectionconn=null;
if(pool.isEmpty()){
conn=createConnection();
}else{
intidx=pool.size()-1;
conn=(Connection)pool.get(idx);
pool.remove(conn);
}
returnconn;
}
/**
*
*createaconnectionbyDriverManager
*
*@return
*/
privatestaticConnectioncreateConnection(){
Connectionconn=null;
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection(
"jdbc:
oracle:
thin:
@127.0.0.1:
1521:
sxt","cms","cms");
}catch(ClassNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnconn;
}
/**
*closeconnectionifpoolsizelargerorequalMAx_sizeifthenumberof
*poolsizelessthanMax_size,putbacktothepool
*@paramconn
*/
publicstaticsynchronizedvoidclose(Connectionconn){
if(pool.size()>=MAX_SIZE){
try{
conn.close();
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}elseif(pool.size()pool.add(conn);
}
}
}
5:
单例的4种实现方式:
第一种方式,预先加载的问题,可能再没有手动创建对象的时候已经实例化了变量
privatestaticfinalUserServiceuserService=newUserService();
privateUserService(){
}
//在第一种方式下面,不需要加锁
publicstaticUserServicegetInstance(){
returnuserService;
}
//第二种排队现象比较严重,会出现性能问题
privatestaticUserServiceuserService=null;
privateUserService(){
}
publicstaticsynchronizedUserServicegetInstance(){
if(userService==null){
userService=newUserService();
}
returnuserService;
}
//第三种方式容易造成创建多个对象的问题,特别第一创建对象的时候,另外一个线程已经进入if(userService==null)等候synchronized,执行完毕,然后会创建第二个实例,所以会出现并不是单例的情况
publicstaticUserServicegetInstance(){
if(userService==null){
synchronized(UserService.class){
userService=newUserService();
}
}
returnuserService;
}
//第四种方式避免了第三种创建多个实例现象,并且避免了多个线程排队等候的现象,双检查的情况
publicstaticUserServicegetInstance(){
if(userService==null){
synchronized(UserService.class){
if(userService==null)
userService=newUserService();
}
}
returnuserService;
}
总结:
单例模式的要素
a)私有的静态的成员变量
b)私有的构造方法
c)公共的静态的入口点方法
cms第三天3.26
1:
用户前端后端验证的问题:
a:
前台的验证javascript,验证长度,输入是否合法
b:
提交时候后台验证
b1:
在service中增加验证用户是否存在的方法isExist()
b2:
通过单元测试,测试一下isExist()是否能运行成功
b3:
在userAddservlet中调用验证方法来验证用户名是否重复,
导向到不同的页面上去
b4:
如果用户添加经过验证后,当前用户存在,导向之后页面应该保存用户的基本信息,以方便用户改正,而不用重新输入。
2:
注意的几个问题:
a:
servlet重新载入的问题
b:
单元测试一定要进行
3:
几个path区别与联系:
ServletPath、Contextpath、pathinfo、reuquestURI
Contextpath:
webapp的根目录“/”开头
Servletpath里面设置servlet相应路径也是以”/”开头结尾不是”/”
pathinfo是jsp里面的额外的路径,这个路径的前面是里面通配的一个路径
requestURI=ContextPaht+servletPath+pathinfo
Cms第四天3.27
1:
分页
a)oracle的分页
rownumoracle里面的一个伪列,现有结果集,后分配rownum
从1开始,不会从大于1数开始。
如果在where子句中加入了rownumn(n>1)的情况下,查询结果为空
也就是说ronum在>1的情况下,是动态变化的,通过子查询可以固定主rownum的值,通过子查询比较rownum>n的情况,然后得到结果集。
selectt.rn,t.id,t.name,t.password,t.email,t.valid,t.phone,t.time_stampfrom(selectrownumrn,id,name,password,email,valid,phone,time_stampfromcms_userwherenamelike'%c%'andrownum<5)twheret.rn>=2;
b)分页的要素
B1:
查询提交
B2:
导航到第几页
c)设计一个分页的对象
pageList对象
pagelist的基本属性
pagesize每页显示的最大行数是多少
pageNum当前的页
rowCount当前查询的所有结果集的数量,总数量
pageCount当前查询所查询出来的琐有的页数
List是当前页的记录,里面存储的是对象
d):
构建一个查询方法
据我们的pageList查询,返回当前pagelist
根据分页得到当前页
计算所有的行
根据所有的行数和每页最大显示数量计算出,总共有多少页
e):
pageList在前台页面显示策略
1:
如果所有的页数>1
2:
如果我们当前页>1
如果当前页<所有的页数:
第一页,前一页,后一页,最后页
如果当前页=所有的页数:
第一页,前一页
3:
如果我们当前页<=1
显示后一页,最后页
javascript正则表达式
^[1-9][0-9]*$
^匹配开始[0-9]0到9的数字*0个或者多个$结尾
ascascend
descdescend
CMS第五天3.28
1:
ajax简介
a:
AsynchronousJavascriptandXML
典型的流程
A1:
客户端触发异步操作
A2创建新的XMLHttpRequest对象
A3与Server进行连接
A4服务器端进行连接处理
A5返回包含处理结果的XML文档
A6XMLHttpRequest对象接收处理结果并分析
A7更新页面
传统的client与server的交互流程
AJAX的流程
Ajaxxmlhttp对象的属性
XMLHTTP对象常用方法
2:
ajax的流程
3:
ajax常出现的问题,以及解决办法
使用Ajax技术需要清除缓存,否则容易产生莫名其妙的错误,具体有两种方法:
第一种,采用URL后跟上时间戳来防止浏览器缓存,如:
user_validate.jsp?
userId="+userId+"×tampt="+newDate().getTime()
第二种,加入清除缓存代码,如
response.setContentType("text/xml");
response.setHeader("Cache-Control","no-store");//HTTP1.1
response.setHeader("Pragma","no-cache");//HTTP1.0
response.setDateHeader("Expires",0);
4:
创建数据库连接池
MAX_SIZE=10最大数量
MIN_SIZE=3数据库连接池的初始化数量
IDL_SIZE=5
MAX_size是数据库联机池最大connection的数量