include>。
(2)区别:
1.静态导入是将被导入页面的代码完全融入,两个页面融合成一个整体Servlet;而动态导入则在Servlet中使用include方法来引入被导入页面的内容。
2.静态导入时被导入页面的编译指令会起作用;而动态导入时被导入页面的编译指令则失去作用,只是插入被导入页面的body内容。
3.动态包含还可以增加额外的参数。
题目1.4:
request对象
(一)题目目的
掌握怎样在JSP中使用内置对象request
(二)思考题
1、这个程序片段的含义是?
getParameter方法是如何设置值的?
答:
给a、b和operator分别赋值。
(1)构建你的链接,在链接里面构建你的数据。
(2)讲数据写入session或者其他容器,再servlet取。
2、中的method有几种选择,比较每种选择的不同?
答:
Method有两种get和post。
Get请求把表单的数据显式地放在URI中,并且对长度和数据值编码有所限制;Post请求把表单数据放在HTTP请求体中,并且没有长度限制。
题目1.5:
session对象
(一)题目目的
本题目的目的是让学生掌握怎样使用session对象存储和用户有关的数据。
(二)思考题
1、什么才是一次session?
如何理解一次session?
Session如何读写值?
写出其对应的方法。
当浏览器访问服务器时,服务器会创建一个session对象(该对象有一个id属性,其值是唯一的,一般称之为sessionId),服务器在默认情况下,会使用cookie机制(将sessionId放到set-cookie消息头)将这个sessionId发送给浏览器;当浏览器再次访问服务器时,会将sessionId发送给服务器,服务器依据sessionId找到之前的session对象。
三、总结
实验二JDBC
一、实验目的
1.掌握JSP中JDBC编程的基本方法。
2.掌握JSP连接数据库的常用方法
3.数据库的顺序查询、随机查询和条件查询。
二、填空题
1、请将程序中的|代码1|~|代码3|处补充完整。
程序清单3StudentManager.java
publicvoidconnection(){//连接数据库;
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//装载驱动程序;
conn=DriverManager.getConnection(url,username,pwd);//连接ODBC数据源studentManager
stmt=conn.createStatement();//获得执行语句对象stmt;
}catch(ClassNotFoundExceptione1){
System.err.println("驱动程序装载失败!
");
}catch(SQLExceptione2){
e2.getSQLState();
e2.getMessage();
}
}//endofconnectionmethod;
try{
connection();
StringInsSQL;
InsSQL="INSERTINTOstudent(学号,姓名,性别,出生年月,家庭住址,联系电话)"+
"VALUES("+"'"+no+"',"+"'"+name+"',"+"'"+gendar+"',"+"'"+birth+"',"+"'"+address+"',"+"'"+tel+"')";//定制插入SQL语句字符串
stmt=con.CreateStatement();
stmt.setString(1,no);
stmt.setString(2,name);
stmt.setString(3,gender);
stmt.setString(4,birth);
stmt.setString(5,address);
stmt.setString(6,tel);
Resultrs=stmt.executeUpdate(InsSQL);//执行将新记录插入到数据表student中;
}catch(SQLExceptione1){
System.err.println(e1.getSQLState());
}
finally{
close();//关闭数据库
}
2、程序清单6-4是类StudentManager2的程序模板,请补充|程序段1|~|程序段5|程序段,并输入该程序StudentManager2.java,调试并运行,观察程序运行的结果。
程序清单4StudentManager2.java
······
//定义更新面板
updateInnerPanel=newStudentPanel();
updateInputLbl=newJLabel("输入学号:
");
updateInputText=newJTextField(10);
updateInputText.addActionListener(newActionListener(){
publicvoidclearContent(){
viewPanel.setText("");
}//将更新面板的显示内容清除;
});
//定义删除面板
deleteInnerPanel=newStudentPanel();
inputNoLable=newJLabel("输入学号:
");
inputNoField=newJTextField(10);
inputNoField.addActionListener(newActionListener(){
publicvoidclearContent(){
deleteInnerPanel.setText("");
}
//将删除面板的显示内容清除;
});
publicvoidviewARecord(Stringno,StudentPanelp){
//在显示面板p中,显示学号为no的学生信息
try{
connection();
StringViewsql=”select*fromstudentwhereno=?
”;
stmt=con.CreateStatement();
stmt.setString(1,no);
Resultrs=stmt.executeQuery(sql);
While(rs.next()){
Stringno=rs.getSring(no);
}catch(SQLExceptione1){
System.err.println("操作失败");
System.err.println(e1.getSQLState()+e1.getMessage());
}
finally{
close();
}
}
publicvoidupdateRecord(Stringno){//修改学号为no学生的记录;
try{
connection();
StringUpdatesql="updatestudentsetname=?
gender=?
birth=?
address=?
tel=?
whereno=?
";
stmt=con.CreateStatement();
stmt.setString(1,name);
stmt.setString(2,gender);
stmt.setString(3,birth);
stmt.setString(4,address);
stmt.setString(5,tel);
stmt.setString(6,no);
Resultrs=stmt.executeUpdate(sql);
}catch(SQLExceptione1){
}finally{
close();
}
}
publicvoiddeleteRecord(Stringno){//删除学号为no学生的记录;
try{
connection();
Stringdeletesql="deletefromstudentwhereno=?
";
stmt=con.CreateStatement();
stmt.setString(1,no);
Resultrs=stmt.executeUpdate(sql);
}catch(SQLExceptione1){
System.err.println("操作失败");
System.err.println(e1.getSQLState()+e1.getMessage());
}
finally{
close();
}
}
3、练习2利用PreparedStatement接口实现对student数据表的SQL操作
要求:
思考程序中,conn.rollback()语句的作用是什么?
try{
connection();
StringInsSQL;
InsSQL="INSERTINTOstudent(学号,姓名,性别,出生年月,家庭住址,联系电话)"+
"VALUES(?
?
?
?
?
?
)";//定制插入SQL语句字符串
PreparedStatementpstmt=conn.preparedStatement(InsSQL);
pstmt.setString(1,no);
pstmt.setString(2,name);
pstmt.setString(3,gendar);
pstmt.setString(4,birth);
pstmt.setString(5,address);
pstmt.setString(6,tel);
intresult=pstmt.executeUodate();
if(result==0){
conn.rollback();
return;
}
}catch(SQLExceptione1){
System.err.println(e1.getMessage()+e1.getSQLState());
}
finally{
close();//关闭数据库
}
答:
程序中,conn.rollback()语句的作用是显式提交,完成事务操作或设置自动提交为:
false、处理事务、提交(在意外中回滚)。
三、总结
实验三Struts基础及应用编程
一、实验目的
本实验目的是希望通过编程实现用户客户登记表程序,来对Struts进行编程运用,知道Struts的配置文件struts-config.xml的配置,htmltaglib的运用,尤其是对errors>tag运用和理解,对于Action的控制机制和ActionForm数据处理机制,以及对于ApplicationResource.property熟练掌握,从而达到对能够运用Struts的基本技术来开发动态网页能力。
二、实验内容
用Struts来编写和实现一个两个Form,第一个Form是注册用户名和用户密码的Form,其中包含字段有,用户,密码,密码校对,密码要求长度不能小于六位,密码里面应包含至少数字和字母,字母应包括大小写,最好密码中包含特殊字符。
第二个表是注册用户详细信息表,包括工作单位或者机构名称,邮政地址,邮政编码,单位简介,联系人名,电话,邮件等。
第一表和第二个表的关系是第一个表注册完,点击下一步就是出现第二个表的注册。
表校验成功后要显示成功信息。
1、新建一个struts的Action和ActionForm类:
helloaction.java和
helloform.java
(1)Helloaction.java的主要代码如下:
publicclasshelloactionextendsorg.apache.struts.action.Action{
privatestaticfinalStringSUCCESS="success";
privatestaticfinalStringFAIL="fail";
publicActionForwardexecute(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse)
throwsException{
helloformtheform=(helloform)form;
Stringname=theform.getName();
Stringaddress=theform.getAddress();
//如果name或者address有一个空的话就映射fail,其他情况映射success。
if(name.equalsIgnoreCase("")||address.equals(""))
returnmapping.findForward(FAIL);
returnmapping.findForward(SUCCESS);
}
}
(2)helloform.java的主要代码如下:
publicclasshelloformextendsorg.apache.struts.action.ActionForm{
privateStringname;
publicStringgetAddress(){
returnaddress;
}
publicvoidsetAddress(Stringaddress){
this.address=address;
}
publicStringgetEmail(){
returnemail;
}
publicvoidsetEmail(Stringemail){
this.email=email;
}
publicStringgetPostcode(){
returnpostcode;
}
publicvoidsetPostcode(Stringpostcode){
this.postcode=postcode;
}
publicStringgetTelphone(){
returntelphone;
}
publicvoidsetTelphone(Stringtelphone){
this.telphone=telphone;
}
privateStringaddress;
privateStringpostcode;
privateStringtelphone;
privateStringemail;
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringstring){
name=string;
}
publichelloform(){
super();
}
publicActionErrorsvalidate(ActionMappingmapping,HttpServletRequestrequest){
ActionErrorserrors=newActionErrors();
Stringthename=request.getParameter("name");
Stringtheaddress=request.getParameter("address");
Stringthepostcode=request.getParameter("postcode");
Stringthetelphone=request.getParameter("telphone");
Stringtheemail=request.getParameter("email");
//以下是判断各个字段的值是否为空,如果为空给出提示信息。
if(thename.equalsIgnoreCase("")){
errors.add("name",newActionMessage("error.name.required"));
}
if(thepostcode.equalsIgnoreCase("")){
errors.add("postcode",newActionMessage("请输入邮编!
!
"));
}
if(theaddress.equalsIgnoreCase("")){
errors.add("address",newActionMessage("请输入地址!
!
"));
}
if(thetelphone.equalsIgnoreCase("")){
errors.add("telphone",newActionMessage("请输入电话!
!
"));
}
if(theemail.equalsIgnoreCase("")){
errors.add("email",newActionMessage("请输入邮箱!
!
"));
}
returnerrors;
}
}
2、新建一个注册界面welcomestruts.jsp,以及success映射的文件yes.jap和fail映射的文件no.jsp
welcomstruts.jsp的主要代码如下:
htmllang="true">
欢迎页面
.content{
color:
#000000;
font-family:
"宋体";
font-size:
20px;
}
base/>
white">
//以下是建form的全部代码
formaction="/action"method="post"styleClass="content">
name:
textproperty="name">
text>errorsproperty="name"/>
address:
textproperty="address">
text>errorsproperty="address"/>
postcode:
textproperty="postcode">
text>errorsproperty="postcode"/>
telphone:
textproperty="telphone">
text>errorsproperty="telphone"/>
email:
textproperty="email">
text>errorsproperty