Servlet基本操作
一、Servlet的请求流程
web项目中的web.xml文件配置为:
<servlet>
<!--别名-->
<servlet-name>Hello</servlet-name>
<!--类的全限定名-->
<servlet-class>hello.HelloServlet</servlet-class>
</servlet>
<!-- 向外暴露一个资源名称,供外界访问,资源名称前面必须有 / -->
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
1、第一次在浏览器地址栏输入http://localhost:80/test/hello 后回车(第一次请求)
2、此时servlet会解析这个请求信息,首先前面的localhost:80一般是域名信息,一般会交给DNS解析成ip,80是http协议的默认端口.这里主要讨论后面的一部分,test/hello
3、服务器会tomcat目录里的conf目录下寻找service.xml文件,在所有Context元素中寻找path内容为这里的test的,可以找到这个元素中属性docBase的内容,根据docBase中的路径找到这个web项目的根路径
4、在项目的根路径下寻找web.xml文件,也就是上面的文件,在这个文件中寻找url-patternd内容为hello的元素,如果没有就会报404错误,说明资源不存在。如果有,找到和他在一个元素中的servlet-name,根据这个名字它会去寻找上面servlet元素中的和它同名元素,最终找到servlet-class中的类的全限定名称。
5、利用反射去调用Serlvet类中的构造器从而创建对象(显然构造器必须是public的)。
Servlet ser = ClassforName("hello.HelloServlet");
6、调用init方法,ser.init(ServletConfig config);
7、调用service方法 ser.service(...);
8、对浏览器做出响应,以html等形式
9、正常终止服务器,会执行destroy() 但是如果非正常终止并不会执行此方法。
如果是非第一次请求,不会在第5步创建对象了,而是直接从servlet的实例缓冲池中直接获取对象。接着执行后续操作。
注意:servlet的创建,初始化,运行和销毁等操作都是有服务器来负责调用的。
javax.servlet.Servlet接口中有四个方法:
public void init(ServletConfig config) throws ServletException {
//执行servlet的初始化操作
}
public ServletConfig getServletConfig() {
//获取Servlet的配置信息对象
return null;
}
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
//服务,具体操作的方法
}
public String getServletInfo() {
//获取servlet的信息,作者,版权
return null;
}
public void destroy() {
//销毁对象
}
二、Servlet的初始化参数
在web.xml文件中的Servlet元素下可以添加初始化参数:
<servlet>
<!--别名-->
<servlet-name>Hello</servlet-name>
<!--类的全限定名-->
<servlet-class>hello.HelloServlet</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>Willing</param-value>
</init-param>
</servlet>
获取初始化参数就要用到ServletConfig接口中的方法
String name = config.getInitParameter("name");//根据参数名获取参数值
Enumeration<String> en = config.getInitParameterNames();//获取所有的参数名,返回一个迭代器
因为它们并不是static方法,所有要用ServletConfig的对象去调用,实际上对象服务器已经帮我们创建好了,在init方法init(ServletConfig config)的参数中,我们只需拿来用。方便起见可定义为成员变量.
ServletConfig config;//把config对象定义为成员变量
@Override
public void init(ServletConfig config) throws ServletException {
this.config = config;
}
三、Servlet的继承体系
每次写一个servlet都得实现javax.servlet.Servlet肯定很痛苦。所有就有专门的来已经实现好了,自己只需要继承就行了。servlet的继承体系

我们只要继承HttpServlet,
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void init() throws ServletException {
//自己的初始化操作
}
//编写Servlet方式一
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//编写处理请求的代码
//不能调用父类中 的service : super.service();
}
//编写Servlet方式二
//处理POST请求
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
//处理GET请求
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理全部的请求
}
}
四、HttpSevletRequst的常用方法
HttpServletRequst是ServletRequest的子接口,封装了处理http协议请求的方法
String getMethod();//返回请求方式GET 或 POST
String getRequestURI();//返回请求行中的资源名称
StringBuffer getRequestURL();//返回浏览器中地址栏中的信息
String getContextPath(); //返回上下文路径path属性值
String getHeader(String name) //返回请求头信息
String getParameter(String name);//返回指定参数名的参数值(一般是表单用户输入)
String getParameterValues(String name);//返回指定名称的多个参数值
请求乱码处理
请求默认是ISO-8859-1,不支持中文
- 方式一:解决中文乱码
- 1.按照ISO-8859-1把乱码恢复成二进制形式byte[] data = username.getBytes("ISO-8859-1");
- 2.对二进制形式重新编码为UTF-8,username = new String(data,"UTF-8");
- 方式二(推荐):可以调用req.setCharacterEncoding("UTF-8");//适用于POST方式
- 方式三:修改service.xml配置文件中修改端口的的元素,修改GET方式的默认编码: URIcoding = "UTF-8";//适用于GET方式
五、HttpServletResponse的常用方法
HttpServletResponse是ServletResponse的子接口,封装了处理http协议请求的方法
ServletOutputStream getOutputStream();//返回字节输出流对象
PrintWriter getWriter() //返回一个打印流对象,这是父接口HttpResponse中的方法
void addCookie(Cookie cookie)//把cookie对象响应给浏览器
注意:这里字节输出流不能和字符输出流共存。
响应乱码处理
/**
* 解决输出中文乱码问题
*/
resp.setCharacterEncoding("UTF-8");
//设置输出的MIME类型,设置为html
resp.setContentType("text/html");
//上面两行代码也可以合并在一起写成:
//resp.setContentType("text/html;charset=utf-8");
/**
* 获取字节输出流对象,不能与字节输出流共存
*/
//OutputStream out = resp.getOutputStream();
//out.write("Hello".getBytes());
/**
* 获取符输出流对象
*/
PrintWriter p = resp.getWriter();
p.println("你好");//这里的换行并不作用,在网页中是以html形式显示的,换行用br标签
p.print("Hello");
六、注解配置Servlet
JavaEE6(Servlet3) 可以用注解配置,代替了web.xml文件
/**
* value属性是一个数组,所有可以传多个,因为url-pattern也可以有多个值
*
* 初始化参数initParams的属性的类型还是个@WebInitParam注解,并且是一个数组
*/
@WebServlet(value = {"/test","/hello"} ,initParams =
{ @WebInitParam( name = "encoding" ,value = "UTF-8"),
@WebInitParam( name = "name" , value = "Willing")
}
)
public class AnnServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取初始化参数
String encoding = getInitParameter("encoding");
String name = getInitParameter("name");
System.out.println(encoding+","+name);
}
}
Servlet基本操作的更多相关文章
- servlet中Java连接数据库后的基本操作
servlet中Java连接数据库后的基本操作 在eclipse中新建一个工程:login 在Server中新建一个服务器,基本的操作不用说了,在前两天的笔记中可以找到; 需要知道数据库的用户名和密码 ...
- javaweb jdbc实现简单的数据库基本操作和servlet的作用域以及jsp标签的使用
一,工具类,分页类和连接数据库jdbc package com.direct.util; import java.sql.Connection; import java.sql.DriverManag ...
- web学习之servlet
1)web服务软件作用: 把本地资源共享给外部访问 2)tomcat服务器基本操作 : 启动: %tomcat%/bin/startup.bat 关闭: %tomcat%/bin/shutdown. ...
- Java Servlet 技术简介
Java Servlet 技术简介 Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么 ...
- 【Java】Java Servlet 技术简介
Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么,它们是如何工作的,如何使用它们来创 ...
- 搭建servlet+jsp环境
c3p0: <?xml version="1.0" encoding="UTF-8"?><c3p0-config> <named- ...
- MyBatis基础:MyBatis数据基本操作(2)
1. MyBatis映射器 2. MyBatis数据基本操作 示例项目结构: <project xmlns="http://maven.apache.org/POM/4.0.0&quo ...
- Java Web-----JSP与Servlet(一)
JSP (java服务器页面) JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它[1] 是由Sun Microsystems公司倡 ...
- Java之通过反射机制选择servlet中的对应的方法
此方法用于在对Javaee开发中的通过对应的名称而选择servlet中的对应的方法 注:主要代码如下 protected void doGet(HttpServletRequest req, Http ...
随机推荐
- ccf数字排序
问题描述 给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出. 输入格式 输入的第一行包含一个整数n,表示给定数字的个数. 第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所 ...
- 4. Median of Two Sorted Arrays *HARD* -- 查找两个排序数组的中位数(寻找两个排序数组中第k大的数)
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...
- [LeetCode] 268. Missing Number ☆(丢失的数字)
转载:http://www.cnblogs.com/grandyang/p/4756677.html Given an array containing n distinct numbers take ...
- Vue--- 手动禁止ESlint
使用vue-cli构建项目时,通常会问你要不要 “Use ESlint to lint your code?” 建议使用,这样会有助于规范我们的代码(这也是一种审美),ESlint的规范就不说了,写多 ...
- learning docker steps(2) ----- docker contailner 初次体验
参考:https://docs.docker-cn.com/get-started/part2/ Dockerfile的内容如下所示: # 将官方 Python 运行时用作父镜像 FROM pytho ...
- selenium(二)查找定位目标 ID XPATH CSS 操作目标
简介: 我们只打开一个页面是没有什么意义的. 尽管你可以get很多次. selenium可以做的更多,比如找到百度的搜索框,输入我们要搜索的内容,再用鼠标点击搜索按钮,再把搜索结果提取出来…… 这篇文 ...
- php截取中文字符串 GB2312 utf-8
UTF-8截取中文字符串 function Cn_Substr($string, $length) { preg_match_all("/[\x01-\x7f]|[\xc2-\xdf][\x ...
- CreateFile DeviceIoControl dwIoControlCode——应用程序与驱动程序通信
在“进程内存管理器中”的一个Ring0,Ring3层通信问题,之前也见过这样的代码,这次拆分出来详细总结一下. 先通过CreateFile函数得到设备句柄,CreateFile函数原型: HANDLE ...
- git账号申请及创建基线
1.填写注册信息 https://github.com/ 进入官网 填写用户名,邮箱,密码然后点击sign up for github 2.后面不记得了,然后就可以创建项目了 3.填写项目名称及描述, ...
- define 常量的定义和读取
define(‘常量’,‘常量值’)----------------------define来定义常量, echo 也能输出常量, get_defined_constants(true)------- ...