oss报表系统 实训笔记
实训公司:中科天地 (王海格,老师超好)
edited by hen egg ,michelangelo
2005-2-21
8:00
jasperreport 开支
面向oo 应用服务器
java 开源数据库
j2ee 需求分析
成绩:
课堂表现
项目
项目:
l java平台
(1) (编程语言)开发环境(编译器)
(2) 部署环境(应用服务器)(jdk提供软件运行服务器及基本运行条件,在此基础上的开发需要配置) 目的是重用 (相关工具类)
(3) 运行环境(操作系统)
–jvm虚拟机是操作系统,即运行环境
–java包 文件性
–垃圾收集 内存管理
–虚拟cpu (优势)
–线程
(1)+(2)+(3) 统一环境 简单开发
l java语言
1. oo(最重要的特征)——很大的系统
2. 可移植性jvm (并不重要)
3. 分布式 jvm+appserver ——跨平台的系统
充分利用网络资源 跨地域跨国界
4. 安全性
unix:安全性强类型
jvm内置强安全性 >unix
关键业务
1. 人命
医疗 检查公安 重型工业 航空
2. 钱
银行
小结:
jvm是操作系统
java是面向对象,分布式,安全的语言
ps:以上红字粗体部分为java关键技术
l java虚拟机
1.垃圾收集
2.分布式 支持各种协议
3.多线程 线程管理
4.安全性
概念
模拟了一台计算机
功能
1.垃圾回收:
(在内存中)new的对象被装载到对象堆中
a = new air;
new 出一个对象
调用构造函数,分配在对象堆中
返回一个引用
引用计数器++
当计数器减为0,该变量变成垃圾,从名单里除去。
垃圾收集作用:内存泄漏,空指针
垃圾收集机制:
后台精灵线程:当cpu出现闲置,调用该线程(优先级低) 要求cpu很快 有闲置的时候(用java 先cpu再内存再次网卡)
2.提供运行时环境
操作系统的功能,负责调入代码,监督代码运行,帮助程序做输入输出,给程序提供一系列的支持
提供 cpu 寄存器 网络读写 文件系统 安全性
class loader 加载
byte code verifier文件格式 语法 数组越界
校验4遍
interpreter: 中间代码
jit 即时编译 (快)(编译成本地代码)
安装jdk
配置环境变量
java_home c:\j2sdk
path ;%java_home%\bin
classpath .;%java_home%\lib
(ps:dos窗口不能自动刷新,改变环境变量后记得重新开)
14:00
类:
自定义
抽象
包:
package
把功能相近的类组合在一起
包是相对路径,相当于windows里的文件夹
import一个包 就引入了一个命名空间
import不等于include
没写包的话,系统默认一个包
java代码三部分
1) package com.project.src
2) import java.io.*;
3) 类
一个文件里可以有多个类,但是有且只有一个public类
eg1
1. static void main(string []args)
main method is not public
2. public void main(string []args)
exception in thread "main" java.lang.nosuchmethoderror: main
main是整个程序的入口,不能用new出来 由于是static方法所以在载入内存时便直接执行 以此作为其他程序的入口 但main不是关键字
3. public static main(string []args)
testhelloworld.java:4: invalid method declaration; return type required
public static main(string[] args)
java规定必须有范围类型,没有返回值必须定义为void。但是构造函数不允许有返回类型。
4. public static void main(string []args) == static public void main(string []args)
访问控制符和修饰符位置任意。但习惯把访问控制符放前面
5.但是返回类型 不能放在上面两者前面
testhelloworld.java:4: <identifier> expected
void static public main(string[] args)
^
testhelloworld.java:8: ( expected //返回值必须贴紧方法名
}
^
2 errors
main不是关键字,但是自己不要用它。
6. string[] args
从arg[0]开始
注释:
调程序用
//
/* */
javadoc注释
/**
*/
用javadoc变成文档
javadoc helloworld.java –d doc
java关键字&标识符&保留字
标识符 开头:字母(_, $)
编码规范:
1) 有意义的单词组成,第一个单词第一个字母小写,其他单词第一个字母大写
2) 变量名和方法名同等处理。
3) 常量由有意义的单词组成,所有单词全大写,单词之间用下划线分开。
4) 类名第一个字母大写
java数据类型
1. 基本数据类型(不是对象)
8种:
int, long, short, byte, float, double, char, bool.
2. 引用类型
对象只能通过引用访问
实际上是安全的指针
数组是引用类型(因为他在c语言里是指针类型)
默认:
char ‘\u0000’
bool false
引用 null
数组 null
表达式和流程控制
不要用++ –,容易引起误读 除了在循环里面
=与==: ==只能用于基本类型,不要用于引用类型。equals
短路运算符: if (lasting!=null)&&,||
把概率最高的判断放在前面,节省程序执行的时间
类型转换
高位转低位,必须进行强制类型转化 ,short与char的转换总要
传参和传值
基本类型传值
引用类型传引用
传的是变量的副本
控制流程,循环
最好不要用switch (破坏封装,消耗性能,破坏流程)
分支尽量用if else
循环尽量用for
while(true)在服务器中,做死循环用
别用do-while
练习1
强制类型转换
练习2
传参
2005-2-22
8:00
l java oo
最早的面向对象smalltalk, 后来的c++, java, phyon, .net
smalltalk纯的 java不纯(基本类型等)
java是对面向对象的一个实现
对象 -> 数据 <- 操作
对象之间的关系 –> 消息
oo: 按符合人的思维习惯的逻辑来分析设计,形成了一套模式,即面向对象体系。
注意:
1. 不要去继承有代码的类。有代码的类请用对象的组合.
2. 继承抽象基类或接口(n个)。接口设计完,不能减少和修改,只能增加.
3. 多重继承本身没错,必不可少,但要限制多重或单继承,破坏封装性.
多态:
技术实现:
1. 编译时:src 检查形式类型(声明)
2. 运行时:jvm 检查实际类型
重载:
(编译时)
处理相同的方法名,不同的参数列表
在编译器里用方法签名区别。(method signature,由方法名+参数列表组成)
不要用运算符重载
14:00
类(实用类):
1. 类头
只有public 和 默认的,没有私有类
2. 属性
static 只保留一份拷贝。与类代码保存在一起
静态属性的构造方法: static {}块。
non-static
3. 方法
4. 构造方法(不是类的基本结构)
5. static块
l 类的定义
[权限][修饰] class 类名 [extends 父类名][implements 接口列表]
{
类体;
}
权限: 有 public —— 公有类
无 public —— 同包类
修饰: abstract 抽象类,只能被继承(如果一个类里面有一个抽象方法,则这个类必须是抽象类。反之,抽象类不一定包含抽象方法)不能实例化
final 终极类,完美类,不能被继承。只能实例化
ps:
1:一般静态变量被定义成常量
2:用静态方法不能访问实例变量,static
3:native 在java中调用本地c代码
4:构着方法:选择native(高级)
5:接口作为引用类型来使用,任何实现该接口的实例都可以存在该接口类型的变量中.
数据成员:
[权限][修饰] 类型 变量名[= 初值];
修饰: static 有 —— 类变量(类名点取)
static 无 —— 实例变量 (对象名点取)
final 用于修饰常量
static final int n=5; (90%以上用到static,就加final把它变成常量。光static破坏封装性)
方法成员:
[权限][修饰] 返回值类型 方法名(行参列表) (传值不传参)
{
方法体;
}
修饰: static (静态方法不能访问实例对象)
final (不允许重载) (用不到)
abstract (该类必须声明为抽象类)
native 本地方法。可以调用本地代码,比如调用c代码。
成员权限
public > protected > (default) > private
default 同包类
protected 同包+子类
接口里的方法默认为: public abstract
构造方法:(仅能初始化非静态属性,静态方法不能操作非静态属性,反之可以)
方法名=类名
一般不是public访问权限
不能有任何修饰
无返回值类型
如果不提供构造方法,则系统提供一个无参的构造方法。但是存在任何自己写的构造方法,缺省的构造方法立即失效。
类继承的时候,不继承构造方法。
初始化父类super()。 如果父类是抽象基类,就不用加了。
super()
this()
接口定义
[权限] interface 接口名 [extends 接口列表]
{
接口体;
}
可以继承多个接口。称为接口的拼装
接口一般声明为public
接口作为引用类型来使用。通过这些变量,可以访问所有实现该接口的方法。
练习:
1.mod02/exercise3
类的公有方法被称为类的接口。
写一个account类 放在包banking中
并用testbanking测试
2.在banking中添加类customer.
3.修改testbanking。用customer操作account。
2005-2-23
8:00
1. 需求分析(top n)
概念
业务
业务流程
2. 用例图(修正)
例:银行的账户account和客户customer关系
1) 客户有一个或多个账户
2) 账户与一个客户关联(例外:联名账户)
3) 客户私有、控制账户
需求分析
总体设计
详细设计
例:银行和客户、账号的关系
银行有若干个客户
客户可以选择多家银行(跨边界)
系统中只能有一家银行(系统边界)
银行应该对客户信息保全
银行拥有裁决权
银行类的内部创建帐户(银行类完全创建控制帐户)
要求:
创建客户
用户提交:姓、名、最初额度、身份证号码、六位密码
创建帐户
提交:
身份证号码、初始余额
业务:
身份证号码
帐户号码
密码
业务选择(参数):存取款 查余额
开会标准
概要设计
1. 需求会(10~15分钟)
分头写草图
2. 开会合并草图
修改草图
3. 提交修改草图
4. 合并修改草图
5. 画类图:每个类两个人
6. 组装至一台机器,编译运行
10:43——17:30
banking项目
2005-2-24
8:00
项目总评
细节问题:
1.只能有一个bank,设计方法:
sington设计模式:
构造方法私有,则不能从外界创建他
利用该类的静态常量来保存。
static final bank bookintance = new bank();
bank类被加载到内存里
new出一个bank实例,并存在静态区
private bank()
{
customers = new customer[max];
customernumber=0;
}
private static final bank bankinstance = new bank();
public static bank getbankinstance() {
return bankinstance;
}
或:
private static final bank bankinstance = null;
public static bank getbankinstance() {
if(bankinstance = null)
bankinstance=new bank();
return bankinstance;
}
在test.java中
bank abank= bank.getbankinstance();
3. 数组
引用数组是指针的指针,所以要判空
vector, list, arraylist (只能存一种类型的对象),也要判空
4. 密码管理方法不能用getpassword()。要用verify()。
上课内容:
异常
java中的异常
程序中60%代码用于处理异常
任何异常都被包装成异常对象
有异常时候,就抛出异常对象,给jvm。jvm去查调用栈
产生异常的代码不处理异常
好处
1) 用对象处理异常
2) 利用虚拟机作异常对象的传递
3) 正常代码和处理异常代码完全分开
try
{
unsafe;
} catch (异常类 e)
{
异常处理;
}
方法声明为throws,该方法实用时,必须放在try,catch结构中
public void f(int score) throws myexception
{
if(score<0||score>100)
throw new myexceptino(“”);
}
继承类的时候,不能抛出超出父类的异常。
tips:
接口是用来统领类,分类类的
类是用来实现接口的,实例化接口的一个工具
i/o 流
输入流,输出流 是控制同一个流
字符型,字节型
类库里凡是有stream都是字节流,有reader就是字符流
inputstreamreader把字节流转换为字符流
//把system.in转化为一个带缓冲的字符流
bufferedreader in=new bufferedreader(new inputstreamreader(system.in))
in.readline()
网络
添加
client端,server端,协议解释器
socket连接
协议自己定
协议的解析器
new serversocket
accept()
new socket
实例:
server端
1.new一个serversocket
try{
s=new serversocket(5432);
}catch (ioexception e){}
2.建一个死循环
while(true)
{
try{
socket s1=s.accept();
}catch(ioexception e){}
}
3.用产生的普通socket通讯
outputstream s1out=s1.getoutputstream();
dataoutputstream dos=new dataoutputstream(s1out);
dos.writeutf(input);
dos.close();
s1.close();
client端
1. 建一个普通socket
socket s1= new socket(“127.0.0.1”, 5432)
2.用socket通讯
inputstream is = s1.getinputstream();
datainputstream dis = new datainputstream(is);
system.out.println(dis.readutf());
dis.close();
s1.close();
作业:
1. 用例和流程
2. 设计类库,server结构
2005-2-25
8:00
多线程
业务需求 并发访问
技术需求 多进程、多线程
i/o流阻塞当前进程
技术
模型一
1. 创建线程的线程
2. 线程中跑的代码是哪一个对象的代码
定义一个实现runnable接口的类,实现他的run()方法,然后将这个类的实例作为thread构造方法的参数。创建thread类的实例。
在服务器里
new thread(object ); //object工具类,存所有参数。(包含业务代码)
.start.
构造这个类
class businessclass implements runnable
{
public void run()
{
代码; //调用其他对象完成业务和交互。
}
}
见exercise/mod15/exercise1
内部类
当
外->内代码(功能)
内->外部非公有
需要实用内部类
小结:
1. new thread( 类 )
2. 定义这个类, implements runnable
c/s bank项目
11:00 ~ 2005-2-26 17:40
2005-3-7
8:00
复习:
面向对象:清晰,封装,抽象(针对接口编程),复用(io类,集合类)
c/s -> b/s
区别:
c/s是基于操作系统的(jvm)和基本类库(jdk)的开发模式。
b/s 是基于已有“容器”的开发模式。
b/s优点:屏蔽底层的东西
1. 给商业系统的开发带来方便,重用基础代码和服务(事务安全性)
2. 可以使用经证明有效(率)的软件架构(j2ee核心模式 mvc)
3. 商业的技术支持(第三方)
c/s优点:
1. 完全控制client, server端的结构,使用自定义的通讯/业务协议
2. 可以精确定义底层服务,减少冗余和错误
3. 所有的开发代码都是透明的,不存在黑箱
用途
b/s 用于比较大型的,面向最终用户的商业系统(财务、人事、物流、电子商务、工作流)
c/s 用于各种软件系统(用于二次开发),或软件产品;特殊专用的商业系统(银行,国防部)
c/s 是b/s的基础。前者用的技术后者都能用到,反之不成立。
b/s几种流行的架构
都是一种开发模式,实现技术变化中
1. j2ee (开发模式 不是开发技术)
2. .net
3. php
4. cgi(perl, c)
j2ee开发模式结构:
系统功能
客户端
web层
控制层
业务层
数据操作层
容器
浏览器
web服务器,jsp/servlet容器
jsp/servlet容器,ejb容器
ejb容器,servlet容器
ejb容器, servlet容器
技术
html, css, xml, javascript, applet
http, jsp, servlet, html
jsp/servlet,ejb,javabean
ejb,javabean,servlet
ejb(entity),dao, jdo, r/o mapping
辅助技术
美工,flash
资源文件(国际化),mvc
资源文件(国际化),mvc。
针对容器本身的配置文件,jndi
jms,jta
tips:
jndi:java的目录服务(java naming and directory interface)
jms:java消息服务
jta:java事务服务
ejb强侵入型容器,不推荐使用。
ejb基于的两个技术:rmi和序列化
重要级:
要学的,重要的:html, xml格式,http, jsp,servlet,javabean
要熟的:html,javascript, dao,mvc (这两个是两种架构)
看一下:ejb,jndi,jms,jta
10:00
html/jsp
html表单
jsp 计算->服务器
痩客户端
client server端
浏览器brower —————-à jsp
| compile
servlet ————————–à后台调用
| run
html
过程
1) 发请求http协议
2) 生成两个对象request, response
3) 编译servlet
4) 显示部分硬编码
5) 返回给客户
html:
xml
<table>
<form> 表单
1) 收集用户输入
2) 通过http协议,提交参数到制定的url(简化了从客户端传到服务器端的过程,但是服务器端传回来的功能就大大减弱了)
jsp表现:
返回:
1) 处理结果(response)
2) html标签(用来做界面)
3) 动作:结果 -> html格式
4) 返回给客户
tips:
服务器端画界面
画的界面通过response对象返回
eg.
//03.html
<form action=”03.jsp”>
<input type=”text” name=”myname”><br> //文本框控件
<select name=”interest”> //下拉菜单控件
<option value=”football”>football</option>
</select>
<input type=”submit” value=”提交”> //提交按钮
<input type=”reset” value=”重置”> //重置按钮,自动给所有值赋为默认值,避免空指针错误
</form>
//03.jsp
<%
string name= request.getparameter(“myname”);
string interest= request.getparameter(“interest”);
out.println(“your name is “+ name);
out.println(“<br>your interest is: “ + inerest); //println的回车对源文件回车,对html的显示不起作用,所以要加回车标签<br>
%>
14:00
jsp语法
1. 脚本元素(代码)
1) 注释 <%– –%> (只在本代码中存在)
2) 表达式<%= %>
3) 声明<%! %> (只在本页起作用)
4) 代码段<% %>
2. 页面指令<%@name 属性列表 %>
1) page指令 <%@page attribute_list %>
<%@page language=”scriptinglanguage” import=”” contenttype=”text/html;charset=gbk” %>
2) jsp:include指令 <jsp:include page=”urlspec” />
3) jsp:forward指令 <jsp:forward page=”urlspec” /> (只能转到本机上某一其他页面)
4) jsp:param指令 不能单独使用 <jsp:param name=”name” value=”value” />
3. 内置对象
使用out对象输出数据
request对象和用户输入信息
response对象向客户端发送信息
使用session对象在不同页面共享数据(使用cookies或重写url)
启动tomcat
1. startup
2. bin下service install 控制面板-》服务-》apache 启动
配置
在conf文件夹里把server.xml里的connector里的端口号改成别的
tome-users.xml 可以改密码,加用户
练习jsp
webapps\test
webapps\test\web-inf 是放应用程序的配置文件和类、库文件
webapps\test\web-inf\classes\
webapps\test\web-inf\lib\
web-inf\web.xml
在tomcat manager里面部署deploy
练习:
提交: 1.jsp
<html>
<body>
<form action="echo.jsp" method="post">
<p>内容
<p><textarea name="content" rows="20" col="40"></textarea>
<p><input type="submit" value="submit">
</form>
</body>
</html>
返回: echo.jsp
<%@page contenttype="text/html;charset=gbk" %>
<%
request.setcharacterencoding("gbk");
string content=request.getparameter("content");
content=content.replaceall("\n","<br>");
out.println(content);
%>
2005-3-8
8:00
复习:
jsp语法
html表单
tips
http协议有两个方法:
post: 放在body内
get: 放在url头部。 url?attribute=value
<form method=”post”>
凡是表单提交数据,都用post
练习1:
密码登陆框
tips:
判断是否空字符串要用.equals(“”)
文件名.jsp小写
练习2:
简单验证在客户端进行,使用jscript.
js标签
script在客户端运行。简单的验证挪到客户端进行
<script language=”javascript”>
function mycheck() {
if(document.myform.myname.value==””){ //document是浏览器内置对象
alert(“请填写姓名!”);
return;
}
if((document.myform.password1.value!=document.myform.password2.value)||){
alert
return;
}
document.myform.submit();
}
</script>
提交表单
<form name=”myform” action=”simple.jsp” method=”post”>
<input type=”button” value=”提交” onclick=”mycheck()”>
session内置对象保存用户状态
//session-1.jsp
<%
//初始化
if(session.getattribute(“flag”) == null) {
session.setattribute(“flag”,”ok”);
session.setattribute(“shop”,””);
session.setattribute(“price”,””);
}
session.setattribute(“shop”,session.getattribute(“shop”)+”主板”);
session.setattribute(“price”,session.getattribute(“price”)+”100”);
out.println(session.getattribute(“shop”)+”<br>”);
out.println(session.getattribute(“price”)+”<br>”);
%>
窗口关掉,只要没离开这个网站,状态依然保留。
javabean
轻量级的组件
组件技术
javabean概述
可以被applet、servlet、jsp等java程序调用
特点
1) 独立性
2) 可重用性
3) 在可视化开发工具中使用
4) 保存状态
javabean属性
1) simple属性
get/set 都有:读写属性,有get:只读属性
2) indexed属性
可加索引的属性
3) bound属性
4) constrained属性
bean放在web-inf/classess下
在jsp中调用javabean
<jsp:usebean id=”bean名字” scope=”page|request|session|application” class=”bean对应的类名”/>
//id是应用变量 scope是bean作用的范围。page该页,request该请求,session该会话,application服务器不关机,则永远有效
<jsp:setproperty name=”checking” property=”balance” value=”0.0” />
<jsp:getproperty …>
eg.//bean.jsp
<jsp:usebean id=”first” scope=”page” class=”bean.samplebean” />
<body>
调用jsp:setproperty之前的值:<jsp:getproperty name=”first” property=”str” />
<p>
<jsp:setproperty name=”first” property=”str” value=”change value” />
调用jsp:setproperty之后的值:<jsp:getproperty name=”first” property=”str” />
</body>
</html>
//samplebean.java
package bean;
public class samplebean
{
private string str=”first value”;
public string getstr() {
return str;
}
public void setstr(string value) {
str=value;
}
}
tips
写javabean的注意事项
必须写set/get方法
必须package.不能放在默认包里
14:00
tips:
javabean的scope。 session最长用。同一个客户的多个请求用同一个bean
get/set方法使用条件:无参的。(标签使用法)
bean作为一个普通的java类。可以直接用他的方法。
练习3:
1. html页面。下拉表单
2. jsp。submit/item。
3. javabean。用户购物清单
2005-3-9
8:00
jdbc
jdbc是连接数据库的一种协议。在这个系统架构里相当于http。
功能:j2ee连接到外部资源
现在可以用xml访问数据库
协议:规定了统一的数据库访问接口,由各个厂商实现。
类:
1. drivermanager
getconnection
接口:
2. connection(数据库厂商写的)
3. statement (执行sql语句)
使用注意:
不要让jdbc破坏程序原有结构。r/o mapping
把数据库的作用降低到只有数据持久化。
语法:
jdbc api
1. drivermanager 管理jdbc(不是jdbc协议里的)将driver加载进内存
2. connection由 drivermanager 返回一实例
3. statement向数据库发送sql查询和取得一组结果的工具,也由数据库厂商提供
4. resultset定义访问执行statement产生的数据表方法
5. preparedstatement编译好的sql语句
eg.连接mysql数据库
import java.sql.*;
public class jdbcmysql{
public static void main(string args[]) {
string servername=”localhost”;
try{
class.forname(“com.mysql.jdbc.driver”); //先把路径配到classpath里
string url=”jdbc:mysql://”+servername”+”:3306/test”; //每个数据库不一样的
connection conn=drivermanager.getconnection(url,”root", "root");
statement stmt=conn.createstatement();
resultset rs=stmt.executequery(“select * from student”);
while(re.next()){
system.out.print("studentno:"+rs.getint(1));
system.out.print(“\tstudmentname:”+rs.getstring(2));
}
}catch(exception e) {}
连接字符串每个数据库都不一样。
练习:
投票系统
//voteconn.java
package vote;
import java.sql.*;
public class voteconn {
string sdbdriver=”sun.jdbc.odbc.jdbcodbcdriver”;
string sconnstr=”jdbc:odbc:vote”;
connection connect=null;
resultset rs=null;
public voteconn(){
try{
class.forname(sdbdriver);
}
catch(java.lang.exception e){}
}
public resultset executequery(string sql) {
try {
connect=drivermanager.getconnection(sconnstr);
statement stmt=connect.
public int executeupdate(string sql) {
int result=0;
try{
connect=driver
//index.jsp
<%@page contenttype="text/html;charset=gbk" %>
<%@page import="java.sql.*" %>
<jsp:usebean id="conndbbean" scope="page" class="vote.voteconn" />
<%
reasultset rs=conndbbean.executequery("select * from vote");
%>
<html>
<body>
<center>
<h2><font color=#0000ff>请你投票</font></h2>
<table border bgcolor=#00ffff>
<form action="vote.jsp" method="post">
<% while(rs.next()) {%>
<tr><td><input type="radio" name="type"
value =<%=rs.getstring("id")%>><%=rs.getstring("note")%></td></tr>
<%}
rs.close();
%>
<tr align="center"><td><input type="submit" value="投票"></td></tr>
</form>
<tr><td><a href="details.jsp">查看投票</td></tr>
<table>
</center>
</body>
</html>
//style.css
//vote.jsp
<%@page contenttype="text/html;charset=gbk" %>
<%@page import="java.sql.*" %>
<jsp:usebean id="conndbbean" scope="page" class="vote.voteconn" />
<%
string rb=request.getparameter("type");
if(rb!=null&& rb!=""){
string sql="update vote set c_num=c_num+1 where id="+rb;
conndbbean.executeupdate(sql);
}
%>
<jsp:forward page="detail.jsp" />
//admin.jsp
<%
conndbbeanexecute
<%=temprs.getstring(“note”)%>
<div align=”center”><a href=”delvote.jsp?id=<%=temprs.getint(“id”)%>”>删除</a></div>
//delvote.jsp
<%
string d_id=request.getparameter(“id”);
if(d_id!=null
conndbbean.execute
//addvote.jsp
<jsp:usebean scope=”page” class>
string nn=request.getparameter(“note”);
if(nn!=null
conndbbean.executequery(“select max(id) as maxid from vote”);
tmprs.next();
int max_id=tmprs.get int(“maxid”)+1;
tmprs.close();
string sql=”insert into vote value(“+max_id+”,’”;
sql+=nn+”’,0”;
system.out.println(sql);
condbbean.executeupdate(sql);
}
%>
<jsp:forward page=”admin.jsp”>
2005-3-10
8:00
servlet
常用api:http.servlet
特点
1. 结构很严格
2. 代码框架已经写好
3. 窗口给sevlet运行提供context
4. 仅用于处理http请求
initial方法:第一次调到内存时,访问一次。
destroy方法:被调出内存时,访问一次。
service方法:主方法,参数(request,response)
doget(),dopost():我们要写的方法。
eg1.
//testservlet 放在classes下面
import javax.servlet.*;
import javax.servlet.http.*;
public class testservlet extends httpservlet
{
public void doget(httpservlet request req, httpservletresponse res) throws servletexception{
res.setcontenttype(“text/html;charset=gbk”);
req.setchanracterencoding(“gbk”);
printwriter cut=res.getwriter();
out.println();
out.close();
}
}
//.jsp
<form action=”/myservlet/testserv”>
路径要在配置文件里配://web.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<!doctype web-app
public "-//sun microsystems, inc.//dtd web application 2.3//en"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<!– jspc servlet mappings start –> //配置servlet
<web-app>
<display-name>first</display-name>
<servlet>
<servlet-name>aaaa</servlet-name>
<servlet-class>testservlet</servlet-class>
//起始地址为web-info/classes,包名.类名
</servlet>
<servlet-mapping>
<servlet-name>aaaa</servlet-name>
<url-pattern>/myservlet/testserv</url-pattern>
// <url-pattern>/myservlet/*.do</url-pattern> //可以把很多种请求映射到一个servlet
// <url-pattern>/myservlet/*.*</url-pattern> //一组一组的mapping
<servlet-mapping>
<!– jspc servlet mappings end –>
</web-app>
tips:
写servlet不是主要的。而配置文件是主要的。
以配置文件(程序结构和框架)为中心,以jsp/servlet, html, javabean, ejb为辅
eg2.从servlet转到jsp
//jsp转servlet forward
request.setattribute(“applet”,”servlet”); //相当于jsp里的param标签
getsevletconfig().getservletcontext().getrequestdispatcher(“/hello.jsp”).forward(request.response);
在servlet里面使用javabean。new一个。
//servlet和javabean都是内置多线程。最好不用静态属性。
tips:
servlet配置
1. servlet-api.jar
javac –classpath %classpath%;…..
2. web.xml
14:00
mvc
一个controller带了一组servlet,一个config
controller分三部分
1. 控制器
2. 干活的
3. 配置文件
struts是一个mvc的框架
好处
1. 成熟
2. 用的多
特点:
1. 物理:struts是mvc基于java的一个框架(一个类库java和标签库jsp)
2. 功能:辅助实现mvc
struts框架
控制程序流程的类
实现和执行程序业务逻辑的类
自定义的标记使创建和验证html表单更加容易
*.tld 标签库文件
*.war web application 包
类库的安装:只需解压缩到一个路径,然后配置环境变量
struts难点
1. config.xml
2. 标签库
3. 体现mvc
struts的组件
actionservlet 控制器
actionclass包含事务逻辑
actionform显示模块数据
actionmapping 帮助控制器将请求映射到操作
actionforward 用来指示操作转移的 对象
actionerror 用来存储和回收错误
struts标记库 可以减轻开发显示层次的工作
struts配置文件:struts-config.xml
自己写的部分action里的perform()
小结:
在mvc中,
struts主要给了c的框架。m自己写。v用标签库自己写。
提供两个功能。一个c。一个c背后的系统设计。
controller写好了
action的框架写好了,只要填perform()
扭转。反向扭转用actionforward。
提供一个对用户输入数据的缓存部分actionform。
帮助流程设计。一个struts-config.xml。另一个是把流程抽象到对象放在内存里面。
标签库中会用到几个。
2005-3-11
8:00
model部分设计:
façade
值对象
eg. struts-blank
index.jsp做客户代理
<action
path="/welcome"
forward="/pages/welcome.jsp"/> //调用了一个默认的action
1. 写aciton
2. 在config.xml里面的actionmapping改成我们的类
3. 写个.jsp
2005-3-12
8:00
使用struts-console查错
使用ant自动建构
两部分:property target
14:00
../ 上一级目录
./ 当前目录
/ 当前盘符的根目录
转向:1 页面中最好都使用xxxx.do来把控制权交给action
2 真正的转向由control来做 path=”/xxx/xxx.jsp” 第一个xxx为web-inf下的一目录名
jsp的scope对应servlet里的:(scope指生命周期和可见性)
page 局部变量
request request
session session
application servletcontext
值对象(用于由action中传出数据)
model中:facade
练习
struts+bean+jdbc+ant
2005-3-14
8:00
小结
1.request.setattribute(“name”, mybean)
2.值对象 注意scope
3.model中用facade
final项目
报表:
1. struts
2. jasperreport api
3. ireport
14:00
final项目oss报表
1. 需求:
a) 管理报表定义和实例
b) 用户查看和输出
2. 工具
a) struts,ant,ide,mysql,jasperreport,jsp/servlet,javabean,ireport,tomcat
3. 流程
合作
1. 共享资源专人负责
a) struts
b) ant, mysql, tomcat
c) jasperreport(ireport)
2. 需求分析:
a) 会:草案
b) 分:用例图(流程)
c) 会:合并用例图。初步系统设计
d) 分:修正
e) 会:最终版本的系统设计
3. 设计数据结构
a) 类,配置文件
b) 数据库表
4. 详细设计
a) 分工:接口(协议)
b) 分:详细设计
