还剩79页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
第一讲(参考《J__aWeb程序设计基础教程》第1章)1JSP和J__a的关系 一般J__a指的标注版J__aSE 另外两个版本J__aEE和J__aME JSP属于J__aEE的一部分 J__aEE 组件Web层组件(JSP+Servlet)+业务层组件(EJB) 服务JNDIJDBCRMIJAASJ__a__il等等 J__aEE包括2个体系标准(上面介绍的)+流行(Struts+Hibernate+Spring) 两套体系都是JSP+Servlet为基础2JSP会涉及哪些内容 JSP语法基础(J__a+HTML) 对于HTML,主要表单元素(输入)+表格(显示信息)+基本HTML JSTL,标准标签库,用于输出和控制 EL,通常与JSTL一起使用,主要用于输出 Servlet,几乎所有介绍JSP的书和课程都包含Servlet,因为JSP实际上指的是J__aWeb__用Servlet主要是控制器 JDBC,对数据库的访问 J__aBean(J__a类)3JSP的运行环境 JDK 服务器我们用Tomcat其它的服务器IBMWebsphere+BEAWebLogic +JBoss(免费的)+GlassFish新出的J__aEE5服务器4JSP的__环境 页面DreamWe__er__页面 代码本文编辑器EclipseNetBeansJBuilder 注我们采用记事本5Tomcat文件夹 webapps 主要各个应用,编写的每个应用(__)都可以放在这个位置 bin 这个是启动服务器的相关文件,tomcat6用于命令行方式的启动,tomcat6w用于windows方式的启动 conf 用于配置,常用的是server.xml另外一个是web.xml work存放临时文件 logs 系统运行时候的日志信息6实例hello.jsp 创建一个应用,实际上需要在webapps中创建文件夹,bookstore,相当于应用的名字 文件夹中要创建一个子文件夹WEB-INF,这个每个应用web应用都需要的 在WEB-INF中需要web.xml,是web应用的配置文件,还应该有classes和lib子文件夹(存放类文件) JSP文件和HTML文件直接放在bookstore下面 hello.jsp文件内容如下%@pagecontentType=text/html;charset=gb2312%!--上面的代码声明文档类型和编码方式,每个JSP文件基本上都会有--html head title第一个JSP程序/title /head body Hello晚上好! /body /html 先启动服务器 访问程序 http表示协议 8080表示服务的端口,上网的时候不用输入端口,因为采用了默认的端口,默认端口80 bookstore表示应用,是应用的名字 hello.jsp就是资源7JSP的运行原理 过程 首先启动服务器,并且要保证应用在服务器上(把应用放在webapps下面,会自动加载) 在客户端通过浏览器发送请求(在地址栏中输入地址) 服务器接收到请求之后,查找有没有这个文件对应的J__a文件的对象如果没有这个对象,需要创建(先把JSP文件转换成J__a文件, 编译成.class文件,加载类并创建对象),然后调用对象的相应方法,方法完成对用户的响应,通常是输出的html代码) 客户端接收到的是html代码,浏览器解析这个代码生成页面 8表格的语法 开始标志table 结束标志/table 中间是行,每行是一个tr /tr 每行之间是列,每一列对应td/td td/td之间的内容就是每个表格中的信息*************************************************第一讲结束阳光2008-11-1519:54:57第二讲(参考《J__aWeb程序设计基础教程》第2章)
1、form 只要是涉及向服务器提交信息,都应该使用form 基本语法结构 formaction=目标文件method=get|post 各种表单元素 /form action属性决定的目标文件来对用户提交的信息进行处理
2、常用的表单元素 单行文本框用于输入少量的信息 基本语法格式 inputtype=textname=名字value=值 type=text就说明这是单行文本框; name指出文本框的名字,最好不要用汉字,最好使用有意义的名字; value指出默认值,如果没有默认值,可以不要value属性,value属性经常在修改的时候使用 注意如果有格式要求,要明确的告诉用户 __框用于输入__ 基本的语法格式 inputtype=passwordname=名字value=值 注意设置__的时候,应该使用确认__,应该有两个__框 提交按钮当__它的时候,会把输入的信息提交给服务器 基本语法格式 inputtype=submitvalue=值 type应该为submit,value是显示在按钮上面的信息 复位按钮当__它的时候,会把各个表单元素的值恢复到默认值 基本语法格式 inputtype=resetvalue=值 普通按钮也可以完成提交,还可以完成方法的调用 基本语法格式 inputtype=buttonvalue=值 单选按钮通用用于在多个选项中选择一个 基本语法格式 inputtype=radioname=名字value=值 这个表示一个单选按钮,并且仅仅是一个按钮 例,选择性别 inputtype=radioname=___value=1checked男 inputtype=radioname=___value=0女 如果希望在多个选项中选择一个(有互斥性),必须让他们的名字一致 复选框用于多选 基本的语法格式 inputtype=checkboxname=名字value=值 显示给用户的信息与提交给服务器的信息没有关系 如果希望多个选项是一组,应该使用相同的名字 下拉列表用于选择,可以单选,也可以多选 基本语法格式 selectname=名字 optionvalue=1selected1/option optionvalue=22/option ... /select 每个选项使用一个option,使用value属性指出该选项的值,在option和/option之间是显示给用户的值 文本域用于输入大量的信息 基本语法格式 textareaname=名字cols=列数rows=行数 默认值 /textarea 要为这个文本域赋默认值,需要把值放在开始标志和结束标志之间,而不是使用value属性
3、完成输入的时候应该注意的问题 对格式的要求必须明确,包括长度、数字、日期、e__il、__、必添 能够从系统中获取的信息不要让用户提供,例如当前时间 能够选择的信息不要让用户输入 按照信息的重要程度安排表单元素在界面中的位置
4、对用户输入信息进行验证 要用J__aScript,使用下面的标记 scriptlanguage=j__ascript //J__aScript代码 /script 要写方法 functioncheck{ } 方法可以不用定义返回值,但是可以有返回值 获取用户输入的值 document表示当前文档,form1表示表单的名字,username表示该表单中表单元素的名字,value表示得到值 把表单提交与方法关联可以使用表单的onSubmit__ 例scriptlanguage=j__ascript functioncheck{ ifusername.length6||username.length8{ alert用户名长度不合适!; returnfalse; }else{ returntrue; } }/script 使用button的onClick__进行验证 首先要把提交按钮修改成普通按钮; 在普通按钮上增加__onClick=j__ascript:check*************************************************第二讲结束阳光2008-11-1519:55:56第三讲(参考《J__aWeb程序设计基础教程》第
3.4章)
1、include指令 作用把多个文件中需要共享的代码放在单独的文件中,然后在需要的时候使用该指令引入这个文件典型的应用,把__的头部和版权信息放在单独的文件中,在其他文件中包含这两部分 基本的语法格式 %@includefile=目标文件% file属性指出目标文件 header.jsp中的内容如下%@pagecontentType=text/html;charset=gb2312%table align=__nterwidth=780 trheight=100 tdalign=__nterh1___店/h1/td /tr tr tdalign=__nter !--超链接的基本格式 -- ahref=register.jsp注册/a 最新图书最畅销图书查询图书修改__查询订单购物车/td /tr tr tdhr/td /tr%@pagecontentType=text/html;charset=gb2312%%@includefile=header.jsp% tr td table tr td !--登录界面代码-- formaction=login_pro__ss.jspmethod=post !--主要是涉及提交信息,就要用到form,action决定了提交给哪个文件处理-- 用户名inputtype=textname=usernamevalue=aaabr 口令inputtype=passwordname=userpassvalue=br inputtype=submitvalue=登录inputtype=resetvalue=重写 /form /td td 欢迎光临我们的书店! /td /tr /table /td /tr/table运行过程在转换的时候,当遇到include指令的时候会把include指令指向的目标文件的内容拷贝到当前位置,替换include指令,这样最后形成一个文件然后才编译形成class文件,然后运行
2、jsp:forward标签 我们使用登录功能的模拟来介绍 首先,使用J__a代码完成判断,使用jsp:forward完成跳转,代码%@pagecontentType=text/html;charset=gb2312%% //先获取用户输入的用户名和口令,然后判断是否合法 Stringusername=request.getParameterusername; Stringuserpass=request.getParameteruserpass; ifusername.equalszhangsanuserpass.equalszhangsan {% jsp:forwardpage=suc__ss.jsp/% }else{% jsp:forwardpage=index.jsp/% }% jsp:forward的语法格式 jsp:forwardpage=目标文件/ page属性指出转向的目标文件最后的结束符为“/”,斜杠不能省略 另外一个可以完成跳转的方式是采用response.sendRedirectresponse和request一样,都是内容对象,可以直接访问修改上面的文件%@pagecontentType=text/html;charset=gb2312%% //先获取用户输入的用户名和口令,然后判断是否合法 Stringusername=request.getParameterusername; Stringuserpass=request.getParameteruserpass; ifusername.equalszhangsanuserpass.equalszhangsan { response.sendRedirectsuc__ss.jsp; }else{ response.sendRedirectindex.jsp; }% jsp:forward和response.sendRedirect的运行效果相同(针对上面的这个例子) 相同点都是转向目标文件 不同点地址栏中显示的内容是不相同的,如果使用jsp:forward,地址栏显示当前文件的名字,如果使用response,地址栏显示的是转向后的文件的名字执行过程不同使用jsp:forward相当于一次请求,使用response相当于两次请求 使用jsp:forward的情况 index.jsp中输入用户名和口令,提交给login_pro__ss.jsp,服务器保存用户的输入信息,使用jsp:forward转向suc__ss.jsp之后,suc__ss.jsp还可以访问用户输入的信息,因为输入同一次请求 使用response的请求 index.jsp中输入用户名和口令,提交给login_pro__ss.jsp,服务器保存用户的输入信息,使用response的sendRedirect方法相当于重新向服务器发送一次请求,这样上次的请求内容(用户名和口令)就不能共享了
3、jsp:include标签 把index.jsp中%@include=header.jsp%替换成jsp:includepage=header.jsp/ 从运行效果上相同 不同点
1、两个文件,目标文件是单独运行的,当前文件运行到jsp:include标签的时候,转向执行标签所指向的目标文件,执行之后返回继续标签之后的内容
2、%@include%指令是在编译(转换)的时候使用,jsp:include在运行的时候起作用
4、jsp:include和jsp:forward区别 把login_pro__ss.jsp中的jsp:forward替换成jsp:include%@pagecontentType=text/html;charset=gb2312%% //先获取用户输入的用户名和口令,然后判断是否合法 Stringusername=request.getParameterusername; Stringuserpass=request.getParameteruserpass; ifusername.equalszhangsanuserpass.equalszhangsan {% jsp:includepage=suc__ss.jsp/% }else{% jsp:includepage=index.jsp/% }% 运行效果是相同的但是有不同点,修改代码如下%@pagecontentType=text/html;charset=gb2312%处理文件的前半部分br% //先获取用户输入的用户名和口令,然后判断是否合法 Stringusername=request.getParameterusername; Stringuserpass=request.getParameteruserpass; ifusername.equalszhangsanuserpass.equalszhangsan {% jsp:includepage=suc__ss.jsp/% }else{% jsp:includepage=index.jsp/% }%br处理文件的后半部分两次运行结果不相同分析原因 jsp:forward:先执行标签之前的内容,遇到标签的时候转向执行目标文件,执行完不返回,显示的内容为目标文件的内容,标签之前的内容执行,但是不显示标签之后的内容不会执行,当然更不会显示 jsp:include先执行标签之前的内容,遇到标签转向执行目标文件,执行完返回,继续执行标签之后的内容,显示的内容为标签之前的内容+目标文件的内容+标签之后的内容,标签的前后都执行,都显示
5、使用标准标签库(JSTL)完成登录的判断过程3使用标签c:iftest= /c:if 要完成判断,可以使用标签标签库中的c:if标签标签的基本格式 c:if test=条件成功要执行的内容/c:if test表示测试条件,测试条件可以写常量,可以是表达式语言(EL,主要用于输出),主要使用表达式语言 例如要判断用户提交的用户名和口令是否是zhangsan c:iftest=${param.username==\zhangsan\param.userpass==\zhangsan\} jsp:forwardpage=suc__ss.jsp/ /c:if 注意添加完标准标签库之后,需要重新启动服务器
6、使用session保存登录后的信息 在__中设置了applicationsessionrequestpageContext对象保存内存中的信息application是__所有用户共享的存储变量的位置session是__为每个访问__的人创建的,每个用户对应一个session,也是存放变量的位置request是为每个用户的每次请求设置的存储信息的位置,每次访问会有一个requestpageContext是每次访问的每个页面对应一个常用的session和request多次访问之间要共享信息可以使用session,如果在某次访问的多个页面之间共享信息使用request(例如,使用jsp:forwrad转向的文件和当前文件就属于同一次请求) 登录后的用户信息应该放在session中 要在这些范围中保存信息,可以使用标准标签库中的c:set标签完成 c:set的基本语法格式 c:setvar=变量的名字scope=范围value=值/ 要把用户名放到session中 c:setvar=usernamescope=sessionvalue=${param.username}/*************************************************第三讲结束阳光2008-11-1519:57:13第四讲(参考《J__aWeb程序设计基础教程》第6章)
1、对Servlet的理解 Servlet是一种J__a类 Servlet能够完成与JSP相同的功能能够接收用户的请求,能够调用功能类的方法,可以对用户进行响应 Servlet和JSP同属于J__aEE中Web层组件
2、如何编写一个Servlet 假设该Servlet的功能为显示欢迎信息 J__a文件的编写过程1声明包2引入用到的其他的类3类的编写 对于类
(1)类头——修饰符class关键字类名继承父类实现接口
(2)类体——成员变量构造方法对属性进行操作的方法功能类方法 对于成员变量修饰符类型变量名(对象名) 对于方法(不包括构造方法)修饰符返回值类型方法名参数列表异常列表方法体 对于方法体变量的声明各种运算调用其他的方法返回结果
(1)声明包,假设包名为servletpackageservlet;
(3)类头的定义 访问控制符public 类名HelloServlet 实现接口没有要实现的接口publicclassHelloServletextendsHttpServlet
(4)方法的定义 主要的方法init方法(用于初始化)destroy方法(释放资源)doGet或者doPost(完成主要功能) 通常主要实现doGet方法或者doPost方法,分别对应客户端的get请求和post请求publicvoiddoGetHttpServletRequestrequestHttpServletResponseresponsethrowsIOEx__ptionServletEx__ption{ //设置编码方式GB2312GBKutf8 response.setContentTypetext/html;charset=gb2312; //得到输出流对象 PrintWriterout=response.getWriter; out.println欢迎学习JSP!;}publicvoiddoPostHttpServletRequestrequestHttpServletResponseresponsethrowsIOEx__ptionServletEx__ption{ doGetrequestresponse;}
3、编译存放 放在(编译后的Servlet)WEB-INF/classes 配置path:把C:\ProgramFiles\J__a\jdk\bin添加到path中,但是不能破坏原有的路径 配置classpath把C:\ProgramFiles\ApacheSoftwareFoundation\Tomcat
6.0\lib\servlet-api.jar;添加到classpath中 编译在命令行方式下进入到classes目录,然后使用j__ac-d.HelloServlet.j__a -d表示生成包的路径,.表示在当前位置生成
4、配置Servlet 配置文件及位置WEB-INF下面的web.xml 配置包括两个方面Servlet的声明以及Servlet访问方式的声明 Servlet的声明 servlet servlet-namehello/servlet-name servlet-classservlet.HelloServlet/servlet-class /servlet 其中,servlet-name表示这个servlet的名字,可以随便起servlet-class是对应的Servlet类,应该包含包的信息 Servlet访问方式的声明 servlet-__pping servlet-namehello/servlet-name url-pattern/hello/url-pattern /servlet-__pping 其中,servlet-name和Servlet声明中的用法相同,并且应该与Servlet声明中的名字保持一致url-pattern表示访问方式,决定了在客户端如何访问这个Servlet
5、访问Servlet
6、用Servlet完成login_pro__ss.jsp的功能 login_pro__ss.jsp主要功能,判断用户输入的用户名和口令是否合法,然后根据判断的结果选择界面对用户响应 对于JSP文件来说,优势在于显示信息,login_pro__ss.jsp中的代码都不是显示信息的,主要用于控制在J__aWeb应用中存在大量的这种现象是J__aWeb中的控制功能主要使用Servlet完成控制 login_pro__ss.jsp的基本功能获取用户的输入信息;进行判断;转向 如果使用Servlet完成,功能代码应该写在doGet或者doPost方法中对应上面的3个功能分别实现如下 获取用户信息用户信息存储在doGet或者doPost方法的第一个参数中,所以从参数中获取,获取的代码为 Stringusername=request.getParameterusername; Stringuserpass=request.getParameteruserpass; 判断 ifusername.equalszhangsanuserpass.equalszhangsan 转向响应界面 第一种方式response.sendRedirectindex.jsp; 第二种方式与jsp:forward功能相同 RequestDispatcherrd=request.getRequestDispatcherindex.jsp; //参数是要转向的页面 rd.forwardrequestresponse;//完成跳转LoginPro__ssServlet.j__a代码如下packageservlet;publicclassLoginPro__ssServletextendsHttpServlet{ publicvoiddoGetHttpServletRequestrequestHttpServletResponseresponsethrowsIOEx__ptionServletEx__ption { //获取用户输入的信息 Stringusername=request.getParameterusername; Stringuserpass=request.getParameteruserpass; ifusername.equalszhangsanuserpass.equalszhangsan { RequestDispatcherrd=request.getRequestDispatchersuc__ss.jsp; //跳转到成功的页面 rd.forwardrequestresponse;//完成跳转 }else { RequestDispatcherrd=request.getRequestDispatcherindex
1.jsp; //跳转到登录页面 rd.forwardrequestresponse;//完成跳转 } } publicvoiddoPostHttpServletRequestrequestHttpServletResponseresponsethrowsIOEx__ptionServletEx__ption { doGetrequestresponse; }}配置文件中添加如下代码 servlet servlet-namelogin_pro__ss/servlet-name servlet-classservlet.LoginPro__ssServlet/servlet-class /servlet servlet-__pping servlet-namelogin_pro__ss/servlet-name url-pattern/login_pro__ss/url-pattern /servlet-__pping修改index
1.jsp的代码(修改form所在行),修改前formaction=login_pro__ss.jspmethod=post修改后formaction=login_pro__ssmethod=post*************************************************第四讲结束阳光2008-11-1519:58:33第五讲(参考《J__aWeb程序设计基础教程》第
5、7章)
1、J__aBean J__aBean是使用J__a语言编写的组件组件是组成一个大的系统的一部分,并且组件能够完成特定的功能,能够共享 可以认为J__aBean是J__a类,但是具有特定的功能,并且这些功能是共享的例如,连接数据库的功能可以封装单独的J__a类,常用处理方法可以封装成J__aBean
2、早期的JSP中提供的对J__aBean的支持 jsp:useBean标签用于定义J__aBean的对象;jsp:setProperty标签用于设置J__aBean的属性;jsp:getProperty用于获取并输出J__aBean的属性 因为J__aWeb中,很少在JSP中直接访问J__aBean,所以实际上这些标签几乎没有用现在主要在Servlet中访问J__aBean
3、J__aBean的编写和用法 例以用户信息验证为例介绍J__aBean的编写 1)声明包packagebean; 2)引入相应的类或者包//j__a.sql是访问数据库所需要的包 3)类头的定义publicclassUserBean 4)成员变量privateStringusername;privateStringuserpass; 5)构造方法//J__aBean要求应该提供一个无参数的构造方法 publicUserBean{ } publicUserBeanStringusernameStringuserpass{ this.username=username; this.userpass=userpass; } 6)对属性进行操作的方法 包括获取属性值的方法和对属性进行赋值的方法 命名方法 对于普通属性来说,如果属性为a,应该提供setA属性类型a方法和getA方法 对于布尔类型的属性来说,应该提供类似于isA方法 publicvoidsetUsernameStringusername{ this.username=username; } publicStringgetUsername{ returnusername; } publicvoidsetUserpassStringuserpass{ this.userpass=userpass; } publicStringgetUserpass{ returnuserpass; } 7)功能类方法 该J__aBean完成的功能是判断用户信息是否合法,需要在J__aBean中编写相应的方法 publicbooleanlogin{ returnusername.equalsuserpass; } 8)编译J__aBean 9)部署 所有的J__a类都应该放在WEB-INF下面的classes下面,所以该J__aBean也应该放在这个地方
4、使用JDBC的准备工作 JDBC是J__aDataBaseConnectivity的缩写,是一组标准的接口,用于完成J__a应用与各种数据库之间的交互 要使用JDBC需要做哪些准备工作? 1)创建数据库 2)得到JDBC驱动程序,驱动程序是完成具体的交互过程的,每种数据库有自己特定的驱动程序,从数据库管理系统的提供商的__下载 3)要知道数据库的相关信息JDBC驱动程序的名字、数据库的位置、数据库的端口、用户名和口令、url的格式(建立连接的时候用) 注意我们使用JDBC-ODBC桥的方式连接数据库JDBC-ODBC桥是一种类型的驱动程序,共有4种类型的驱动程序,JDBC-ODBC桥是建立在ODBC数据源基础上的驱动是JDK中附带的,不用下载
5、创建数据库及测试数据createtableusertable usernamevarchar10pri__rykey userpassvarchar10insertintousertablevalueslisilisi;insertintousertablevalueszhangsanzhangsan;
6、创建ODBC数据源 在开始--〉设置--〉控制面板--管理工具--〉数据源(ODBC) 设置ODBC数据源的名字为bookstore
7、修改login方法,通过数据库进行验证 1)使用JDBC连接数据库的基本过程 加载驱动程序; 建立与数据库之间的连接; 创建一个执行SQL语句的语句对象; 编写要执行的SQL语句; 使用语句对象执行SQL语句; 如果有结果,需要对结果进行处理; 关闭相关对象; 注意异常处理 2)修改login方法 publicbooleanloginthrowsEx__ption{ //returnusername.equalsuserpass; //第一步加载驱动程序,如果使用其它的驱动程序,写出相应的名字即可 //第二步建立连接,第一个参数是url(定位数据库),第二个参数是用户名,第三个参数是口令 Connectioncon=Driver__nager.getConnectionjdbcdbc:bookstore; //bookstore是所创建的ODBC数据源的名字 //第三步创建SQL语句 Stringsql=select*fromusertablewhereusername=anduserpass=; //第四步创建语句对象,用于执行SQL语句的 PreparedStatementstmt=con.prepareStatementsql; //对变量赋值,第一个参数表示变量的序号(第几个问号),第二个参数表示所赋的值 stmt.setString1username; stmt.setString2userpass; //第五步执行SQL语句,因为有查询结果,所以使用executeQuery方法,结果保存在rs中 ResultSetrs=stmt.executeQuery; // rs相当于一个表格,有若干行、若干列组成,指针指向第一条记录的前面 //第六步对结果进行处理,使用next方法进行遍历,使用get方法得到当前行的列 booleanb=rs.next; //第七步关闭相关对象 rs.close; stmt.close; con.close; returnb; } 3)修改LoginPro__ssServlet.j__a修改后的代码为packageservlet;importbean.*;publicclassLoginPro__ssServletextendsHttpServlet{ publicvoiddoGetHttpServletRequestrequestHttpServletResponseresponsethrowsIOEx__ptionServletEx__ption { //获取用户输入的信息 Stringusername=request.getParameterusername; Stringuserpass=request.getParameteruserpass; //调用J__aBean,创建对象、初始化、然后调用方法 UserBeanuser=newUserBean; user.setUsernameusername; user.setUserpassuserpass; booleanb=false; try{ b=user.login; }catchEx__ptione{ //当产生异常的时候,把异常信息输出在界面上 //设置编码方式 response.setContentTypetext/html;charset=gb2312; //得到输出流对象 PrintWriterout=response.getWriter; out.printlne.toString; return; } //转向响应界面 ifb{ RequestDispatcherrd=request.getRequestDispatchersuc__ss.jsp; //跳转到成功的页面 rd.forwardrequestresponse;//完成跳转 }else{ RequestDispatcherrd=request.getRequestDispatcherindex
1.jsp; //跳转到登录页面 rd.forwardrequestresponse;//完成跳转 } } publicvoiddoPostHttpServletRequestrequestHttpServletResponseresponsethrowsIOEx__ptionServletEx__ption { doGetrequestresponse; }}找到 booleanb=user.login;修改为 booleanb=false; try{ b=user.login; }catchEx__ptione{ //当产生异常的时候,把异常信息输出在界面上 //设置编码方式 response.setContentTypetext/html;charset=gb2312; //得到输出流对象 PrintWriterout=response.getWriter; out.printlne.toString; return; }阳光2008-11-1519:59:34第六讲(参考《J__aWeb程序设计基础教程》第
6、9章)
1、分析登录功能 界面登录界面index
1.jsp;登录成功的界面login_suc__ss.jsp 功能UserBean的login方法完成登录的判断 Servlet LoginServlet.j__a 1接收用户输入的用户名和口令
(2)调用UserBean的login方法进行判断
(3)根据方法的返回值选择界面响应
2、MVC模式 M表示模型,主要表示系统中的功能处理部分例如,上面的UserBean就是一个模型,描述用户信息以及相关功能 C表示控制器,建立模型与视图之间的关联关系例如,上面的LoginServlet.j__a 输入界面直接调用控制器,控制器接收用户在输入界面上输入的信息,控制器把信息传递给模型,调用模型的方法,方__给控制器返回一个值,控制器根据这个值选择输出界面对用户响应 MVC模式把系统的每一个功能都分解成这个3个部分然后分别实现
3、采用MVC模式实现注册功能 一般先考虑V,包括输入界面和输出界面,对于注册功能来说,输入是注册界面,输出是注册成功或者失败的界面,通常使用JSP文件 接下来考虑M,功能如何实现,对于注册功能来说,需要把用户提交的信息写到数据库中需要在UserBean中编写添加用户的方法 考虑C,如何协调M和V需要编写Servlet,在doGet或者doPost方法中主要完成接收输入;调用UserBean的方法;选择界面响应
4、创建注册用的表createtableusertable2 usernamevarchar10pri__rykey userpassvarchar10 ___char2 f__varchar20 degreevarchar8 commentvarchar100 e__ilvarchar
305、V部分
6、M部分 在UserBean中添加方法,add方法方法代码如下 publicbooleanadd{ //定义变量 Connectioncon=null; PreparedStatementstmt=null; Stringurl=jdbcdbc:bookstore; Stringsql=insertintousertable2values; booleansuc__ss=true; try{ //第一步加载驱动 Class.forNamedriverClass; //第二步建立连接 con=Driver__nager.getConnectionurl; //第三步创建语句对象 stmt=con.prepareStatementsql; //第四步对SQL语句中参数赋值 stmt.setString1username; stmt.setString2userpass; stmt.setString3___; stmt.setString4f__; stmt.setString5degree; stmt.setString6comment; stmt.setString7e__il; //第五步执行SQL语句 intn=stmt.executeUpdate; //执行没有结果集返回的SQL语句使用executeUpdate方法,方法的返回值是整数,表示操作成功的记录数 ifn==0 suc__ss=false; }catchEx__ptione{ suc__ss=false; }finally{ try{stmt.close;}catchEx__ptionee{} try{con.close;}catchEx__ptionee{} } returnsuc__ss; }
7、C部分 编写Servlet,完成添加的控制控制器的代码如下packageservlet;importbean.*;publicclassAddUserServletextendsHttpServlet{ publicvoiddoGetHttpServletRequestrequestHttpServletResponseresponsethrowsIOEx__ptionServletEx__ption { //请求中采用的编码方式是8859_1,当前的编码是gb2312,需要转换 request.setCharacterEncodinggb2312; //第一句话获取用户输入的信息 Stringusername=request.getParameterusername; Stringuserpass1=request.getParameteruserpass1; String___=request.getParameter___; //因为允许多选,所以结果有可能是多个,应该使用数组接收 Stringf__[]=request.getParameterValuesf__; Stringf__Str=; forinti=0;if__.length;i++ { f__Str+=f__+;; } Stringdegree=request.getParameterdegree; Stringcomment=request.getParametercontent; Stringe__il=request.getParametere__il; //第二句话调用J__aBean,创建对象、初始化、然后调用方法 UserBeanuser=newUserBean; user.setUsernameusername; user.setUserpassuserpass1; user.set______; user.setF__f__Str; user.setDegreedegree; user.setE__ile__il; user.setCommentcomment; booleanb=user.add; //第三句话向页面传递信息 ifb request.setAttributeinfo注册成功!; else request.setAttributeinfo注册失败!; //第四句话转向响应界面 RequestDispatcherrd=request.getRequestDispatchersuc__ss.jsp; rd.forwardrequestresponse;//完成跳转 } publicvoiddoPostHttpServletRequestrequestHttpServletResponseresponsethrowsIOEx__ptionServletEx__ption { doGetrequestresponse; }} 之后对Servlet进行配置,在web.xml中添加如下代码 servlet servlet-nameaddUser/servlet-name servlet-classservlet.AddUserServlet/servlet-class /servlet servlet-__pping servlet-nameaddUser/servlet-name url-pattern/addUser/url-pattern /servlet-__pping 需要修改register.jsp中的form的属性action formaction=addUsermethod=postname=form
18、测试 编译、启动服务器,然后运行阳光2008-11-1520:00:34第七讲(参考《J__aWeb程序设计基础教程》第7章)
1、共享连接数据库的代码 连接数据库的基本过程 1)加载驱动程序; 2)创建连接; 3)编写SQL语句; 4)创建语句对象; 5)对参数赋值; 6)执行SQL语句; 7)对结果进行处理; 8)关闭对象 对于不同的SQL的执行,不同的地方 SQL语句; 参数; 结果的处理方式; 提取相同部分分别编写成方法 Connectioncon=null; PreparedStatementstmt=null; ResultSetrs=null; Stringurl=jdbcdbc:bookstore; //完成连接的创建,相当于第
1.2步 publicConnectiongetConnectionthrowsEx__ption{ Class.forNamedriverClass;//加载驱动程序 ifcon==null con=Driver__nager.getConnectionurl; returncon; } //创建语句对象 publicPreparedStatementcreateStatementStringsqlthrowsEx__ption{ stmt=getConnection.prepareStatementsql; returnstmt; } //执行有结果集返回的方法 publicResultSetexecuteQuerythrowsEx__ption{ rs=stmt.executeQuery; returnrs; } //执行没有结果集返回的方法 publicintexecuteUpdatethrowsEx__ption{ returnstmt.executeUpdate; } //关闭对象 publicvoidclose{ ifrs!=null try{rs.close; }catchEx__ptione{} ifstmt!=null try{stmt.close; }catchEx__ptione{} ifcon!=null try{con.close; }catchEx__ptione{} }
2、修改上一次课的添加功能,使用这些共享方法 Stringsql=insertintousertable2values; booleansuc__ss=true; try{ //创建语句对象 createStatementsql; //对SQL语句中参数赋值 stmt.setString1username; stmt.setString2userpass; stmt.setString3___; stmt.setString4f__; stmt.setString5degree; stmt.setString6comment; stmt.setString7e__il; //执行SQL语句 intn=executeUpdate; //执行没有结果集返回的SQL语句使用executeUpdate方法,方法的返回值是整数,表示操作成功的记录数 ifn==0 suc__ss=false; }catchEx__ptione{ suc__ss=false; }finally{ close; } returnsuc__ss;
3、查询所有图书 1)创建图书表 createtablebooks bookidvarchar10pri__rykey booknamevarchar30 authorvarchar20 pri__float publishervarchar20 插入一些模拟数据insertintobooksvalues00001J__azhangsan20电子工业insertintobooksvalues00002JSPlisi22人民邮电insertintobooksvalues00003J__aEEwang30人民邮电 2)V部分 V主要与人进行交互,要考虑输入和输出 输入在导航条中添加“查看所有图书”的超链ahref=findAllBooks显示所有图书/a 输出显示所有图书信息的JSP文件文件名books.jsp文件内容%@pagecontentType=text/html;charset=gb2312%%@includefile=header.jsp% tr td tablealign=__nterborder=1 tr td图书编号/tdtd图书名称/tdtd__/tdtd__/tdtd出版社/td /tr !-- c:forEach用于循环控制,items属性指出要循环遍历的__,var定义一个循环变量,表示__中的一个元素-- c:forEachvar=bookitems=${books} tr td${book.bookid}/td td${book.bookname}/td td${book.author}/td td${book.pri__}/td td${book.publisher}/td /tr /c:forEach /table /td /tr/table 3)M部分 完成功能从数据库中查询所有的图书文件名BookBean.j__a文件内容packagebean;publicclassBookBeanextendsBase{ //描述图书的属性 privateStringbookid; privateStringbookname; privateStringauthor; privatefloatpri__; privateStringpublisher; //编写对乘员进行操作的方法 publicvoidsetBookidStringbookid{ this.bookid=bookid; } publicStringgetBookid{ returnbookid; } publicvoidsetBooknameStringbookname{ this.bookname=bookname; } publicStringgetBookname{ returnbookname; } publicvoidsetAuthorStringauthor{ this.author=author; } publicStringgetAuthor{ returnauthor; } publicvoidsetPri__floatpri__{ this.pri__=pri__; } publicfloatgetPri__{ returnpri__; } publicvoidsetPublisherStringpublisher{ this.publisher=publisher; } publicStringgetPublisher{ returnpublisher; } publicArrayListfindAllBooks{ ArrayListbooks=newArrayList; Stringsql=select*frombooks; try{ createStatementsql; rs=executeQuery; //使用while循环遍历结果集 whilers.next { //使用rs的getString方法,以字符串的形式获取第一列,参数也可以是列的名字 //可以得到当前记录的每一列 StringtempBookid=rs.getString1; StringtempBookname=rs.getString2; StringtempAuthor=rs.getString3; floattempPri__=rs.getFloat4; StringtempPublisher=rs.getString5; //创建图书对象 BookBeanbook=newBookBean; book.setBookidtempBookid; book.setBooknametempBookname; book.setAuthortempAuthor; book.setPri__tempPri__; book.setPublishertempPublisher; //把书添加到链表中 books.addbook; } }catchEx__ptione{ }finally{ close; } returnbooks; }} 4)C部分 控制器4句话本功能只用到3句文件名FindAllBooks文件内容packageservlet;importbean.*;publicclassFindAllBooksextendsHttpServlet{ publicvoiddoGetHttpServletRequestrequestHttpServletResponseresponsethrowsIOEx__ptionServletEx__ption { //第二句话调用J__aBean,创建对象、初始化、然后调用方法 BookBeanbook=newBookBean; ArrayListbooks=book.findAllBooks; //第三句话向页面传递信息,第一个参数是使用的名字,应该和显示时候使用的名字一致,第二个参数传递的值本身 request.setAttributebooksbooks; //第四句话转向响应界面 RequestDispatcherrd=request.getRequestDispatcherbooks.jsp; rd.forwardrequestresponse;//完成跳转 } publicvoiddoPostHttpServletRequestrequestHttpServletResponseresponsethrowsIOEx__ptionServletEx__ption { doGetrequestresponse; }}在web.xml中进行配置 servlet servlet-namefindAllBooks/servlet-name servlet-classservlet.FindAllBooks/servlet-class /servlet servlet-__pping servlet-namefindAllBooks/servlet-name url-pattern/findAllBooks/url-pattern /servlet-__pping阳光2008-11-1520:01:52第八讲(参考《J__aWeb程序设计基础教程》第10章)
1、删除功能设计 1)V部分 输入可以在图书列表界面中添加一列,使用超链链接到删除功能,需要把将要删除的图书的编号传递过去 输出删除成功或者失败的提示界面 2)M部分 删除功能需要在BookBean添加一个删除的方法,方法需要参数来指定删除哪一本书 3)C部分 4句话从输入界面获取要删除的图书的编号;根据编号调用J__aBean的删除图书的方法;把删除成功或者失败的消息传递到界面(通过request);转向响应界面
2、输入界面 在books.jsp中的表格后面增加一列%@pagecontentType=text/html;charset=gb2312%%@includefile=header.jsp% tr td tablealign=__nterborder=1 tr td图书编号/tdtd图书名称/tdtd__/tdtd__/tdtd出版社/tdtd/td /tr !-- c:forEach用于循环控制,items属性指出要循环遍历的__,var定义一个循环变量,表示__中的一个元素-- c:forEachvar=bookitems=${books} tr td${book.bookid}/td td${book.bookname}/td td${book.author}/td td${book.pri__}/td td${book.publisher}/td tdahref=deleteBookbookid=${book.bookid}删除/a/td /tr /c:forEach /table /td /tr/table
3、输出界面 把suc__ss.jsp作为输出界面
4、M部分 在BookBean中添加deleteBook方法,代码如下 //根据编号删除图书 publicbooleandeleteBookStringbookid{ //表示删除成功还是失败 booleansuc__ss=true; //编写SQL语句 Stringsql=deletefrombookswherebookid=; try{ //创建语句对象 createStatementsql; //对SQL中的参数赋值 stmt.setString1bookid; ifstmt.executeUpdate0 suc__ss=true; else suc__ss=false; }catchEx__ptione{ suc__ss=false; }finally{ close; } returnsuc__ss; }
5、C部分 记住4句话即可参考代码如下packageservlet;importbean.*;publicclassDeleteBookextendsHttpServlet{ publicvoiddoGetHttpServletRequestrequestHttpServletResponseresponsethrowsIOEx__ptionServletEx__ption { //第一句话获取要删除的图书 Stringbookid=request.getParameterbookid; //第二句话调用J__aBean,创建对象、初始化、然后调用方法 BookBeanbook=newBookBean; booleansuc__ss=book.deleteBookbookid; //第三句话向页面传递信息,第一个参数是使用的名字,应该和显示时候使用的名字一致,第二个参数传递的值本身 Stringinfo; ifsuc__ss info=删除成功!; else info=删除失败; request.setAttributeinfoinfo; //第四句话转向响应界面 RequestDispatcherrd=request.getRequestDispatchersuc__ss.jsp; rd.forwardrequestresponse;//完成跳转 } publicvoiddoPostHttpServletRequestrequestHttpServletResponseresponsethrowsIOEx__ptionServletEx__ption { doGetrequestresponse; }}在web.xml中添加配置,相关代码如下 servlet servlet-namedeleteBook/servlet-name servlet-classservlet.DeleteBook/servlet-class /servlet servlet-__pping servlet-namedeleteBook/servlet-name url-pattern/deleteBook/url-pattern /servlet-__pping
6、图书信息修改功能设计 用户操作过程首先先显示要修改的图书信息,然后修改后提交更新数据库 首先考虑显示信息的过程根据用户的选择显示相应图书的信息 采用MVC模式设计如下 V部分输入可以采用与删除功能类似的方式,在图书列表之后增加一修改列输出是修改界面 M部分根据图书编号查询图书信息需要在BookBean中添加一个根据编号查询图书的方法 C部分4句话,获取图书编号;把编号作为参数调用J__aBean中查询图书的方法;把查询到的图书对象保存到request;转向修改界面
7、输入界面 修改books.jsp%@pagecontentType=text/html;charset=gb2312%%@includefile=header.jsp% tr td tablealign=__nterborder=1 tr td图书编号/tdtd图书名称/tdtd__/tdtd__/tdtd出版社/tdtd/tdtd/td /tr !-- c:forEach用于循环控制,items属性指出要循环遍历的__,var定义一个循环变量,表示__中的一个元素-- c:forEachvar=bookitems=${books} tr td${book.bookid}/td td${book.bookname}/td td${book.author}/td td${book.pri__}/td td${book.publisher}/td tdahref=deleteBookbookid=${book.bookid}删除/a/td tdahref=findBookByIDbookid=${book.bookid}修改/a/td /tr /c:forEach /table /td /tr/table阳光2008-11-1520:02:
258、输出界面 修改界面显示从控制器传递过来的BookBean对象book%@pagecontentType=text/html;charset=gb2312%%@includefile=header.jsp% tr td formaction=updateBookmethod=postname=form1 tablealign=__nter tr td图书编号/td tdinputtype=hiddenname=bookidvalue=${book.bookid}${book.bookid}/td /tr tr td图书名/td tdinputtype=textname=booknamevalue=${book.bookname}/td /tr tr td__/td tdinputtype=textname=author value=${book.author}/td /tr tr td__/td tdinputtype=textname=pri__ value=${book.pri__}/td /tr tr td出版社/td tdinputtype=textname=publisher value=${book.publisher}/td /tr tr tdinputtype=submitvalue=提交/td tdinputtype=resetvalue=重写/td /tr /table /form /td /tr/table
9、编写根据ID查询图书的方法 在BookBean中添加方法 //根据编号查询图书 publicBookBeanfindBookByIDStringbookid{ BookBeanbook=newBookBean; Stringsql=select*frombookswherebookid=; try{ createStatementsql; stmt.setString1bookid; rs=executeQuery; //转换成对象 rs.next; //使用rs的getString方法,以字符串的形式获取第一列,参数也可以是列的名字 //可以得到当前记录的每一列 StringtempBookname=rs.getString2; StringtempAuthor=rs.getString3; floattempPri__=rs.getFloat4; StringtempPublisher=rs.getString5; //创建图书对象 book.setBookidbookid; book.setBooknametempBookname; book.setAuthortempAuthor; book.setPri__tempPri__; book.setPublishertempPublisher; }catchEx__ptione{ }finally{ close; } returnbook; }
10、编写Servlet控制器packageservlet;importbean.*;publicclassFindBookByIDextendsHttpServlet{ publicvoiddoGetHttpServletRequestrequestHttpServletResponseresponsethrowsIOEx__ptionServletEx__ption { //第一句话获取用户选择图书编号 Stringbookid=request.getParameterbookid; //第二句话调用J__aBean,创建对象、初始化、然后调用方法 BookBeanbook=newBookBean; book=book.findBookByIDbookid; //第三句话向页面传递信息,第一个参数是使用的名字,应该和显示时候使用的名字一致,第二个参数传递的值本身 request.setAttributebookbook; //第四句话转向响应界面 RequestDispatcherrd=request.getRequestDispatcherupdateBook.jsp; rd.forwardrequestresponse;//完成跳转 } publicvoiddoPostHttpServletRequestrequestHttpServletResponseresponsethrowsIOEx__ptionServletEx__ption { doGetrequestresponse; }}在web.xml中配置 servlet servlet-namefindBookByID/servlet-name servlet-classservlet.FindBookByID/servlet-class /servlet servlet-__pping servlet-namefindBookByID/servlet-name url-pattern/findBookByID/url-pattern /servlet-__pping
11、修改功能的设计 V部分输入是修改界面不用修改,只要设置form的action属性为updateBook即可输出可以采用suc__ss.jsp界面 M部分在BookBean中添加修改方法 C部分4句话,获取用户修改后的信息;调用J__aBean,包括初始化;把执行的结果传递到界面;转向界面阳光2008-11-1520:04:
0312、修改BookBean中的代码 增加update方法,代码如下 //更新图书信息 publicbooleanupdate{ booleansuc__ss=false; Stringsql=updatebookssetbookname=author=pri__=publisher=wherebookid=; try{ createStatementsql; stmt.setString1bookname; stmt.setString2author; stmt.setFloat3pri__; stmt.setString4publisher; stmt.setString5bookid; intn=executeUpdate; ifn0 suc__ss=true; else suc__ss=false; }catchEx__ptione{ suc__ss=false; }finally{ close; } returnsuc__ss; }
13、编写控制器 为了解决乱码,在控制器中获取信息之前,增加如下语句 request.setCharacterEncodinggb2312; 代码如下packageservlet;importbean.*;publicclassUpdateBookextendsHttpServlet{ publicvoiddoGetHttpServletRequestrequestHttpServletResponseresponsethrowsIOEx__ptionServletEx__ption { request.setCharacterEncodinggb2312; //第一句话获取用户选择图书编号 Stringbookid=request.getParameterbookid; Stringbookname=request.getParameterbookname; Stringpri__=request.getParameterpri__; Stringauthor=request.getParameterauthor; Stringpublisher=request.getParameterpublisher; floatfPri__=0f; try{ //把字符串转换成浮点型变量 fPri__=Float.parseFloatpri__; }catchEx__ptione{ } //第二句话调用J__aBean,创建对象、初始化、然后调用方法 BookBeanbook=newBookBean; book.setBookidbookid; book.setBooknamebookname; book.setPri__fPri__; book.setAuthorauthor; book.setPublisherpublisher; booleansuc__ss=book.update; Stringinfo; ifsuc__ss info=修改成功!; else info=修改失败; //第三句话向页面传递信息,第一个参数是使用的名字,应该和显示时候使用的名字一致,第二个参数传递的值本身 request.setAttributeinfoinfo; //第四句话转向响应界面 RequestDispatcherrd=request.getRequestDispatchersuc__ss.jsp; rd.forwardrequestresponse;//完成跳转 } publicvoiddoPostHttpServletRequestrequestHttpServletResponseresponsethrowsIOEx__ptionServletEx__ption { doGetrequestresponse; }}修改配置文件: servlet servlet-nameupdateBook/servlet-name servlet-classservlet.UpdateBook/servlet-class /servlet servlet-__pping servlet-nameupdateBook/servlet-name url-pattern/updateBook/url-pattern /servlet-__pping[本帖最后由阳光于2008-11-1512:05编辑]阳光2008-11-1520:07:06第九讲(参考《J__aWeb程序设计基础教程》第14章)
1、在JSP中如何存储信息 前面介绍过的在数据库中存储信息;在request对象中存储信息 分为两类内存和持久存储 内存中如何组织数据 pageContext对象,存储当前页面的信息;请求涉及多少个文件,就会创建多少个pageContext对象 request对象,一次请求会创建一个request对象,如果希望在同一次请求的多个文件之间共享信息,可以保存在request中 session对象,每个客户端对应一个session,session中用于存储在用户的整个访问过程中要使用的信息最典型的应用把用户的登录信息保存在session中,这样在后续的页面中使用登录信息 application对象,整个__对应这样一个对象,访问__的所有用户在访问所有网页的时候都可以使用典型的应用是公有的聊天室,聊天信息所有人都可以看到,这时候就应该使用application对象 持久存储 数据库,通过JDBC访问 文件,通过IO进行操作 Cookie,信息存储在客户端如果使用数据库和文件,信息都存在服务器端
2、网上购物车的基本功能 浏览图书信息; 把图书添加到购物车中; 对购物车中的物品进行管理; 查看购物车的信息; 生成订单
3、如何保存在购物过程中选择的物品? 关心购物车中有哪些类型的物品,每种类型的物品有多少物品的种类数量不确定每次请求只能选择某一种物品根据这些特点,应该设计购物车的存储结构如下 1)需要把购物车放到session中,这样才能进行多个页面之间的共享; 2)因为物品种类不确定,所以一般选择ArrayList来存储物品种类以及数量; 3)对于每一种物品,包含物品本身的信息以及物品的__数量,通常使用订单项来表示,里面包含了物品对象及其数量
4、完成向购物车中添加图书的功能 V部分输入,是选择物品向购物车添加的界面,使用物品信息查看界面; 输出,显示购物车信息的页面 M部分把选择的物品添加到购物车中,需要知道原来购物车中有什么信息,购物车在session中保存,所以需要对session进行操作 C部分第一句话,获取信息,从输入界面获取要添加的图书,从session中获取原有的购物车信息 第二句话,调用M部分的添加购物车功能 第三句话,保存信息,把修改后的购物车重新写入session中 第四句话,转向显示购物车信息的页面
5、构建订单项类packagebean;//表示购物项publicclassItem{ privateBookBeanbook; privateintquantity; publicvoidsetBookBookBeanbook{ this.book=book; } publicBookBeangetBook{ returnbook; } publicvoidsetQuantityintquantity{ this.quantity=quantity; } publicintgetQuantity{ returnquantity; }}
6、输入界面 在books.jsp中的图书列表后增加“添加到购物车”这样的超链接
7、删除功能、修改购物车信息 界面 删除的代码 formaction=deleteItemmethod=post inputtype=submitvalue=删除 /form 修改的 formaction=updateCartmethod=post inputtype=textname=quantityvalue=${item.quantity} inputtype=submitvalue=修改 /form M部分 从ArrayList对象cart中删除Item对象item cart.removeitem cart.removei 修改功能在添加过程中如果要添加的图书已经存在,就相当于修改 C部分与添加功能中的代码非常类似阳光2008-11-1520:07:58第十讲
1、MVC模式分析 对任何功能来说,首先考虑人如何来使用这个功能如何把人的请求发送给系统,系统如何把处理的结果返回给用户,实际上就是输入和输出输入MVC模式中的V部分 输入用户发送请求,通过超链接,通过浏览器的地址栏,通过表单提交请求时候如何要提交数据,在超链接中以及地址栏中可以通过?的形式来传递值,表单方式通过表单元素提交信息非常典型的应用,隐藏域,用于在多个页面之间传递信息注意输入一定要进行客户端的格式验证 输出主要服务器得到的信息显示给用户输出提示信息${info} 输出对象信息在更新界面中显示信息${book.bookid} 输出多个对象的信息 c:forEachvar=bookitems=${books} tr td${book.bookid}/td td${book.bookname}/td td${book.author}/td td${book.pri__}/td td${book.publisher}/td tdahref=deleteBookbookid=${book.bookid}删除/a/td tdahref=findBookByIDbookid=${book.bookid}修改/a/td tdahref=addToCartbookid=${book.bookid}添加到购物车/a/td /tr /c:forEach 功能(M部分)通常转换成方法因为J__a是面向对象的语言,方法应该输入某个类的所以通常需要创建J__aBean(比较特殊的类),然后在J__aBean中添加这个方法方法的实现主要依赖你的J__a基本功 控制器(C部分)通常使用Servlet来实现对于控制器需要记住4句话获取信息;调用J__aBean;保存信息;响应 获取信息 获取请求信息request.getParameterparaname request.getParameterValuesparaname 获取session中信息 session.getAttribute属性名 注意获取到之后需要进行强制类型转换 获取Cookie中信息 request.getCookies 返回的是Cookie数组 获取请求头信息 获取Servlet的配置信息 通过其他的J__aBean来获取一些信息 调用J__aBean的方法 实例化,使用new加上构造方法来实例化,如果要调用的方法是静态方法,不需要实例化 初始化,可能需要使用上面获取的信息来对J__aBean进行初始化 调用方法,可以通过参数传递需要的信息 保存信息(主要为后续的页面和处理服务的) 保存到session中,session.setAttribute属性名要保存的对象,供用户后续的所有访问过程使用 保存到request中,request.setAttribute属性名要保存的对象,供后续页面使用(页面与当前的Servlet属于同一次请求) 保存到cookie,Cookiecookie=newCookienamevalue;response.addCookiecookie; ,供客户端在以后的时间访问 响应 直接输出 response.setContentTypetext/html;charset=gb2312; PrintWriterout=response.getWriter; out.println欢迎学习JSP!; 使用专门的文件进行响应 方式一 RequestDispatcherrd=request.getRequestDispatcher目标文件; rd.forwardrequestresponse;//完成跳转 方式二 response.sendRedirect目标文件; 注意如果当前功能完成的是对数据库的插入操作,如果用户刷新就会产生错误要避免错误,不能使用RequestDispatcher,可以使用方式二如果使用方式二,就不能在当前文件和目标文件之间通过request共享信息了如果要共享可以session,使用session的时候,用完之后一定要删除这个对象session.removeAttribute属性名
2、如何使用其他的数据库管理系统 准备工作 1)__数据库;创建表(这个过程通常是由数据库___完成的,对于变__员来说需要知道数据库的IP地址、端口、数据库名字、用户名、口令) 2)要得到数据库的JDBC驱动程序,通常是压缩包,可以从响应的数据库提供商的__上下载需要把驱动程序放在C:\ProgramFiles\ApacheSoftwareFoundation\Tomcat
6.0\lib或者应用的WEB-INF/lib下面 在程序中使用 与现在使用JDBC-ODBC桥方式基本相同,不同点在于驱动程序的名字;URL(通常包含IP地址、端口、数据库名字)的格式不同(与驱动程序有关);用户名和口令 常见的错误 1)ClassNotFoundEx__ption 通常是因为JDBC驱动程序加载失败,找不到确认JDBC驱动程序在正确的位置以及版本是否正确 2)没有合适的驱动程序Notasuitabledriver 通常是因为URL的格式不正确 3)连接不能被创建,数据库服务器没有正常运行获取主机、端口、数据库名有误 4)Ac__ssDenied 用户名和口令错误。