Servlet

  1. tomcat目录结构
    1)  bin目录    存放启动和关闭服务器的一些脚本(命令)
    2)  common目录  共享(部署在该服务器上的所有程序都可以使用)的一些jar 包
    3)  conf目录   存放服务器的一些配置文件
    4)  webapps目录  部署目录
    5)  work目录  服务器运行时,生成的一些临时文件 
  2. 将tomcat目录common\lib下的servlet-api.jar拷贝到新建目录下
    写一个java类HelloServlet.java(编译这个类需要servlet-api.jar包)
    编译java类:
编译命令参数含义:
-cp 表示告诉Java编译器去哪里找需要的class 文件(到servlet-api.jar 的jar 包中找)
-d . 表示将编译生成的字节码文件放入当前文件夹下
3.在对话框“Project Deployments”对话框有4个按钮,常用的为 
“Add”按钮    在tomcat服务器上增加新应用
“Remove”按钮   删除tomcat服务器上的新应用
“Redeploy”按钮   重新部署该应用,一般每次修改后都需要重新部署一下

4.常见错误
1)  要实现Servlet接口或者继承HttpServlet.
2)  service()方法名称、参数、异常类型要写对!
3)  web.xml配置文件中,类名不要写错!servlet-name不要写错
4)  在浏览器输入访问地址时,地址不要写错。
应该按照http://ip:port/appname/servlet的url-pattern去访问。
5)  记得先部署,记得服务器必须已经运行了,不然不能访问
6)  如果报500错误,一般是你的程序写错了,
    如果报404错误,访问地址有错。
    如果是405错误,请检查你的service方法名,包括方法参数等  
5.请求方式(get/post) 
请求资源路径(端口号之后的内容,比如/appname/servlet)
消息头的样式,比如: content-type= text/html;
get/post方式的区别
get方式会将请求参数及参数值放在请求资源路径里面,携带的数据大小有限制,不适合提交大量的数据;
post方式会将请求参数及参数值放在实体内容里面,理论上没有限制,适合大量数据的提交。
安全上来讲,post方式相对安全(因为请求参数及值存放在实体内容里面,而get方式会
将请求参数及值显示在浏览器地址栏)。但是要注意,post方式并没有将数据加密。 给表单设置method="post"。
表单处理
6. 如何获得请求参数值
1)  String request.getParameter(String paraName);
  要注意的问题: 如果paraName不实际的请求参数名不一致,则返回null。
  如果没有输入参数值,则返回""。
2)  String[] request.getParameterValues(String paraName);
  用在有多个请求参数名相同的情况下使用。
  比如 ?interest=fishing&interest=cooking
   如何处理表单中的中文(难点) 
1)  浏览器会如何对表单中的数据进行编码?
当表单采用post方式提交时,浏览器会按照打开该表单所在的页面的编码来对表单中的
   数据进行编码。
2)  在html 文件当中,添加以下代码的作用
   <meta http-equiv="content-type" content="text/html;charset=utf-8">
   作用1:
模拟http消息头(content-type),让浏览器以utf-8的编码格式来打开该页面(要确
保html文件本身确定是使用 utf-8保存的)。
   作用2:
   确保浏览器按指定的编码来对表单中的数据进行编码。
   中文乱码解决方案
step1:
在html文件中,添加
<meta http-equiv="content-type" content="text/html;charset=utf-8">
    另外,表单的提交方式必须是post。
   step2:
    在服务器端,使用servlet读取表单中的请求参数时:
    request.setCharacterEncoding("utf-8");
    这行代码的作用:设置解码时的编码格式。
   step3:    
如果servlet输出中文,要添加如下代码。
    response.setContentType("text/html;charset=utf-8");
    这行代码的作用:
    作用1:
指定out.println输出时所使用的编码。
    作用2:
生成一个消息头content-type:text/html;charset=utf-8
     告诉浏览器,返回的数据类型是html,编码是 utf-8。这样,浏览器一定会以指定的编码来显示该页面。
     访问MySql数据库步骤
1)  将jdbc驱动程序相关的jar 包 copy 到WEB-INF/lib下
2)  在servlet代码当中,使用jdbc访问数据库,要注意如何处理异常。
3)  如何配置错误处理页面
  因为在访问数据库时,可能会产生系统异常,可以为服务器配置一个错误处理页面,
这样,当发生系统异常时,服务器会将对应的错误处理页面显示给用户。
  step1 写一个错误处理页面error.html
  step2 在web.xml文件中,配置
   <error-page>
    <error-code>500</error-code>
    <location>/error.html</location>
   </error-page> 
7.//访问数据库
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager
  .getConnection(
  "jdbc:mysql://localhost:3306/jd1109db2",                                         
   "root","root");
  PreparedStatement prep = 
   conn.prepareStatement(
   "insert into t_emp(name,salary,age) " +
   "values(?,?,?)");
<servlet>
     <servlet-name>modifyEmpServlet</servlet-name>
     <servlet-class>web.ModifyEmpServlet</servlet-class>
</servlet> 
<servlet-mapping>
     <servlet-name>addEmpServlet</servlet-name>
     <url-pattern>/add</url-pattern>
</servlet-mapping>
8.DAO:data access object(DAO),封装了数据访问逻辑,调用者(一般是业务逻辑模块)不需要了
解底层的数据访问细节就可以实现数据访问。这样一来,当底层的数据访问细节发生改变,不会影响到调用者。
如何写一个dao
a.  实体类
为了方便处理数据库中的记录,可以定义与记录对应的实体类,即可以将数据库中的某
条记录转换成一个实体类的实例。
   比如 Employee类,提供id,name,salary,age 属性及相关的get/set方法,我们可以将
   t_emp表中的记录转化成一个Employee对象。
b.  dao接口
   声明一些数据访问方法,这些方法不要涉及具体的技术。
   比如:
   EmployeeDAO接口,声明了:
    public void save(Employee e) throws SQLException; 
   这种方式不好,因为出现了jdbc的异常类,这就要求实现该方法只能使用jdbc。
   换一种方式来声明,更好
    public void save(Employee e) throws Exception;
    public List<Employee> findAll() throws Exception;
c.  dao实现类
   采用具体的技术实现dao 接口。
   比如:
使用jdbc实现EmployeeDAO接口,写一个类EmployeeDAOJdbcImpl。
d.  dao工厂(工厂模式)
   工厂类:封装了对象的创建细节,为调用者提供符合要求的对象。
数据访问逻辑:DAO(Data Access Object)
表示逻辑:和界面相关的,比如out.print() 
9.处理请求资源路径  
servlet容器如何处理请求资源路径?
 
什么是请求资源路径?
比如输入 http://ip:port/appname/abc.html/appname/abc.html 称为请求资源路径

Servlet容器处理请求资源路径的步骤
step1 
依据/appname查找该应用对应的文件夹(比如查找webapps 下面的文件夹是否与其匹配)。
step2 
在找到的文件夹下面,找到web.xml文件,然后使用<url-pattern>与/abc.html 去做匹配。
  匹配规则:
1)  精确匹配: 即要求<url-pattern>与/abc.html完全一致。
2)  通配符匹配: 使用"*"代表任意的字符串。
比如在<url-pattern>中使用:
    /*    表示任意字符串
    /abc/*  表示有/abc/的字符串
3)  后缀匹配: 不能使用“/"开头,要求"*.任意的字符串"。
比如
    *.do     要求以.do结尾
    *.action   要求以.action结尾
step3 
尝试查找/abc.html文件,如果找到,则返回该文件,找不到,则返回404状态码。
访问http://localhost:8080/web04/aabbccddeedd,404
访问http://localhost:8080/web04/abc/aabbcc,OK
访问http://localhost:8080/web04/abc/aa/aabbcc,OK 
10. Servlet处理多种请求 
一个servlet如何处理多种请求?
step1 使用后缀匹配模式。
step2 在service()方法里加入如下代码
  //获得请求资源路径
  String uri = request.getRequestURI();
//分析请求资源路径,来决定做何种处理。
servlet生命周期及核心接口不类 
10.1. 核心接口与类 
1)  Servlet接口
init(ServletConfig config)
destroy()
service(ServletRequest res,ServletResponse rep)
2)  GenericServlet抽象类
实现了Servlet接口中的init、destroy方法。
3)  HttpServlet抽象类
继承了GenericServlet,实现了service方法。
4)  ServletRequest与ServletResponse接口
5)  HttpServletRequest与HttpServletRequest接口
6)  ServletConfig接口
String getInitParameter(String paraName); 
11. servlet 的生命周期  
所谓生命周期,指的是servlet容器如何创建servlet实例、分配其资源、调用其方法、并销毁其实例的整个过程。
阶段一:  实例化(就是创建servlet对象,调用构造器)
在如下两种情况下会进行对象实例化。
第一种情况:
当请求到达容器时,容器查找该servlet对象是否存在,如果不存在,才会创建实例。
第二种情况:
容器在启动时,或者新部署了某个应用时,会检查web.xml当中,servlet是否有
load-on-starup配置。如果有,则会创建该servlet实例。
load-on-starup参数值越小,优先级越高(最小值为0,优先级最高)。
阶段二:初始化
为servlet分配资源,调用init(ServletConfig config);方法
config对象可以用来访问servlet的初始化参数。
初始化参数是使用init-param配置的参数。
init可以override。
阶段三:就绪/调用
有请求到达容器,容器调用servlet对象的service()方法。
HttpServlet的service()方法,会依据请求方式来调用doGet()或者doPost()方法。
但是,这两个do方法默认情况下,会抛出异常,需要子类去override。
阶段四:销毁
容器依据自身的算法,将不再需要的servlet对象删除掉。
在删除之前,会调用servlet对象的destroy()方法。
destroy()方法用于释放资源。
在servlet的整个生命周期当中,init,destroy只会执行一次,而service方法会执行多次。 
12. jsp文件的组成 
a.  html(包括css、javascript)
直接写在.jsp文件里即可
b.  java代码
  第一种形式:java代码片断
语法: <%  java代码 %>
第二种形式:jsp表达式
  诧法: <%= java表达式%>
c.  指令
  所谓指令,就是告诉jsp引擎(容器当中,负责将.jsp文件转换成.java文件,并在运
行时,为jsp提供一些辅助支持的模块),在将.jsp文件转换成.java文件时,做一些额外的处理。
  语法:  <%@ 指令名 属性名=属性值%>
  page指令    
##常用指令共3个,今天了解并掌握page指令##
 import属性:
用于导包。
   比如<%@page import="java.util.*,java.text.*"%>
 contentType属性:
等价于response.setContentType();
 pageEncoding属性:
告诉jsp引擎,.jsp文件保存时的编码。
d.  隐含对象
所谓隐含对象,指的是在.jsp文件当中,不用声明和创建该对象,就可以直接使用的对象。
原因是,.jsp文件对应的.java文件当中,已经自动生成了该对象的代码。
  out
  request
  response
4)  jsp文件如何转换成.java文件 *
 html转换为 jsp
放到service()方法里,使用out.write()输出。
 java代码片断
放到service()方法里,照搬 
13.重定向
a. 用户在浏览器提交form表单,通过add到服务器找到AddEmp
b. AddEmp向数据库中插入一条数据
c. AddEmp返回给用户一个消息头location= list(ListEmp的地址)和302状态码
当浏览器碰到状态码302后,浏览器会自动向新地址发请求
d.  浏览器自动通过list找到ListEmp
e.  ListEmp到数据库中查询数据并返回给浏览器 
1)  什么是重定向?
服务器向浏览器发送一个状态码302及一个消息头location,浏览器收到后,会立即向
location所指向的地址发送请求。
2)  如何重定向
response.sendRedirect(String url);  其中,url是重定向的地址。
3)  编程要注意的问题
 重定向之前,不能够有out.close()或者out.flush()操作。
 重定向之前,如果response对象缓存有数据,则这些数据会被清空。
4)  重定向的特点
 重定向的地址是任意的
 重定向之后,浏览器地址栏的地址变成了location所指定的地址。
14. 转发 
1)  什么是转发?
一个web组件(jsp/servlet)将未完成的处理转交给另一个web组件继续处理。转发的各个组件会共享request和response对象。
2)  如何转发?
  step1 
先绑订数据
  request.setAttribute(String name,Object obj);
  跟绑订相关的另外两个方法
  //如果name对应的值不存在,返回null。
  Object request.getAttribute(String name);
  request.removeAttribute(String name);
  step2 
获得转发器,转发
  RequestDispatcher rd = request.getRequestDispatcher(String uri);
  rd.forward(request,response); 
 转发需要注意的问题
转发之前,不能够执行out.close或者out.flush。
转发之前,会将response中缓存的数据先清空。
15.重定向和转发的区别
1)  地址
 转发的地址必须是同一个应用内部的某个组件(不能跨应用,不能跨服务器)
比如:
地址1 http://localhost:8080/web06/aaa.jsp
地址2 http://localhost:8080/web06/bbb.jsp
地址3 http://localhost:8080/web07/ccc.jsp
地址4 http://www.tarena.com.cn
在应用web06内部的组件aaa.jsp 可以将信息转发到地址2(同一应用),但是不可以
转发到地址3(跨应用)和地址4(跨服务器)
 重定向的地址没有限制
2)  能否共享request
 转发可以
 重定向不行
原因是转发是一次请求,重定向为两次请求,Request的生命周期只能在一次请求内,
请求结束,Request 被删除
3)  浏览器地址栏的地址是否变化
 转发不变
 重定向会变
4)  事件是否处理完毕
 转发是一件事未做完
 重定向是一件事已经做完 
什么时候用重定向?
比如用户做删除操作时,删除操作已做完,重定向访问list.do
 
什么时候用转发?
比如(1)用户调用list.do,(2)由 ListServlet到数据库中查询数据,(3)ListServlet将查询到
的数据通过Servlet引擎转发给负责显示的empList.jsp,(4)empList.jsp 将数据通过友好的界
面显示给用户 
16.表单中文处理步骤   
step1 
jsp文件,要添加
<%@page pageEncoding="utf-8"  
   contentType="text/html;charset=utf-8"%>
表单设置method="post"。
step2 
在servlet类当中,添加request.setCharacterEncoding("utf-8");
step3 
如果要访问数据库:
a.  保证数据库能够正常地保存中文。
  对于mysql数据库
  create database dbname default character set utf8;
b.  使用jdbc访问数据库时,必须要保证jdbc驱动程序能够识别数据库中保存数据的编码。
jdbc:mysql://localhost:3306/jd1109db2?
useUnicode=true&characterEncoding=utf8 
17. 路径问题  
1)  链接地址、表单提交、重定向、转发的路径应该如何写?
a.  链接地址: <a href=""></a>
b.  表单提交: <form action="">
c. 重定向:   response.sendRedirect("");
d.  转发:  getRequestDispatcher("");
2)  相对路径与绝对路径
  相对路径:
不以"/"开头的路径,比如:<a href="del.do"></a>
在当前路径下进行跳转
  绝对路径: 
以"/"开头的路径,比如:<a href="/appname/del.do"></a>
建议:因为相对路径较易出错,建议在实际开发中尽量使用绝对路径
3)  怎样写绝对路径? 
  链接、表单提交、重定向,绝对路径要从应用名开始写。
  转发要从应用名之后开始写。 
18.<servlet-name>,<servlet-class>,<servlet-mapping>,<url-pattern>,这些各表示:
<servlet-name>  这个是我们要注册servlet的名字,一般跟Servlet类名有关
<servlet-class>  这个就是指向我们要注册的servlet 的类地址, 要带包路径
以上两个包在一个servlet节点之下
如:
<servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.breeze.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>  是用来配置我们注册的组件的访问路径,里面包括两个节点
一个是   <servlet-name>  这个要与前面写的servlet一样
另一个是  <url-pattern>  配置这个组件的访问路径
如:
<servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>  与上面的 <servlet-name>  要一致
    <url-pattern>/servlet/LoginServlet</url-pattern>
</servlet-mapping>




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值