web.xml配置(传统配置)
- 原始的web.xml文件长这个亚子
<?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_4_0.xsd"
version="4.0">
</web-app>
- 创建一个servlet
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
//@WebServlet("/helloServlet")
public class helloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
writer.write("hello Servlet ");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- 在web.xml注册这个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_4_0.xsd"
version="4.0"
<!--metadata-complete="true"-->
>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.hu.servlet.helloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
-
servlet-name: servlet的名字
-
servlet-class:你所写的servlet的类名
-
servelt-mapping
-
servlet-name:匹配查找注册好的servlet
-
url-pattern:访问路径
http://localhost:8080/项目名称/hello
-
注解配置
在以往我们的Servlet都需要在web.xml文件中进行配置(Servlet3.0同样支持),但是在Servlet3.0中引入了注解,我们只需要在对应的Servlet类上使用@WebServlet注解进行标记,我们的应用启动之后就可以访问到该Servlet。对于一个@WebServlet而言,有一个属性是必须要的,那就是它的访问路径。@WebServlet中有两个属性可以用来表示Servlet的访问路径,分别是value和urlPatterns。value和urlPatterns都是数组形式,表示我们可以把一个Servlet映射到多个访问路径,但是value和urlPatterns不能同时使用。如果同时使用了value和urlPatterns,我们的Servlet是无法访问到的。下面是一个使用@WebServlet的简单Servlet示例。
Java代码
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* Servlet3.0支持使用注解配置Servlet。我们只需在Servlet对应的类上使用@WebServlet进行标注,
* 我们就可以访问到该Servlet了,而不需要再在web.xml文件中进行配置。@WebServlet的urlPatterns
* 和value属性都可以用来表示Servlet的部署路径,它们都是对应的一个数组。
*/
@WebServlet(name="exampleServlet", urlPatterns="/servlet/example")
public class ExampleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("Hello User.");
}
}
或者
package cn.edu.cuit.servlet;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author fhzheng
* <li>演示Servlet的生命周期
*/
@WebServlet("/LifeServlet")
public class LifeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// 声明计数器,上下文对象,路径
// 属性
int count;
ServletContext sc;
String path;
/**
* <li> 做一些准备工作
* <li> 1 获取上下文环境
* <li> 2从上下文对象获取文件路径
* <li> 3读取文件中的信息
*/
public void init() throws ServletException{
count = 0;
System.out.println("在init中完成计数器的初始化");
sc = this.getServletContext();
path = sc.getRealPath("WEB-INF/count.txt");
try {
InputStream is = LifeServlet.class.getResourceAsStream("countinpackage.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String string;
string = br.readLine();
count = Integer.parseInt(string); //计数器完成初始化
br.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* <li> 销毁
*/
public void destroy() {
System.out.println("Servlet已经释放");
}
/**
* @see HttpServlet#HttpServlet()
*/
public LifeServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* <li> 处理输出到响应中的信息
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置输出类型和编码字符集
response.setContentType("text/html;charset=utf-8");
// 获取out对象
PrintWriter out = response.getWriter();
// 计数器自增1
count++;
// 插旗
out.println("这个Servlet历史上已经被访问了"+count+"次了!");
// 写到文件的组合动作
// 1 获取输出流对象
OutputStream fw = new FileOutputStream(path);
// 2 得到写缓存
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fw));
// 3 准备好数据格式:字符串,由整数转换得到
String string = String.valueOf(count);
// 4 写回到文件
bw.write(string);
// 5 关闭文件相关资源
bw.close();
fw.close();
System.out.println("该Servlet的doGet方法被执行了一次");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
System.out.println("该Servlet的doPost方法被执行了一次");
}
}