4、Servlet模型(一)
Servlet的编写、访问过程
Servlet简介
- Servlet是Java Servlet的简称,是小服务程序或服务连接器,是用Java编写的服务器端程序,主要功能在于获取请求,返回响应
- 广义:一个Servlet是一个Java语言编写的类,提供请求响应式的编程模型
- 狭义:Servlet是指Java语言实现的一个接口
编写部署Servlet程序
编写源文件
- 编写类实现(implements)
javax.servlet.Servlet接口,在类中实现
javax.servlet.Servlet接口中的方法
编写类文件
- 通过Javac命令编译写好的源文件
- 注意:-cp参数的使用
部署程序
- 将编译生成字节码(.class)文件复制到"号站点号/WEB-INF/classes/"目录,需要注意目录结构
- 配置web.xml中的<servlet>、<servlet-mapping>节点
编写部署Servlet 程序步骤
1、编写Servlet程序(实现Servlet接口)

2、编译Servlet源文件,生成字节码文件

注意:
- DOS窗口中进入Servlet文件所在目录
- -cp参数导入需要的jar包
++javac++ -cp .;lib\*Hello.java
3、部署
在Tomcat的webapps目录下创建项目目录
在项目目录下创建WEB-INF目录
在WEB-INF目录下放置web.xml配置文件、classes目录和lib目录
- classes目录中是步骤2中生成的字节码文件
- lib目录中是用到的jar包

4、运行
- 启动Tomcat
- 访问Servlet


Servlet处理请求,返回响应
++http://localhost:8080/MyWebsite/hello++
WEB-INF目录下web.xml
<servlet>
<servlet-name>helloWorld</servlet-name>
<servlet-class>xx.xx.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloWorld</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
Servlet中的请求与响应
接收请求
Tomcat启动后Web容器首先做的工作

- 接收到请求后服务器转交请求给Web容器
- Web容器产生请求对象和响应对象

- 调用Servlet的service()方法,并将请求和响应对象作为参数传入该方法
- service方法根据请求方式调用doXXX()方法

返回响应
- 在doXXX()方法中使用请求对象获取请求信息,响应对象返回响应结果(PrintWriter对象)
- 销毁请求、响应对象

接收请求
- HttpServletRequest接口以参数的形式传递到service方法里
- HttpServlet的service方法

- 受保护的service()方法根据请求类型调用doXXX()方法
- 所以一般要重写doXXX()方法
解析请求
getParameter()方法
- href="RegistServlet?userName=zs"
- 表单中的name属性值的获取



- request.getHeaderNames();
- request.getHeader("host");//服务器主机
- request.getRemoteHost();//客户端IP
- request.setCharacterEncoding("UTF-8");
++Enumeration e =++ ++request.getHeaderNames++ ++();++
while(e.hasMoreElements()) {
System.out.println***(e.nextElement());***
}
Attribute参数
- setAttribute() :设置参数
- getAttribute() :获取某个参数的值


HttpServletResponse接口
protected void doGet(HttpServletRequest request, HttpServletResponse response)
- getWriter()方法,返回的是一个输出流
- response.setContentType("text/html");
编码
- response.setCharacterEncoding("UTF-8");
- response.setContentType ("text/html;charset=UTF-8");
示例:


Servlet中请求数据的传递、请求转发与请求重定向

Servlet应用执行过程--请求转发

Servlet应用执行过程--重定向

请求重定向、请求转发
请求转发
- request.getRequestDispatcher(" targetURL").forward(request, response);
请求重定向
- response.sendRedirect("targetURL")
请求数据的传递
请求数据的传递
- request.setAttribute(String,Object)
- request.getAttribute(String),返回Object
注意:
请求转发可以共享参数
- request.getParameter()
- request.getAttribute()
请求重定向无法共享参数
请求重定向、请求转发区别
本质
- 请求转发:一次请求
- 请求重定向:两次请求
速度
- 请求转发 > 请求重定向
Attribute参数
- 请求转发可共享参数
- 请求重定向不可共享参数
地址栏
- 请求转发:不变
- 请求重定向:变