📄 day03.txt
字号:
Servlet_day03 langna 2007-9-25 星期二
回顾:
1, 如何编写线程安全的servlet? 唯一的,成员变量,静态变量, 写的时候加锁,读的时候不需要;
2, 如何读取请求中的参数?
作业:
1, 计数器: 访问此servlet的次数:
int current=0;
synchronized(this)
{
count++;
current=count;
}
out.println(current);
指定字符集:告诉浏览器我这里有特殊字符;
response.setContentType("text/html;charset=gbk");
2, getParameterMap: key -- String
value-- String[]
一, ServletInputStream / ServletOutputStream
getReader:调了这个系统就不会再给你封装了,getParameter就得不到了;
getParameter:调了这个系统把参数给你封装好了, 就不能调getReader了;
xml文件: version="2.4" ; 2.4 之前用的是dtd约束的; 2.4之后用的是Schema;
虚拟路径也叫servlet路径;
getContextPath: 应用路径
将serv-app 改为 servlet-app ;
1)一个 servlet 可以部署在任何应用中; 因为虚拟路径是从应用之后开始写的;
2)对于form表单中的action的路径有影响;因为这里的路径是从应用路径开始写的;
解决的方法是在:action中改成动态的路径;将静态页面变成servlet;
将整个页面写到doGet()请求中;将路径写成动态的;
3)将action中的应用路径去掉;改成相对路径;
相对路径:相对的是当前请求; serv-app/request/form.html; 虚拟路径是: /request/parameter
action="parameter" ;
ServletPath: 虚拟路径
*.do 通配模式;一个servlet服务多个请求
MVC模式: 多个servlet之间通信;
二, 分布式:
数据库服务器; C/S;
B/S: web browser -- web server -- DB
java中支持分布式的技术;
数据库;jdbc;
RMI; 远程方法调用;
兼容c++ ; corba语言;
IDL; 接口访问语言;
JDBC的编程步骤: (安装驱动)
1, 加载驱动;
2, 建立连接;
3,创建statement;
4,执行sql语句;
5,处理结果集;
6,释放资源;
将数据库的去定ojdbc14.jar 放到 common/lib 包下; 这样会在tomcat启动的时候会找到
这个驱动啊!
init(); 配置init 参数; 不需要同步;单线程的;
service()中只读也不需要同步;
servlet 从数据库中读数据封装成html发送到客户端;
create: 创建记录,增加
read: 读记录,
update:更新记录
delete:删除记录
例子:
1,建表: (依赖于数据库的)
create table ln_user(
id number(4) primary key,
name varchar2(20) not null,
birthday date,
gender varchar2(6),
phone number(20)
);
保存为credbs.sql ; 一般都用sqlplus建表,除非用临时表才在程序中建;
2,建一个序列:
create sequence ln_seq;
insert into ln_user values(ln_seq.nextval,'langna',sysdate-24,'femail',1376);
to_date('2007-9-3','yyyy-mm-dd')
3, 数据库的异常在servlet方法中捕获并向客户端抛出servlet异常;
在servlet中写jdbc代码,访问数据库;
做静态原型页面;再变成动态的;
IO异常也应该往外抛, 不是面向最终用户的;是被调的;
4, 配初始化参数:
<servlet>
<servlet-name>UserServlet</servlet-name>
<servlet-class>com.tarena.UserServlet</servlet-class>
<init-param>
<param-name>jdbcurl</param-name>
<param-value>jdbc:oracle:thin:@192.168.0.201:1521:tarena</param-value>
</init-param>
<init-param>
<param-name>driver</param-name>
<param-value>oracle.jdbc.driver.OracleDriver</param-value>
</init-param>
<init-param>
<param-name>username</param-name>
<param-value>xjh0704</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>xjh0704</param-value>
</init-param>
</servlet>
5, 将不同的技术分层: jdbc和servlet分层 ; UserService
6, jdbc 连接数据库, 读配置文件dbconfig.properties; 放到classes文件夹中;(相对于类路径)
driverClassName=oracle.jdbc.driver.OracleDriver
dburl=jdbc:oracle:thin:@192.168.0.201:1521:tarena
username=openlab
password=open123
用类装载器来定位资源:
InputStream in = UserService.class.getClassLoader()
.getResourceAsStream("config/dbconfig.properties"); //classpath--classes下
Properties prop=new Properties();
prop.load(in);
in.close();
prop.getProperties("dburl");
对eclipse而言,项目的根是类路径; 而不是当前路径;
在命令行下,将文件的路径追加到类路径下; 也可以找到相关的资源;
将jdbc相同的代码抽取出来,做一个工具包; JdbcUtil { }
将读配置文件放到静态代码块中;只读一次就行;在静态代码块中抛ExceptionInInitializerError异常;
private static Properties config = new Properties();
static{
try{
InputStream in = ConnectionFactory.class.getClassLoader()
.getResourceAsStream("config/dbconfig.properties");
config.load(in);
in.close();
}catch(IOException e){
e.printStackTrace();
throw new ExceptionInInitializerError();
}
}
三, MVC
1,解析请求:控制作用 C UserActionServlet : 将showUser()去掉
2,处理请求:业务 M UserService / User / JDBCUtil
3,返回客户端结果:视图 V UserListViewServlet : 将showUser的代码放到这里的doGet方法里;
(JSP)
一个servlet怎么调另外的servlet; 上下文=应用;
ServletContext: 全局对象,在同一个应用中只有一个,任何一个servlet都可以访问它;
在UserActionServlet转向UserListViewServlet:
{
Collection users = userServices.findUsers();
request.setAttribute("users", users);//将要传的数据放到请求中;
ServletContext application = getServletContext();
RequestDispatcher dispatcher = application
.getRequestDispatcher("/user/list/view");
//传的是目标servlet的虚拟路径(与web.xml中的一致);
dispatcher.forward(request, response);
}
UserListViewServlet
{
Collection students = (Collection)request.getAttribute("users");
}
M: jdbc , javabeans , EJB
V: servlet/jsp
C: servlet
起到了一个松耦合的作用;
关于配置:
1, oracle用的是8080,把端口占用了;
改tomcat的端口号:
apache-tomcat-5.5.20\conf\server.xml\Connector 8080-->8088/80(不需要加端口)
2, web.xml 加一个空格; 修改后
context.xml <Context reloadable="true"> //会自动监视classes下的文件;
3, 写一个脚本:
主目录下,建一个bin 自动加到path下 ; echo $path
vi .bash_prifile path=$HOME/bin: 默认有这个路径;即这个目录下的可执行命令可以在任何目录下执行;
工程 -- abc , src-- 源文件: HelloworldServlet.java, classes -- 类路径
在bin/servletc.sh写上: -cp=-classpath
javac -d $HOME/abc/classes -cp $CATALINA_HOME/common/lib/servlet-api.jar $1(脚本运行时的第一个参数)
在src目录下直接编译就行:
servletc.sh HelloworldServlet.java
将tomcat 应用的类编译时的所有内容写到sh文件中,生成的字节码文件放到想放的地方 :
javac -d $CATALINA_HOME/webapps/abc/WEB-INF/classes
-cp $CATALINA_HOME/common/lib/*.jar $1
或者:
javac -d $1 -cp $CATALINA_HOME/common/lib/*.jar $2
$1 : 目标路径
$2 : 源文件
4, 在eclipse中配置数据库和服务器:
1) eclipse-jee-europa-win32;
databases--> SQL-JDBCConnection--> name: oracle20@oracle --->
选择一个驱动---> oracle9(oracle-thin)---> driver-name: oracle14-->
jar包-- add jar-- ojdbc14.jar ---> 将属性写上
2)
建一个 web 工程, 建的时候有一个runtime 配置,将tomcat安装目录导入即可;
部署描述符:
dynamic web moudle -- 2.4
java-- 5.0
content-root : 应用名
src: 直接写类或建一个servlet; 可以直接配置servlet的初始化参数和url
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -