Servlet知识

来源:互联网 发布:小米4手机只有2g网络 编辑:程序博客网 时间:2024/05/01 12:52

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.         <%@includejsp:include的区别

<%@ include file="date.jsp" %>

<jsp:include page="date.jsp" flush="true"/>

include编译指令是在JSP程序的转换时期就将file属性所指定的程序内容嵌入,然后再编译执行;

而include指令在转换时期是不会被编译的,只有在客户端请求时期如果被执行到才会被动态的编译载入

只生成一个class文件

多个

Include不能带参数

 

<jsp:include>可以

 

同一个request对象

不同的request对象,可以取得包含它的页面的参数,并添加了自己的参数

常用

不常用

 

15.         forwardsendredirect的区别

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")
.forward(req, resp);

并且只能以/开头

常用

常用


16.         <jsp:useBean scope =page|request|session|application>

17.         jsp内置对象: out request response sessionapplication exception


0 0
原创粉丝点击