韩顺平Servlet和Jsp学习笔记

时间:2021-12-01 16:02:26

Java EE概述:

Java EE是一个开放的平台,它包括的技术很多,主要包括十三种核心技术(java EE就是十三种技术的总称)。建立一个整全的概念。

J2ee的十三种技术(规范)

1.       java数据库连接(JDBC)。——JDBC定义了4种不同的驱动:1.JDBC-ODBC桥,2.JDBC-native驱动桥3,JDBC-network桥4.纯java驱动。

2.       Java命名和目录接口(JNDI)【它是为了对高级网络应用开发中的使用的目录基础结构的访问】。

3.       企业Java Beans【Enterprise Java Beans,EJB)(它提供了一个架构来开发和配置到客户端的分布式商业逻辑,因此可以明显减少开发扩展性、高度复杂企业应用的难度。】。

4.       JavaServer Pages【JSPs】。

5.       Java servlets【servlets提供的功能大部分与JSP相同,JSP中大部分是HTML代码,其中只有少量的Java代码,而servlets则相反,它完全使用Java编写,并且产生HTML代码】。

6.       Java IDL/CORBA【用得不多】。

7.       Java 事务体系(JTA)/Java事务服务(JTS)【用得不多】。

8.       JavaMail和JavaBenas激活架构(JavaBeans ActivationFramework,JAF)。【JavaMail是一个用来访问邮件服务的API】。

9.       Java信使服务(Java MessagingService,JMS)【JMS是一个用来和面向信息的中层通信的API】。

10.     扩展标记语言【Extensible Markup Language,XML】。

11. 12. 13当前流行的及格框架 struts+hibernate+spring【ssh】。

------------------------------------------------------------------------------

在java ee的开发中有几个重要的开发模式:

1.Model1模式  2.model2模式(model2x模式(用得少))  3.mvc模式

一、Model1模式

    Model1的基础是jsp文件,它由一些相互独立的jsp文件,和其它一些java class组成(不是必须的)。这些jsp从HTTPRequest中获得所需要的数据,处理业务逻辑,然后将结果通过Response返回前端浏览器。

    从上面分析我们可以看到model1模式可以分为两类:

1.  Model1(纯jsp技术,不带任何java class)。

2.  Model1(jsp+java class)。

Model1模式的缺点:

1.  表现层和业务层混合在一起(乱!)。

2.  在开发过程中,不利于多人协同开发。

3.  不利于后期维护。

Model1模式的优点:

1.  简单,开发速度较快。

2.  比较适合开发小的项目。

二、model1(结合java class)开发模式,有些书上称:mv模式,即:màmodel模型(java class,业务逻辑层),vàview视图(jsp,界面层)。

1.一个数据库应一个类:ConnDB.java(得到连接)。

    2.数据库中的每一张表对应两个类:(1)UserBean.java(表示users表)类。(2)UserBeanCl.java(业务逻辑,即对users表的操作)类。

    如:

      login.jsp输入数据,logincl.jsp通过调用java class(模型)处理数据,wel.jsp显示数据。这是一种多么完美的开发模式。

   不足之处:

1.  Jsp技术主要做界面,但是logincl.jsp这里调用了java class(模型),完成对用户验证,显得有点怪怪的。

2.  Wel.jsp是用于显示用户信息(显示数据),但,wel.jsp除了显示数据,还调用了java class(模型),代码的优雅就荡然无存了,也不得于将来的分工。

3.  Servlet技术处理页面的跳转是最快捷和方便的,难道我们就此不用了吗?

      

三、mvc开发模式:M(model模型),V(view视图),C(controller控制器)。

    MVC是一个设计模式,它强制性的使应程序的输入、处理、和输出分开。使用MVC应用程序分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。

     M主要由java class来做,也可以是java bean、eib等

     V由jsp来做

     C由servlet来做

   对上的例子进行改进:

1.       增加控制器(servlet):将logincl.jsp用servlet来替代,发挥servlet充当控制中转的优势。

2.       在控制器(servlet)中去调用模型(model)去完成用户验证,并准备要显示的用户信息数据。

 

MVC开发模式的总结:

处理过程:首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后调用模型来处理用户的请求并返回数据,最后控制器用相应的视图显示模型返回的数据,并通过浏览器呈现给用户。

Mvc模式存在的缺点:

1. 工作量增加了。

由于开发者将一个应用程序分成了三个部件,所以使用MVC同时也意味着你将要管理比以前更多的文件,这一点是显而意见的。这样好像我们的工作量增加了,但是请记住这比起它所能带给我们的好处是不值一提。

2. 不适用小型项目,否则就是机关枪打蚊子。

3. 调试应用程序难度加大。

Mvc提倡模型和视图分离,这样也给调试应用程序带来了一定的困难。每个构件在使用之前都需要经过彻底的测试。一旦你的构件经过了测试,你就可以毫不顾忌的重用它们了。


------------------------------------------------------------------------------

数据库中用户名是中文,中文乱码问题(一般是要查询数据时,有中文字符才需要转码):

当提交表单时,表单中有中文,也会产生乱码。

   解决中文乱码问题,有三种方法:

1.  重新转码,如,有String u=”是中文”; u=newString(u.getBytes(“iso-8859-1”),”gb2312”);

2.  使用过滤器来解决[详解]

3.  通过修改Tomcat配置servlet.xml文件[不太稳定.],具体操作如下:

<Connectorport="8080" protocol="HTTP/1.1"  maxThreads="150"   connectionTimeout="20000"  redirectPort="8443" />改为:

<Connectorport="8080" protocol="HTTP/1.1"  maxThreads="150"   connectionTimeout="20000"  redirectPort="8443"URIEncoding=”gbk”/>


在<Connector>元素中增加属性URIEncoding,其值为”gbk,表示客户端请求传送来的值均以gb2312的标准来编码,这样在业务处理中就不需要在对其编码进行转换,大在简化了程序,提高了执行效率。

当request得到的是乱码时,可以这样解决(一定要这样写):

 name=new String(request.getParameter(“username”).getBytes(“ISO-8859-1”),”gb2312”);


------------------------------------------------------------------------------

3.       继承HttpServlet类(该类有doGet,doPost方法)

Servlet的生命周期

1.       init()函数,用于初始化该servlet(类似于类的构造函数,该函数只会被调用一次(当用户第一次访问该页面的servlet时被调用。)。)。

2.       业务逻辑函数(如:service,doGet,doPost等方法)(当用户每访问该servlet时,都会被调用,它有两个参数:ServletRequest—用于获取客户端的信息,ServletResponse—用于向客户端返回信息)。

3.      destroy()函数,用于销毁servlet实例(释放内存),只有如下三种情况才会周用(1.reloadservlet(webApps)2.关闭tomcat3.关机)值行了这个函数后,这个网站内的所有的sessionconTest都被释放,为空。


------------------------------------------------------------------------------

表单提交数据get请求和post请求的区别

1.       从安全方面看get<post,因为get提交的数据会在浏览器地址栏显示

2.       从提交的内容大小来看get<post, get提交的数据不能大于2K,面post提交的数据理论上不受限制,但是实际编程中建议不要大于64K。

3.       从请求响应速度上看get>post,get要求服务器立即响应请求,而post请求可能形成一个队列请求。

从以上几点看,表单提交方式(method)建议用post

sevlet中打印的html语句,可以不加引号

同一用户的不同页面共享数据的四种方法

1.  Cookie(小甜饼,在javax.servlet.http.*;这个包里面)(服务器在客户端保存用户的信息,比如登录名,密码…就是cookie,数据量并不大,服务器端在需要的时候可以从客户端读取。)。

Cookie的使用方法:①Cookie有点像一张表,分两列一个是名字,一个是值,数据类型都是String。②创建Cookie(在服务器端创建)Cookie c=newCookie(String name,String val);③将Cookie添加到客户端:response.addCookie(c); ④读取Cookie(从客户端读到服务器):Cookie[]allCookie=request.getCookies();c.getName();c.getValue();方法读取⑤修改Cookie存在时间:c.setMaxAge(30);单位秒,为负则该cookie不会存储,为0则删除该cookie,如果不设置存在时间,那第该Cookie将不会保存。

2.  sendRedirect(地址跳转,注意中文处理)

3.  Session(会话技术)(当用户打开浏览器,访问某个网站时,服务器就会在服务器内存为该浏览器分配一个空间,该空间被这个浏览器独占,这个空间就是session空间,其中的数据默认存在时间为30min,可以修改(在conf—web.xml中修改))。

Session的使用方法:①得到sessionHttpSessionhs=request.getSession(true);

②向session添加属性:hs.setAttribut(Stringname,Object val);③从session得到某个属性:Stringname=hs.getAttribute(String name);④从session删除掉某个性性:hs.removeAttribute(String name);⑤修改session的存在的时间:hs.setMaxInactiveInterval(20);单位秒,为负则永远不超时,为0则马上超时。

因为session的各个属性要占用服务器的内存,因此软件公司都是在迫不得已的情况下才使用。

注意:以文件—新建—窗口,的方式打开窗口,sessionID是不变的,也就是同一个session空间

 

4.  隐藏表单提交(form)(input type=hiddenname=““ value=““),在提交该表单时,能一并提交过去。(获取方式:req.getParameter(Stringname);)。


------------------------------------------------------------------------------

Cookie VS session

1.  存在的位置:cookie保存在客户端,session保存在服务器端。

2.  安全性:比较而言,cookie的安全性比session要弱。

3.  网络传输量:cookie通过网络在客户端与服务器端传输,而session保存在服务器端,不需要传输。

4.  生命周期(20分钟为例)cookie的生命周期是累计的,从创建时,就开始计时,20分钟后cookie生命周期结束,cookie就无效。②session的生命周期是间隔的,从创建时开始时计时,如在20分钟,没有访问过session,那么session信息无效,如果在20分钟内,比如第19分钟时,访问过session,那么它的生命周期将重新开始计算。③另外,关机会造成session生命周期结束,但是对session没有任何影响。

使用ServletContext(和session一样,但是它所有的客户都可以访问)。

1.       得到ServletContext实例:this.getServletContext();

2.       你可以把它想像成一张表,这个和Session非常相似:每一行就是一个属性。添加属性:setAttribute(String name,Object ob); 

得到值:getAttribute(Stringname);返回Object。

删除属性:removeAttribute(Stringname);

3.       生命周期:ServletContext中的属性的生命周期从创建开始,到服务器关闭而结束。

4.      使用ServletContext:的注意事项:因为存在ServletContext中的数据会长时间的保存在服务器,会占用内存,因此我们建议不要向ServletContext中添加过大的数据…….切记


------------------------------------------------------------------------------

分页技术(方法)

我们先讲讲分页的算法:

我们需要定义四个量,它们有各自的用处,如下:

int pageSize:每页显示多少条记录

int pageNow:希望显示第几页

int pageCount:一共有多少页

int rowCount:一共有多少条记录

说明:

pageSize是指定的(常量)。

pageNow是用户选择的(变量)。

rowCount是从表中查询得到的(是个变量)。

pageCount是计算出来的,该计算式为:

    if(rowCount%pageSize==0)

    {

        pageCount=rowCount/pageSize;

}

else

{

     pageCount=rowCount/pageSize+1;

}

然后查询数据库,我们可能很自然的想到,用

select 字段列表 from 表名  where id between ? and ?

但是如果表的某个id被删除了,那么某页可能就会少一条记录。

因此最终解决方法是如下语句:

    select toppageSize 字段名列表  from表名 where  id  not in

(select top pageSize *(pageNow-1)  id from表名)

   翻页的链接可以用下拉框或输入文本