📄 day04.txt
字号:
Servlet_day04 langna 2007-9-26 星期三
回顾:
MVC
包结构: 先根据功能的层分-->再根据模块-->子模块
com.tarena.ums.web.user C
com.tarena.ums.web.course V
com.tarena.ums.services UserService M
com.tarena.ums.entity User M
系统分析员:将方法的参数和返回值还有结构已经定义好了;
要写注释;
CMM: 项目从第一级到第五级;从低到高;
注释的量不少于代码的40% (20%左右); html 不需要加注释;
一, MVC的应用:
M: JDBC/Hibernate/EJB
V: servlet/jsp/html/xml
C: servlet以及被sevlet调的类,遵守servlet的规范;
C控制的不是一个分支,可以控制一组请求;
find --> C --> M
delete --> C --> M
V有多个, C有一个; find.do / delete.do
用 ServletPath 解析 ;
异常是面向对象区别于面向过程最好的特性;
public void removeUser(int id){//如果不抛异常就说明操作成功;
String sql="delete from sd0705_user where id=?";
}
配置文件中: *.action ; 地址栏输入: user/find.action 或 find.action都可以;
UsserService 当作成员变量;减少了频繁创建;
UserService 类, 没有成员变量, 网络连接是一个方法申请一个; 是线程是安全的;
String path=request.getServletPath();
if(path.equals("/user/find.action")){
Collection<User> users = userService.findUsers();
request.setAttribute("users", users);
ServletContext application = getServletContext();
RequestDispatcher dispatcher = application.getRequestDispatcher("/res/user/list/view");
dispatcher.forward(request, response);
}else if(path.equals("/user/remove.action")){
int id=Integer.parseInt(request.getParameter("id"));
userService.removeUser(id);
ServletContext application = getServletContext();
RequestDispatcher dispatcher = application.getRequestDispatcher("/user/find.action");//自己调自己的不同分支;
dispatcher.forward(request, response);
}
else{
throw ServletException("invalid path"+path);
}
二, 配置连接池:
提高性能: DBA 优化 ;
JNDI: 访问命名服务器的API; 绑定服务,查找服务;
命名服务器: 由厂商提供;
服务器根据配置文件帮你绑定服务;
我们只需查找即可;
1)登陆服务器, 得到初始化上下文即可;
2)lookup("jndi-name"); 数据源, 消息队列,等等;
在tomcat中的配置:自带一个命名服务器;
在应用的根文件夹建立一个子文件夹: META-INF/context.xml
<Resource name="jndi-name" auth=" Container" type="javax.sql.DataSource" >
<Context>
<Resource name="jdbc/oracle" auth="Container" type="javax.sql.DataSource"
maxActive="2" maxIdle="1" maxWait="-1"
username="xjh0704" password="xjh0704"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@192.168.0.201:1521:tarena"/>
</Context>
name: 配置JDNI的名字
type: 绑定资源的类型
maxActive:最大连接数; 2就行
maxIdle:最大空闲连接数;
maxWait:等待时间,配置为-1就是无限等待,只到有空闲连接为止
java:comp/env : 指定的上下文;默认的前缀; 再加上自己指定的名字即可:jdbc/oracle
在配置文件中再加一个:jndiName=jdbc/oracle
可以读配置文件得到数据源;
import javax.naming.*;
public static Connection getJndiConnection()
{
try
{ //1, 登陆命名服务器;
Context context = new InitialContext();
//2,找到数据源, 这个是在tomcat下默认绑定Context的JNDIname
DataSource dataSource = (DataSource)context.lookup("java:comp/env/" + config.getProperty("jndiName"));
return dataSource.getConnection();
}catch(Exception e)
{
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
}
开发的时候测试用直连即可, 应用时改配置文件即可;根据不同的服务器配置不同的连接;
第一次访问创建连接池;以后就变快了;
连接池依赖数据源,数据源依赖命名服务器;
三 , 状态:会话:
HTTP是无状态的连接;
ServletRequest对象的生命周期就是在service()方法中,
除了forward(...,...)方法将这个请求对象转发给其他的Servlet。
<a href onclick="javascript: document.form[0].submit()" ; />
//一个页面上一个时间只能有一个表单提交;但可以有多个表单;
或改成提交按钮;
将id和数量封装成一个item map(id, amount);
将item再封装成一个List集合;
先判断请求中是否有一个items集合,没有的话再创建新的;
把一个条目放到集合中;
转发请求,再得到请求中的内容;
*.act
/shopping/*.act 是不对的
扩展名匹配和确切路径匹配不能放在一起使用
1,Session 服务器端技术
Session: 从创建开始到销毁结束;
HttpSession session= request.getSession(true); //先查找,如果不存在的话,创建一个session
HttpSession session= request.getSession(false);//如果存在就用已经存在的,否则返回一个空;
会话是以用户为单位的;一个用户跟服务器端进行的一组交互产生的空间的内容;
Session.invalidate();销毁;
session 采用的是超时策略;setMaxInactionInterval(秒);
在tomcat的conf的web.xml 中<session-config><session-timeout>30</session-timeout></session-config>
session.setAttribute(name,Object);
session.getAttribute(name);
session.remove(name);
如果使用getSession()方法,就等同于getSession(true)。
注意:ServletRequest对象适用于传输大量的数据,因为其生命周期比较短,
可以有效的节省内存资源。
大数据量的传输或保存不适合使用Session空间。
2,Cookie 客户端技术
Cookie,是记录用户的Session信息,也可以记录用户的请求信息,也就是SessionID,
来分辨哪一个用户是否登陆过。在每次登陆时,还会将Cookie发送回服务器端,
Cookie是用来跟踪Session的。
Cookie是由服务器发送的;
写Cookie:
doPost{
String user = request.getParameter("user");
String pass = request.getParameter("pass");
Cookie userCookie = new Cookie("user", user);
userCookie.setMaxAge(60 * 60 * 24 * 365);//设置Cookie的最大有效期,秒为单位
Cookie passCookie = new Cookie("pass", pass);
passCookie.setMaxAge(60 * 60 * 24 * 365);
response.addCookie(userCookie);
response.addCookie(passCookie);
}
读Cookie ;
doGet{
Cookie[] cookies=request.getCookie();//如果一个cookie都没有,会报空指针异常
if(cookie!=null){
for(int i=0;i<cookie.length;i++){
cookies[i].getName();
cookies[i].getValue();
}
}
}
不设有效期的话,默认的是当前浏览器有效;关闭就无效了;
设置cookie必须经过用户同意;
3, 区别与联系:
session 在服务器端保存的,可以存任何数据;
cookie 在客户端保存的,只能存字符串;
cookie:JSESSIONID=值;利用cookie技术跟踪会话;
服务器端创建一个session后,会自动向客户端发送一个cookie(如果cookie);
浏览器屏蔽cookie:隐私--设置--站点(127.0.0.1);不支持cookie
那么session也不能起作用了;在开发过程中一般不考虑cookie被屏蔽的情况;
2)URL_rewriting: 第二种
回写url来跟踪会话;
url ;jsessionid=值
forward(response.encodeURL("/time"));//用forward时出现的是原来的请求的地址;
重定向必须从应用的根开始写:
response.sendRedirect(response.encodeRedirectURL("/serv-app/time"));
;jsessionid=值;
url回写不能是静态页面;必须是动态的;把html变成servlet即可;
有必要时, javascript可以判断是否支持cookie; 几乎所有的浏览器默认支持cookie;
如果全都是动态页面的话,将回写url加上即可;
cookie对应一个站点的容量是有上限的;到上限时会覆盖原来的记录;
一般是30~50个; cookie数量要少,不要过分依赖于它;
有可能存在浏览器的内存或客户端的文件中(要经过客户的同意);
用来跟踪会话的cookie是写在内存中的,关了浏览器也就失效了;
相邻页面用隐藏域传; 用session;
3)
session是我们创建的;request.getSession(true);
request.getSession();
request.getSession(false);
立即销毁session.invalidate();
<time-out>指30分钟不用会超时;
一个用户:
windows:IE下,一个窗口中和另一个窗口cookie是不可见的;开多个窗口就是多个用户;
unix:不管开多少个窗口只要是一个人就是一个用户;
单点登陆,一个用户在一个地方登陆,别的地方也是登陆状态;
用全局的区域去记录;msn;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -