Java Servlet 是运行在Web服务器或者是应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器或应用程序之间的中间层。并且能够作为一个连接器,通过交互式地浏览和修改数据,生成动态的Web内容。
通过浏览器输入请求地址,浏览器会根据IP地址及端口号找到对应的Web服务器,如果请求的是静态资源,Web服务器直接提供响应;如果请求的是动态资源,则直接请求传递给容器来处理。
能够充当Servlet容器的软件:Tomcat、Weblogic、JBoss等。他们具备管理Servlet组件功能,还具备了Web服务器的一些功能。
组成的核心:Connector、Container。
Connector:负责接收浏览器的tcp连接请求,创建一个Request和Response对象来用于和请求端交换数据,然后会产生一个线程来处理这个请求并把产生的 Request 和 Response 对象传给处理这个请求的线程,处理这个请求的线程就是 Container 组件要做的事了。
Container 是容器的父接口,所有子容器都必须实现这个接口,Container 容器的设计用的是典型的责任链的设计模式,它有四个子容器组件构成,分别是:Engine、Host、Context、Wrapper。其中Context 代表 Servlet 的上下文,它具备了 Servlet 运行的基本环境。
1 配置一个 Servlet类,里面包含的配置信息有:
指定Servlet的名字,这个名字在同一个Web应用程序中必须是唯一的
指定Servlet类的完整限定名, 为Servlet指定一个文件描述
为Servlet指定一个简短的名字
为Servlet指定一个图标,在某些图形化界面工具中用于表示该Servlet
定义Servlet的初始化参数,该标签必须包含,可以包含零个或者多个
、
可以包含零个或者多个
定义初始化参数的名字
定义初始化参数的值
为初始化参数提供一个文本描述
指定当web应用程序启动时,Servlet被加载的次数,元素的内容必须是一个整数,如果这个值是负数,或者没有设定该值,Servlet容器将在客户端首次请求这个Servlet时加载它;如果这个值是正数或0,容器将在web应用程序部署时加载和初始化这个Servlet,并且先加载值小的,后加载值大的Servlet。
在Servlet和URL样式之间定义一个映射
servlet的名字,必须为
元素中声明过的名字
指定对应于Servlet的URL路径
定义上下文的初始化参数,该标签必须包含
、
,可以包含零个或者
定义初始化参数的名字
定义初始化参数的值
为初始化参数提供一个文本描述提示:
init-param
初始化的参数可以在Servlet类中使用getServletConfig().getInitParameter("param-name")
来获取参数值。context-param
初始化的参数可以在Servlet类中使用getServletConfig().getServletContext().getInitParameter("param-name");
来获取参数值。注意:
init-param
只能在当前Servlet类中获取到到参数值。(类成员参数)context-param
可以在任何 Servlet中获取到参数值。(全局参数) HTTP即:【HyperText Transfer Protocol】是由w3c(万维网联盟)制定的一种应用层协议,用来定义浏览器与web服务器之间如何通信以及通信的数据格式的协议。
一次请求一次连接,Web服务器可以利用有限的连接为尽可能多的客户端服务。
当Web容器收到一个HTTP请求时,通信数据由Web容器负责封装和提供,这些信息被解释为两个对象:
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,请求中的所有消息都封装在这个对象中,通过这个对象的相关方法可以获取请求数据。
读取和写入HTTP请求数据(请求行、消息头等)
取得和设置Cookies
取得路径信息
标识HTTP会话
实现请求转发:
//获取转发的请求路径 的转发器 RequestDispatcher requestDispatcher = request.getRequestDispatcher("/requestb");// requestDispatcher.include(request,response); requestDispatcher.forward(request, response);//转发
HttpServletResponse对象代表提供给客户端的响应,封装了HTTP的响应数据。通过这个对象可设置状态行、消息头、实体内容。
例如:获取单个的值,常用于单选框http://localhost:8080/test?name=Kitty&age=18
String name = req.getParameter("name");//返回Kitty
String age = req.getParameter("age");//返回 18
String sex = req.getParameter("sex");//返回 null
例:获取多个的值,常用于复选框http://localhost:8080/test name=Kitty&name=Andy&name=Jack
String[] names = req.getParameterValues("name");//返回 [Kitty,Andy,Jack]
String[] ages = req.getParameterValues("age");//返回 null
注意:请求方式
区分大小写
!
请求方式 | 作用 |
---|---|
GET(常用) | 请求指定的资源 |
POST(常用) | 向指定的资源提交需要处理的数据 |
HEAD | 要求响应与相应的GET一样,但没有响应体 |
PUT | 上传指定资源 |
DELETE | 删除指定资源 |
TRACE | 返回显服务器收到的请求,主要用于测试或诊断 |
OPTIONS | 返回服务器针对特定资源所支持的HTTP请求方法 |
CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器 |
概述
特点
概述
特点
确保表单所在的页面按照指定(UTF-8)的字符集打开。
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
head>
<body>
body>
html>
如果Servlet容器是Tomcat8.0及之后则正常取值不会出现乱码!因为编码和解码统一了!
前提是项目工作空间默认编码是
UTF-8
!
如果Servlet容器是Tomcat8.0之前的则需要先用ISO-8859-1
解码,在用UTF-8
编码:
String name = req.getParameter("name");
byte[] nameBytes = name.getBytes("ISO-8859-1");//ISO-8859-1解码
name = new String(nameBytes,"UTF-8");//UTF-8编码
确保表单所在的页面按照指定(UTF-8)的字符集打开。
在服务器端读取参数的前面使用 req.setCharacterEncoding("utf-8")
设置字符编码为UTF-8即可。
注:此方法只针对post请求有效
req.setCharacterEncoding("UTF-8");
String name = req.getParameter("name");
在获取Write/Out对象及调用out方法之前调用setContentType方法及setCharacterEncoding方法
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8");
//resp.setHeader("Content-Type","text/html;charset=utf-8");//等价于上面两句代码
resp.getWriter().println("你好," + name + "!");
HelloServlet
/demo.html
HelloServlet
/*
HelloServlet
/shop/*
TestServlet
*.do
TestServlet
/
注意事项
资源路径 要么只能以/
开头,要么只能以*
开头/aa/*/bb
,这个url是精确匹配了,url必须是 /aa/*/bb
,这里的*
已不代表通配的含义 request.setCharacterEncoding("UTF-8");
String content = request.getParameter("content");
String realPath = getServletContext().getRealPath("/files/abc.properties");
System.out.println("realPath:" + realPath);
FileInputStream fis = new FileInputStream(new File(realPath));
InputStream is = getServletContext().getResourceAsStream("/files/abc.properties");
Properties properties = new Properties();//d调用这个文件
properties.load(new FileReader(realPath));
String name = properties.getProperty("name");
String age = properties.getProperty("age");
String sex = properties.getProperty("sex");
System.out.println("name:" + name);
System.out.println("age:" + age);
System.out.println("sex:" + sex);
解决办法:
synchronized (ServletContext.class) {//线程安全
Object count = getServletContext().getAttribute("count");
int i = (int) (count == null ? 0 : count);
getServletContext().setAttribute("count", i + 1);
response.getWriter().println("ok:" + i);
}