Servlet实质上就是一个普通的Java类,只不过这个类继承了抽象的父类HttpServlet,并且把这个类放在tomcat容器中,就可以为用户提供服务。
1. 符合j2ee标准的web-app的目录结构
- WEB-INF
- classes
- web.xml
- lib
2. servlet开发过程
- 从httpservlet继承, 重写doget /doPost方法
- 部署web.xml
3. servlet生命周期
- 只有一个对象
- 第一次请求的时候被初始化,只一遍
- 初始化后先调用init方法,只一遍
- 每个请求,调用一遍service service doGet/doPost。
- 以多线程的方式运行,并只有一个对象,因此尽量不要在servlet中设计成员变量。
- 卸载前调用destroy方法
4. 为什么有2个init方法
(1) void init(ServletConfig config)
//tomcat调用,并传进ServletConfig参数
ServletConfig接口代表Servlet配置信息。
新建一个servlet实例时,tomcat读取web.xml中的配置信息,并包装成ServletConfig对象,并传递到init(ServletConfigconfig)方法中,init将这个对象的引用赋给自己的ServletConfig成员变量,并调用无参的init()。
如果我们重写init(ServletConfigconfig),需要调用super. init(config)或者添加this.config=config。如果忽略了这一点,this.config为null,程序中调用this.getServletConfig()时就可能出错,所以为了程序安全,最好调用下面无参数的init()。
(2) void init( )
重写init()不需要调用super.init()。
总结:从Servlet接口带过来的接受参数的init()方法,对它进行重写时,如果忘了调用super.init(config),那么程序中this.getServletConfig().getServletName()就会出错。所以重写无参数的init()就不会出错。
5. /的含义
- form
- form提交中action的路径可以为虚拟路径
- 也可以为绝对路径,/代表http://127.0.0.1/(域名和端口名)
- web.xml
- web.xml中url-pattern为webapplication根路径,/代表http://127.0.0.1/Test/
6. 乱码
场合:页面本身有中文的时候 解决办法:servlet:resp.setContentType("text/html;charset=gbk"); Jsp: <%@ page contentType="text/html;charset=gb2312"%> 注意:一定要写在PrintWriter out = resp.getWriter();之前 |
场合:解决get方式乱码问题: 解决办法:修改server.xmlàURIEncoding="GBK" |
场合:解决post方式提交内容的乱码 解决办法:request.setCharacterEncoding("GBK"); 注意:一定要写在存取第一个参数之前 不要调用response.setCharacterEncoding("GBK"); |
场合:<jsp:param name="user" value="<%=s%>"/>,url地址包含中文参数 解决办法:<%request.setCharacterEncoding("GBK");%> 注意: |
7. Cookie 和session的区别
注意cookie有时候禁不掉
Cookie | session |
存储在客户端 | 存储在服务器端 |
两种类型 l 无生命周期(存在窗口) l 有生命周期(文本) | 两种实现方式 l 依赖于cookie l url重写 |
父路径不能访问子路径的cookie | 同一个session的窗口共享一个session(父子关系的窗口也可以) |
典型应用: l 3个月不用再登陆 l 购物车(http://www.china-pub.com/) | 典型应用: l 用户登陆 l 购物车也可以用session实现。· |
不可靠 | 可靠 |
Cookie:
(Cookie并不稳定,客户端可以直接删除Cookie文件,所以基于Cookie的编程通常是实现一些锦上添花的功能,可有可无的业务逻辑,如三个月内可自动登录。基于核心的业务逻辑要用session不要用Cookie)
Http协议:连接后,将要下载的东西下载完之后,就断开连接。下次Http再次向服务器发送连接请求时,服务器不知道Http之前已经连接过一次。
为了记录Http的连接请求,服务器将信息记录在客户端
1、 服务器可以向客户端写内容
2、 只能是文本文件
3、 客户端可以阻止服务器写入
4、 只能拿自己webapp写入的东西
5、 Cookie分为两种:(1)属于窗口/子窗口(放在内存中);(2)属于文本(有生命周期的)
6、 一个Servlet/jsp设置的cookies能够被同一个路径下面或者子路径下面的servlet/jsp读到(路径=URL)(路径!=真实文件路径)
Session:
由于Http协议的特点是无连接性,连接完之后马上断掉。有时候需要记住之前的客户端曾经访问过哪些页面。
核心的业务逻辑应该用session来编程,不用Cookie。
第一个客户访问时,在服务器端创建一个session对象,把这次连接的相关信息记入服务器端。本次连接断掉之后,下次再次连接时,查找对应的id的session对象
只要是同一套有父子关系的浏览器窗口,无论是什么路径(不存在同一路经和子路径问题),都可以访问到同一个session。如果是新建的窗口就不能访问到之前的窗口的session。
如果客户端把Cookie禁掉了,就要采取URL重写的方式。
Session总结:
1、服务器的一块内存(存key-value)
2、和客户端窗口对应(子窗口)(独一无二):只要窗口不关,session就会存在,但是session有一个默认的失效时间,在tomcat的conf下的web.xml中设置,如果一直没有操作,就会失效。
3、客户端和服务器有对应的SessionID
4、客户端向服务器发送SessionID的时候两种方式:(1)cookie(内存cookie)(2)rewriten URL
5、浏览器禁掉cookie,就不能使用用Cookie实现的session
6、如果想安全的使用Session(不论客户端是否禁止Cookie),只能使用URL重写(大大增加编程负担),所以很多网站要求客户端打开cookie。
不同点:
(1) 信息的存储位置不同,Cookie存在客户端;session存在服务器端。
(2) Cookie只能写文本内容,并且长度不能超过4K;session在服务器端可以装很多。
8. application (ServletContext)的概念
统计web app整个生命周期,所有客户端一共访问了多少次。
我们写的Servlet不能单独运行,要放在tomcat容器中,容器是知道怎么样把咱们写的Servlet new出来,知道怎么调用doGet方法,但是咱们自己的Servlet怎么和tomcat打交道呢?也就是怎么和自己的运行环境打交道?
ServletContextapplication = this.getServletContext();
只要是同一个web app中的所有的Servlet,访问的是同一个application,除非web app被卸载了。
Application有一个accessCount属性。
Java适合做中间件或后台,不适合用来开发图形化界面应用程序怎么从Servlet里面连接数据库?
SERVLET中使用javabean:
Javabean就是普通的类。
广义JavaBean=普通Java类(类似于JavaBean的功能)
狭义JavaBean=符合Sun JavaBean标准的类(与图形化界面编程有关)
我们通常所说的JavaBean是指广义JavaBean,在Servlet中使用Bean和在通常程序中使用Bean类似
- 属性名称第一个字母必须小写,一般private
- 一般具有public 的getters setters方法
- 要具有一个参数为空的构造方法
- 但Bean不应具有GUI表现
- 一般是用来实现某一业务逻辑或取得特定结果
9. jsp初学者容易犯的错误
- WEB-INF子目录下面不能放置html jsp 等文件
- 不能直接打开
10.jsp/servlet连接数据库时要注意的事项
拷贝数据库驱动的jar包到apache-tomcat-6.0.14\webapps\Test\WEB-INF\lib文件夹
确认数据库已经启动
用户名、密码应该正确
11. <%! <%区别
12. 如何解决ie缓存问题
13. TestErr.jsp / ErrPage.jsp
- 不太稳定,有的时候不好使:
- 先不写这句话:<%@page errorPage="ErrPage.jsp"%>
- Ie不行,firefox行
14. <%@include和jsp:include的区别
<%@ include file="date.jsp" %> | <jsp:include page="date.jsp" flush="true"/> |
include编译指令是在JSP程序的转换时期就将file属性所指定的程序内容嵌入,然后再编译执行; | 而include指令在转换时期是不会被编译的,只有在客户端请求时期如果被执行到才会被动态的编译载入 |
只生成一个class文件 | 多个 |
Include不能带参数
| <jsp:include>可以
|
同一个request对象 | 不同的request对象,可以取得包含它的页面的参数,并添加了自己的参数 |
常用 | 不常用 |
15. forward和sendredirect的区别
Sendredirect | Forward |
是不同的request | 虽然是不同的对象,但是,可以取到上一个页面的内容 |
send后的语句会继续执行,除非return | forward后的语句不会继续发送给客户端 |
速度慢 | 速度快 |
需要到客户端的往返,可以转到任何页面, | 服务器内部转换, |
地址栏有变化 | 地址栏没有变化 |
可以传参数,直接写在url后面 | 可以传参数 |
/代表的是http://127.0.0.1/ <%response.sendRedirect("/test/ServletToJSP");%> <form action="/test/ServletToJSP"> <a href="/test/ServletToJSP">test</a> | /代表的是http://127.0.0.1/test this.getServletContext().getRequestDispatcher ("/servlet_jsp/ServletUseJsp.jsp") 并且只能以/开头 |
常用 | 常用 |