码迷,mamicode.com
首页 > 编程语言 > 详细

java基础--jsp/servlet

时间:2016-06-12 02:50:53      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:

后端:servlet  jsp

前后端:ajax

一定要使用自定义协议

TCP/IP:

     1    封包 :有可能分为多个包发送hello world

     2   粘包:接收方接到后粘包,可能会出错 helloworld  hello world

c/s

客户控件GUI--》调用通讯模块--》打包(按照自定义协议将数据封装成一个数据包)--》向业务通讯模块发送请求--》业务通讯模块进行拆包--》通讯模块调用业务--》业务访问DB数据库--》业务模块返回处理结果到通讯--》打包--》发送响应--》拆包--》更新

b/s

GUI(css、html、js)-->通讯模块--》打包(http协议)--》brwser通讯模块发送请求-->wenb服务器通讯模块--》通讯模块拆包--》通讯模块调用业务(servlet)--》业务访问DB--》业务返回结果到通讯模块--》打包--》发送响应--》拆包--》更新

 

1    web开发的背景知识

     (1)    两层的C/S

         特点:使用数据库允当服务器(数据库不仅要保存数据,还需要编写大量的业务处理逻辑,客户端负责界面及部分的业务处理逻辑)。

         缺点:可移植性差(比如,要换数据库,就需要重新些一次业务处理逻辑,因为数据库的编程语言是不一样的)。另外要求客户端跟数据库之间保持一个数据库连接,所以不适合开发大型的应用(数据库能够提供的数据库连接的个数是有限制的)。

     (2)    三层的C/S

         特点:数据库之负责管理数据,所有的业务逻辑写在应用服务器里面,客户端负责界面。

         缺点:客户端需要单独安装。开发相对比较复杂(需要开发通讯处理模块,需要自定义协议)

     (3)b/s

         特点:数据库只负责管理数据,所有的业务逻辑写在web服务器里面,客户端使用标准的浏览器

         其实,b/s架构从本质上将,是一种标准化的c/s,即使用标准化的通讯协议(http协议),标准化的客户端程序(浏览器),标准化的服务器(比如tomcat)

         优点:客户端不再需要安装,另外,开发相对简化(通讯模块不再需要开发了,也不再需要自定义协议)

2    什么是servlet?

     sun公里制定的一种用于扩展web服务器功能的组件规范。

     1》  扩展web服务器功能

         1)  早期的web服务器(比如:apache web server,iis)只能够处理静态资源(即需要事先将html文件写好)的请求,不能处理动态资源(需要一句用户的请求进行计算然后声称对应的html)的请求

         2)   早期可以使用CGI程序来扩展web服务器:

              CGI程序可以使用很多语言来发开,比如perl,c等等都可以,但是cgi程序有几个问题(比如:开发复杂、可移植性不是特别好,因为启动过多的cgi进程)。

         3)  servlet也可以扩展web服务器(即动态生成页面)功能:

              方案一:浏览器发请求给web服务器(比如,apache web service,iis,这些web服务器本是不能够处理静态资源的请求的),这些web服务器判断是否需要计算,如果需要,会调用servlet容器,servlet容器再去调用servlet处理请求。

              方案二:浏览器直接发请求给servlet容器(比如tomcat,jetty)因为servlet容器出了可以运行servlet之外,同时也可以允当简单的web服务器。

        

     2》  组件规范

         1)  组件:

              符合一定规范,实现部分功能的,并且可以部署在相应的容器里面运行的程序模块。

              servlet就是一个组件,我们在写servlet时,不需要考虑网络编程相关的问题,这些问题由servlet容器去解决

         2)  容器:

              符合一定规范,为组件提供运行环境和相应的基础服务的程序

              。

3    如何开发一个servlet?

     step1.写一个java类(servlet只能够使用java语言来开发),该类需要实现servlet接口或者继承HttpServlet抽象类。

     step2.编译

     step3.打包

         appname(应用名称)

              WEB—INF

                   classes(.class文件)

                   lib(可选,.jar文件)

                   web.xml(部署描述文件)

     step4.部署

         将step3创建的整个文件夹拷贝到servlet容器特定的文件夹下面.或者也可以将整个文件夹先使用jar命令压缩成.war文件然后再拷贝.

     step5.访问

         启动servlet容器(web服务器),在浏览器地址栏输入http://ip:prot/appname/servlet-url;其中servlet-url(参见web.xml)

4    tomcat的安装与简单的使用

     (1)  安装

         step1.找到tomcat的压缩文件(/opt/tomcat/apache-tomcat-5.5.23.tar.gz),之后解压到/home/soft01

              www.apache.ort可以下载tomcat的安装文件

         step2.配置环境变量

              cd/home/soft01

              vi.bash_profile

              在该文件当中,添加JAVA_HOME:JDK的安装路径,例如/opt/java6.0

              CATALINA_HOME:tomcat的安装路径,如:/home/soft01/apache-tomcat5.5.23

              PATH:/home/soft01/apache-tomcat5.5.23/bin

         step3.启动tomcat

              cd/home/soft01/apache-tomcat5.5.23/bin

              shstartup.sh或者sh catalina.sh run(widow系统用startup.bat)

              接下来打开浏览器,输入:http://localhost:8080

         step4.关闭tomcat

              cd/home/soft01/apache-tomcat5.5.23/bin

              shshutdown.sh

     (2)tomcat的几个主要文件夹的作用

         1)bin:是一些可执行文件(比如,启动和关闭tomcat)

         2) common:放置可以被部署到该服务器上面的所有的程序都可以访问的jar文件爱你

         3)conf:服务器的配置文件

         4)webapps:tomcat的部署文件夹

        

5.   使用myeclipse来开发servlet

     step1    启动myeclipse

     step2    让myeclipse来管理tomcat

     step3    创建一个web工程

6、servlet是如何运行的?

     比如,我们在浏览器地址栏输入             

     http://localhost:8080/web01/greeting:

     step1,浏览器依据ip,port建立与servlet容器之间的连接。

     step2,浏览器将请求数据打包,然后发送请求。

     step3,servlet容器解析请求数据包,将解析之后的结果封装到request对象,并且,还要创建一个response对象。

     step4,servlet容器依据请求资源路径找到servlet的配置,然后创建servlet对象。

     step5,servlet容器接下来会调用servlet对象的service方法,并且会将事先创建好的request,response对象作为参数传递进来。可以通过request对象提供的方法来获得请求参数值或者其它一些有用的数据,也可以将处理结果写到response对象里面去。

     step6,servlet容器从response对象里面取出处理结果,然后打包,发送给浏览器。

     step7,浏览器解析响应数据包,取出数据,生成相应的界面。

    

7,常见的错误及解决方式

     (1)404:

         404是一个状态码,状态码是一个3位数,表示服务器处理的状态。404表示服务器依据请求资源路径,找不到对应的资源。  解决方式: 依据http://ip:port/appname/servlet-url规则仔细检查你输入的请求地址。如果没有问题,再检查servlet-name是否一致。

     (2)500:

         系统出错。

         解决方式:检查源代码,检查配置文件(web.xml)。

     (3)405:

         容器找不到处理方法

         解决方式:仔细检查service方法的签名



1    http协议

     (1)  什么是http协议(超文本传输控制协议)

          由w3c定义的一种应用层协议,用来定义浏览器与web服务器之间通讯的过程及数据的格式

         a    浏览器于服务器之间通讯的过程:

              第一步:浏览器建立与服务器之间的连接

              第二步:浏览器打包(按照http协议的要求),发送请求

              第三步:服务器打包,发送响应

              第四步:服务器关闭连接

              特点:一次请求,一次连接

              优点:服务器可以利用有些的连接尽可能为更多的客户端服务

         b    数据的格式

              1)请求数据包

                   请求行:请求方式    请求资源路径   协议的类型和版本

                   若干消息头:消息头是一些键值对,一般由浏览器或者服务器自动生成,表示特定的含义。比如,浏览器可以发送user-agent消息头告诉服务器浏览器的类型和版本。

                   实体内容:只有发送post请求时,浏览器才会将请求参数添加到这儿,如果是get请求,请求参数会添加到请求资源路径的后面。

              2)响应数据包

                   状态行

                   若干消息头

                   实体内容

2、get请求与post请求

     (1)哪一些情况下,浏览器发送get请求

         a,直接在浏览器地址栏输入某个地址

         b,点击链接

         c,表单默认提交 

     (2)哪一些情况下,浏览器发送post请求

          a, 表单设置了method="post"。

     (3)get请求的特点

         a,会将请求参数添加到请求资源路径的后面,只能够提交少量的数据给服务器。

         b,请求参数会显示在浏览器地址栏,不安全(比如,路由器会记录这个地址)。

     (4)post请求的特点

         a,会将请求参数添加到实体内容里面,能够提供大量的数据给服务器。

         b,请求参数不会显示在浏览器地址栏,相对安全(post方式并不会对请求参数加密)。

    

3、web编码中的编码问题

     1)常识:

         a,java语言会将所有字符以unicode编码格式保存在内存里面。

         b,编码:将以unicode编码格式对应的字节数组转换成某种

         c,本地编码格式(gbk,gb2312,utf-8)对应的字节数组。

     解码:将某种本地编码格式对应的字节数组转换成unicode

     编码格式对应的字节数组。   

     2)如果服务器端某个servlet要输出中文给客户端,需要添加如下的代码:

         response.setContentType("text/html;charset=utf-8");

         这行代码的作用有两个:

         第1个:out.println时,使用正确的编码格式进行编码(unicode -- >utf-8)

         第2个:设置了content-type消息头的内容,浏览器会按照指定的编码格式来打开这个页面(解码)

        

4、表单的处理

     (1)如何获得表单中的请求参数值?

         a,String request.getParameter(String paraName);    

         要注意:

              a1,paraName不正确,会获得null。

              a2,在文本输入框中,如果不输入,会获得空字符串。

         b,String[] request.getParameterValues(String paraName);如果有多个参数名称相同,使用该方法。

     (2)如果表单中有中文参数值,如何处理?

         当表单提交的时候,浏览器会对表单中的参数值进行编码(会使用打开表单所在的页面时的编码格式来编码)。服务器在默认情况下,会使用iso-8859-1进行解码,就有可能发生乱码问题。

         解决方式一:

              step1,保证表单所在的页面使用指定的编码格式打开。

              比如,对于html文件,可以添加:

              <!--模拟content-type消息头 -->

         <metahttp-equiv="content-type"

         content="text/html;charset=utf-8"/>

         并且,要设置method="post"。

              step2,在服务器端

              //告诉服务器使用指定的编码格式进行解码

              //只对post请求有效。

              request.setCharacterEncoding("utf-8");

         解决方式二:

              step1,同上。不要求设置method属性。

              step2,

              name= new String(name.getBytes("iso-8859-1"),"utf-8");

                  

     去ftp下载mysql-connector-java-5.1.7-bin.jar这是mysql的jdbc驱动程序

5、mysql数据库的简单使用

     1)登录数据库(使用root用户登录)

     mysql  -uroot;

     2)查看有哪些数据库实例

     showdatabases;

     3)创建一个新的数据库

         创建一个名叫jd1303db的数据库,该数据库的默认字符集是utf-8

         createdatabase jd1303db default character set utf8;

     4)使用某个数据库

         usejd1303db;

      5)查看当前数据库有哪些表

          showtables;

      6)建表

          createtable t_emp(

              idint primary key auto_increment,

              namevarchar(50),

              salarydouble,

              ageint

          );

         primarykey:主健约束

         auto_increment:自增长列,在插入记录时,由数据库自动赋值。

         insertinto t_emp(name,salary,age) values(‘tom‘,20000,20);

    

6、servlet如何访问数据库

     step1,将数据库驱动拷贝到WEB-INF\lib下。

     step2,编写jdbc代码访问数据库,需要注意异常的处理。

        

         

1、重定向

     (1)什么是重定向?

         服务器向浏览器发送302状态码和一个Location消息头(包含了一个地址,称之为重定向地址),浏览器会立即向重定向地址发请求。

     (2)编程

         response.sendRedirect(Stringurl);url是重定向地址。

     (3)需要注意的问题

         a,重定向之前,不能够调用out.close()。

         b,重定向之前,会先清空response缓存的数据。

     (4)特点

         a,重定向地址是任意的。

        

练习:

         完成修改员工操作。

        

2、dao (data accessobject)

     (1)什么是dao?

         封装了数据访问逻辑的模块。

     (2)如何写一个dao?

         step1,  entity 实体类         实体类与表对应,是为了方便对数据库中的记录进行操作而设计的一个普通的java类。

         step2,DAO接口在DAO接口当中,声明对某个表的所有操作相关的方法。基本原则: 接口中声明的方法不要涉及任何具体的实现。

         step3,DAO实现

              使用具体的数据库访问技术来实现DAO接口中声明的方法。  

         step4,工厂

                   什么是设计模式:是为了解决一类相似的问题提出的解决方案。

                   工厂设计模式:工厂将对象的创建过程对外屏蔽,为调用者提供符合接口要求的对象(产品)。

              比如:

                   Connectionconn = DriverManager.get...



set names utf-8;//设置在命令窗口输入的所有字符都utf-8编码的,即使输入的是gbk,也会自动转化为utf-8的

mysql的配置:需配置my.ini文件

default-character-set=UTF-8;


1、servlet容器如何处理请求资源路径?

     比如,在浏览器地址栏输入http://ip:port/web04/abc.html请求资源路径是:  /web04/abc.html

     step1,容器依据应用名找到应用所在的文件夹。

     step2,容器会假设要访问的是一个servlet,会比较    web.xml文件中<url-pattern>是否与"/abc.html"一致:

         a,精确匹配:

         b,通配符匹配:使用"*"来匹配任意的字符。

         比如<url-pattern>/*</url-pattern>/aaa   /aaa.bbb  /aaa/bbb/ccc

         c,后缀匹配:使用"*."开头,后接任意的字符。

         比如<url-pattern>*.do</url-pattern>会匹配所有以".do"结尾的请求。/adfasdfasd.do

     step3,如果都不匹配,容器会查找静态页面,如果找到,就返回,找不到,返回404。

    

2、如何让一个servlet处理多种请求?

     step1,使用后缀匹配模式。

     step2,分析请求资源路径,然后分别处理:String uri = request.getRequestURI();

3、servlet的生命周期

     (1)什么是servlet的生命周期

         指的是容器如何创建servlet对象,如何分配其资源,如果调用其方法来处理请求以及如何销毁servlet对象的整个过程。

     (2)生命周期分成哪几个阶段:

         1)实例化:

              a,容器调用servlet的构造器,创建一个servlet实例。

              b,什么时候实例化?

                   情况1:只有请求到达容器之后,容器才会创建。

                   情况2:  容器启动之后,会立即创建servlet实例,该servlet必须要配置load-on-startup参数。

         2)初始化:

              a,容器在将servlet实例化之后,会立即调用其init(ServletConfig config)方法。

              b,init方法只会执行一次

              c,容器在调用init方法之前,会先创建一个符合ServletConfig接口要求的对象,然后再把该对象作为参数传过init方法。

              d,GenericServlet已经实现了init方法(将ServletConfig对象保存下来了)。

              e,初始化参数:

                       step1,使用<init-param>配置初始化参数

                       step2,使用ServletConfig提供的getInitParameter方法来访问。

              f,如果要实现自已的初始化处理逻辑,建议overrideinit()方法。

         3)就绪:

              a,servlet容器在收到请求之后,会调用servlet对象的service方法来处理请求。

              b,HttpServlet已经实现了service方法,该方法依据请求类型分别调用doGet,doPost方法。

              c,写一个servlet,可以选择override HttpServlet的doGet,doPost方法或者override HttpServlet的service方法。

         4)销毁:

              a,容器在删除servlet对象之前,会调用其destroy方法。

              b,容器会使用自身的算法来决定何时销毁servlet对象。

              c,可以在destroy方法里面编写释放资源的代码。

              d,destroy方法只会执行一次。

     (3)相关的几个接口与类

              a,Servlet接口

                   init(ServletConfigconfig): 初始化

                   service(ServletRequestreq,ServletResponse res):

                   destory():

              b,GenericServlet抽象类

                   实现了Servlet接口中的部分方法,主要是实现了init,destroy方法。

              c,HttpServlet抽象类

                   继承了GenericServlet,主要是实现了service方法。

              d,ServletConfig接口

              e,ServletRequest接口是HttpServletRequest接口的父接口。

              f,ServletResponse接口是HttpServletResponse接口的父接口。

             

     练习:

              给某种产品计价:

                   出售的价格(price) = 原始价格(basePrice) *

                   (1+ 税率)。

                   比如

                       1000* (1 + 0.08)

                  

     

 1、jsp基础

     (1)什么是jsp?

     (javaserver page: java服务器端页面技术)sun公司制订的一种服务器端动态页面生成技术规范。因为直接使用servlet虽然也可以生成动态页面,但是过于繁琐(需要使用out.println输出),并且难以维护(如果要修改页面,就必须修改java源代码),所以,sun公司制订了一种新的规范专门用于生成动态页面,即jsp。

         jsp其实就是一个以.jsp为后缀的文件,该文件当中主要包含html和java代码。容器会将.jsp文件转换成.java文件(其实就是一个servlet),然后调用。

     (2)如何写一个jsp?

         step1,写一个以.jsp为后缀的文件

         step2,在该文件当中,可以添加如下的内容:

              1)html(css,js) : 直接写。

              2)java代码:

                   a, java代码片断:<%  java代码   %>

                   b,jsp表达式:<%=    %>

              3)指令:

                   a,什么是指令?

                       告诉容器,在将.jsp文件转换成.java文件时,做一些额外的处理。比如,导包。

                   b,语法

                       <%@指令名称 属性=属性值   %>

                   c,page指令

                       import属性:导包。

                       比如  <%@pageimport="java.util.*"%>

                       <%@pageimport="java.util.*,java.text.*"%>

                       contentType属性:设置response.setContentType的内容。

                       比如 

                       <%@pagecontentType="text/html;charset=utf-8"%>

                       pageEncoding属性:告诉容器, jsp文件的编码格式是什么。因为容器需要读取jsp文件的内容(也就是解码: 本地编码格式 --->unicode),有些容器不能够正确识别jsp文件的编码格式,所以最好加上该属性。

                   d,include指令

                      file属性: 告诉容器,在将.jsp文件转换成.java文件时,在指令所在的位置插入file指定的文件的内容。比如  <%@include file="header.jsp"%>属性:告诉容器,jsp文件的编码格式是什么。因为容器需要读取jsp文件的内容(也就是解码:本地编码格式-->unicode),有些容器不能够正确识别jsp文件的编码格式。所以最好加上该属性。

              4)隐含对象

                   a,什么是隐含对象?

                       在jsp文件当中,可以直接使用的对象,比如out,request,response。

                   b,为什么可以直接使用这些隐含对象呢?

                       因为容器会自动添加创建或者获得这些对象的语句。

     (3)jsp是如何运行的?

         step1,容器要将.jsp文件转换成一个.java文件(其实就是一个

         servlet)。

              1)html  ----->  service方法里,使用out.write输出。

              2)<%   %> -----> service方法里,照搬。

              3)<%=  %> -----> service方法里,使用out.print输出。

         step2,容器接下来会调用这个servlet。

        

     练习: 编写emplist.jsp,输出员工列表。

         去ftp下载day05/emsdemo.zip

        

2、转发

     (1)什么是转发?

         一个web组件(servlet/jsp)将未完成的处理通过容器转交给另外一个web组件继续完成。最常见的情况是:一个servlet 将数据转交给一个jsp,由该jsp生成相应的页面。

     (2)如何转发

         step1,先绑订数据

              request.setAttribute(Stringname,Object obj);

         step2,获得转发器

              RequestDispatcherrd = request.getRequestDispatcher(String url);

         step3,转发

              rd.forward(request,response);在转发的目的地组件上,一般使用Object request.getAttribute(String name);取出数据,然后进行下一步的处理。

     (3)注意的问题

              a,转发之前,不能调用out.close();

              b,转发之前,容器会清空response缓存中的数据。

     (4)特点

              a,转发的目的地只能够是同一个应用内部的某个地址。

              b,转发之后,浏览器地址栏的地址不变。


1、如何处理servlet产生的系统异常?

     方式1:使用转发

         step1,绑订错误提示信息。

         step2,转发到某个错误处理页面(比如,error.jsp)。

     方式2:让容器来处理

         step1,编写一个错误处理页面(error.jsp)

         step2,将异常抛出给容器 throw new ServletException(e)

         step3,配置错误处理页面,让容器知道出现异常后,应该调用哪一个页面。

                    <error-page>

                        <exception-type>javax.servlet.ServletException</exception-type>

                        <location>/error.jsp</location>

                    </error-page>

                    

2、相对路径与绝对路径

     链接地址  <ahref="list.do"></a>

     表单提交地址 <form action="add.do">

     重定向 response.sendRedirect("list.jsp");

     转发 request.getRequestDispatcher("listEmp.jsp");

     (1)什么是相对路径?

         不以"/"开头的路径。

     (2)什么是绝对路径?

         以"/"开头的路径。

     (3)怎样写绝对路径?

         链接地址、表单提交地址、重定向绝对路径应该从应用名开始写,而转发应该从应用名之后开始。

         //返回  /appname

         Stringrequest.getContextPath()

 

     createtable t_user(

         idint primary key auto_increment,

         usernamevarchar(30) unique,

         pwdvarchar(30),

         ageint

     );

     insertinto t_user(username,pwd,age)

     values(‘tom‘,‘test‘,22);

    

     unique:唯一性约束


java基础--jsp/servlet

标签:

原文地址:http://blog.csdn.net/song_lf/article/details/51614273

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!