标签:
后端: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:唯一性约束
标签:
原文地址:http://blog.csdn.net/song_lf/article/details/51614273