Servlet
WEB应用
- 在web服务器上运行的web资源都是以Web应用形式呈现的,web应用就是多个web资源的集合
- 包括: HTML文件,CSS文件,Js文件,动态web页面,java程序,支持jar包,配置文件等
what
- 为了动态Web资源的的开发,常用的技术有Servlet和JSP
- Servlet是使用JAVA语言编写运行在服务器端的程序,
- 一般来说就是实现了Servlet接口的类;
- Servlet主要用来接受客户端发来的请求,并返回一个响应,能够处理的方法有doGet()和doPost()方法。
- Servlet由Servlet容器提供
接口
- void initial(ServletConfig config) 初始Servlet对象,将ServletConfig中的配置信息传递给Servelt对象
- ServletConfig getServletConfig() 用于获取Servlet的配置对象
- String getServletInfo() 用于获取Servlet的信息
- void Service(ServletRequest request ,ServletResponse response) 接受请求,响应请求
- void destory() 释放Servlet对象。
实现类
- GenericServlet 继承了Servlet接口部分的实现,没有实现http请求处理
- HttpServlet 继承了Servlet接口的所有实现,并为HTTp中的方法进行了处理。
- 例如:
- doPost();doGet();doPut();
Servlet的实现
public class MyServlet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//得到输出流PrintWriter对象,Servlet使用输出流来产生响应
PrintWriter writer = servletResponse.getWriter();
writer.println("Hello Word");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.yue.chapter03.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
</web-app>
Servlet的生命周期
public class MyServlet1 extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello word!");
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("Init method is called");
}
@Override
public void destroy() {
System.out.println("destory method id called");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>MyServlet1</servlet-name>
<servlet-class>com.yue.chapter03.MyServlet1</servlet-class>
<!--设置Servlet在web应用启动时初始化,数值越小,启动顺序越优先-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet1</servlet-name>
<url-pattern>/MyServlet1</url-pattern>
</servlet-mapping>
</web-app>
HTTP请求的代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/chapter03/MyServlet2"method="post">
姓名: <input type="text" name="username" >
密码: <input type="password" value="password" >
<br>
登录:<input type="submit" value="登录">
</form>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>MyServlet2</servlet-name>
<servlet-class>com.yue.chapter03.MyServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet2</servlet-name>
<url-pattern>/MyServlet2</url-pattern>
</servlet-mapping>
</web-app>
public class MyServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.println("post is working ");
}
}
Servlet的多重映射
<servlet>
<servlet-name>MyServlet2</servlet-name>
<servlet-class>com.yue.chapter03.MyServlet2</servlet-class>
</servlet>
<servlet-mapping>
<!--映射为MyServlet1-->
<servlet-name>MyServlet2</servlet-name>
<url-pattern>/MyServlet2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<!--映射为MyServlettest2-->
<servlet-name>MyServlet</servlet-name>
<url-pattern>MyServlettest2</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>MyServlet2</servlet-name>
<servlet-class>com.yue.chapter03.MyServlet2</servlet-class>
</servlet>
<servlet-mapping>
<!--映射为MyServlet1-->
<!--映射为MyServlettest2-->
<servlet-name>MyServlet2</servlet-name>
<url-pattern>/MyServlet2</url-pattern>
<url-pattern>MyServlettest2</url-pattern>
</servlet-mapping>
Servlet映射路径使用通配符
/*
* : 使用通配符*,映射陆警官;
: 完全目录匹配:/MyServlet;
: 目录匹配:/*. /aa/*. 表示拦截aa目录下的所有的请求
: 扩展名拦截 : *.do *.jsp 错误的写法:/*.co
: 缺省Servlet : /
* */
#ServletConfig 接口
- String getInitParameter (String name); 根据初始化参数名返回参数值
- Enumeration getInitParameterNames() : 返回一个Enumeration的对象,包含所有的初始化参数名;
- ServletContext getServletContext(): 代表当前web应用的ServletContext对象
- String getServletName() : 返回Servlet的名字
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>MyServlet3</servlet-name>
<servlet-class>com.yue.chapter03.MyServlet3</servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet3</servlet-name>
<url-pattern>/MyServlet3</url-pattern>
</servlet-mapping>
</web-app>
public class MyServlet3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取输出流
PrintWriter writer = resp.getWriter();
//获得ServletConfig对象
ServletConfig servletConfig = this.getServletConfig();
//获得参书名为encoding对应的参数值
String encoding = servletConfig.getInitParameter("encoding");
writer.println(encoding);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
ServletContext接口
当Servlet容器启动的时候,为每个Web应用创建一个唯一的ServletContext对象代表当前的Web应用,该对象中封装了web应用的所有的信息,多个Servlet之间数据共享。
配置整个web应用的初始化信息
<context-param>
<param-name>name</param-name>
<param-value>xiaoxiao</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>abc</param-value>
</context-param>
代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<context-param>
<param-name>name</param-name>
<param-value>xiaoxiao</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>abc</param-value>
</context-param>
<servlet>
<servlet-name>MyServlet4</servlet-name>
<servlet-class>com.yue.chapter03.MyServlet4</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet4</servlet-name>
<url-pattern>/MyServlet4</url-pattern>
</servlet-mapping>
</web-app>
package com.yue.chapter03;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
public class MyServlet4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
//得到ServletContext对象
ServletContext servletContext = this.getServletContext();
Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
writer.println("all the paramName and paramValue are following");
while (initParameterNames.hasMoreElements()){
String name = initParameterNames.nextElement();
String value = servletContext.getInitParameter(name);
writer.println(name + ":" +value);
writer.println("<br>");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
实现多个Servlet对象共享数据
- Enumeration getAttributeNames() :返回一个Enumeraiton对象,里面包含了ServletContext包含的所有的域属性名;
- Object getAttribute(String name) : 返回与属性值;
- void removeAttribute(String name) : 删除匹配的属性;
- void setAttribute(String name,Object obj ): 设置域属性;
代码
public class MyServlet5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
servletContext.setAttribute("data","this servlet save data");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
public class MyServlet6 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
ServletContext servletContext = this.getServletContext();
String data = (String) servletContext.getAttribute("data");
writer.println(data);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
读取Web应用下的资源文件
- Set getResourcePaths(String path) :返回一个set集合,包含资源目录中的子目录和资源路径名称
- String getRealPath(String path) : 返回资源文件在服务器文件中的真实路径
- URL getResource(String path) : 返回映射到某个资源文件的URL对象。
- inputStream getResourceAsStream(): 返回映射到某个资源文件的输入流对象
public class MyServlet7 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html/charset=utf-8");
ServletContext servletContext = this.getServletContext();
PrintWriter writer = resp.getWriter();
//获取相对路径中输入流对象
InputStream resourceAsStream = servletContext.getResourceAsStream("/chapter03/test.properties");
Properties properties = new Properties();
properties.load(resourceAsStream);
writer.println(properties.getProperty("username"));
writer.println(properties.getProperty("password"));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
test.properties
username= 123
password= 123
public class MyServlet8 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html/charset=utf-8");
ServletContext servletContext = this.getServletContext();
PrintWriter writer = resp.getWriter();
//获取文件的绝对路径
String realPath = servletContext.getRealPath("/chatper03/test.properties");
FileInputStream fileInputStream = new FileInputStream(realPath);
Properties properties = new Properties();
properties.load(fileInputStream);
writer.println(properties.getProperty("username"));
writer.println(properties.getProperty("password"));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}