当一个请求到达服务端时,由服务端的引擎来进行分析。它根据工程名找到工程, 然后拿到URL的资源地址和web.XML文件的所有的进行对比,和哪一个对比上就找到了具体的servlet。然后就去创建servlet对象,进行处理。
当servlet引擎找到具体的servlet类后,就开始调用它的无参构造器,来创建这样一个对象,创建这个对象之后,调用它的init方法(带参的init()方法,init()方法只会调用一次),之后立刻调用service方法进行处理。处理完之后就一直等待下一个请求的到来。当我们停止应用或关掉服务器的时候,调用destroy方法。servlet实体创建后一直存在于服务器内存中,直到服务器关闭或者应用停止。(不论有多少人在访问)
1.以/开头:/代表的是工程路径(/工程名称) 必须要加/
2.以开头:必须要加后缀名(后缀名任意) 后缀名不能用号
3.如果只配置一个/:此Servlet就是一个默认的servlet,用来处理所有的匹配不上的请求
注意:/*.后缀名 此种情况不允许
/* 表示任意
优先级:精确匹配 > 以/开头的匹配 > 以*号开头的匹配
//拿到servletConfig对象
SercletConfig sc = this.getServletConfig();
//拿取配置的单个信息
String name = sc.getInitParameter("name");
System.out.println(name);
//拿取配置的多个信息
Enumeration
while(enu.hasMoreElements()){
String name = enu.nextElement();
}
ServletContext对象作为域对象使用
//获取全局对象
ServletContext sc = this.getServletContext();
//存储数据
sc.setAttribute("name","张海迪");
//从sc中拿取数据,在另一个Servlet中也可以获取,因为一个程序只有一个Servlet对象
String name = (String)sc.getAttribute("name");
可以直接在web.xml中配置,然后获取
//在web.xml中配置
<context-param>
<param-name>name</param-name>
<param-value>张海迪</param-value>
</context-param>
<context-param>
<param-name>sex</param-name>
<param-value>female</param-value>
</context-param>
//拿到全局对象
ServletContext sc = this.getServletContext();
//获取单个配置参数
String name = sc.getInitParameter("name");
//拿取多个配置参数的值
Enumeration<String> enu = sc.getInitParameterNames();
while(enu.hasMoreElements()){
String name = enu.nextElement();
System.out.println(name + ":" + sc.getInitParameter(name))
}
全局对象的请求转发
转发到另一个页面,另一个页面的request就和当前Servlet中的一样了。
//拿到全局对象
ServletContext sc = this.getServletContext();
request.setAttribute("name","Tryking");
//拿到请求转发器
RequestDispatcher rd = sc.getRequestDispatcher("/servlet/ServletContext2");
//转发过去
rd.forward(request,response);
获取资源文件
获取资源文件有三种方式:
第一种方式:优点:任意文件,任意路径
缺点:必须有web环境
第二种方式:优点:简单方便
缺点:1.只能拿取Properties文件
2.只能拿取非web环境下的资源
第三种方式:优点:任意文件,任意路径
缺点:编写稍微麻烦
//采用ServletContext对象获取
public void test1(){
//拿到全局对象
ServletContext sc = this.getServletContext();
//获取p.properties文件的路径
//当资源文件在src目录下时
String path = sc.getRealPath("/WEB-INF/classes/p.properties");
//当资源文件在工程目录下
//String path = sc.getRealPath("p.properties");
//创建一个Properties对象
Properties pro = new Properties();
//加载文件
pro.load(new FileReader(path));
//读取Properties中的值
System.out.println(pro.get("k"));
}
//采用ResourceBundle类来获取(不能拿取web的东西)
public void test2(){
//拿取ResourceBundle对象(专门用来获取Properties文件的信息)
//当p.proterties在src目录下(属于java的东西)
ResourceBundle rb = ResourceBundle.getBundle("p");
//当p.proterties在工程目录下(也就是web方面的东西)
//拿不到
//拿取文件中的内容
System.out.println(rb.getString("k"));
}
//采用类加载器获取:默认路径是src,对应到web环境就是classes
//类加载器:将字节码文件(.class文件)加载到内存运行
public void test3(){
//获取类加载器的方式
/*
* 1.通过类名
* ServletContext.class.getClassLoader()
* 2.通过对象
* this.getClass().getClassLoader()
* 3.Class.forName()获取
* Class.forName("ServletContext").getClassLoader()
* * /
//获取类加载器
//如果文件在WebRoot下,路径应该是:"../../p.properties"
InputStream in = this.getClass().getClassLoader().getResourceAsStream("com/test/p.properties");
//创建Properties对象
Properties pos = new Properties();
pro.load(in);
//拿取文件的数据
System.out.println(pro.getProperty("k"));
}
//采用字节流输出数据
String s = "末日没有进行曲";
//不会出现乱码
response.getOutputStream().write(s.getBytes());
//会出现乱码
response.getOutputStream().write(s.getBytes("utf-8"));
//解决:
//1.让用户在浏览器中选择解码
//2.通知浏览器采用某种编码进行
response.setHeader("Content-Type","text/html;charset=UTF-8");
//3.让服务器的编码用一种编码,通知浏览器的解码
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type","text/html;charset=UTF-8");
//4.(推荐)也可解决字符流的中文问题
//此句代码做了两件事情:1.设定服务器将数据编码时用的码表
// 2.通知浏览器解码用的码表
response.setContentType("text/html;charset=utf-8");
response.getOutputStream().write(s.getBytes("UTF-8"));
手机扫一扫
移动阅读更方便
你可能感兴趣的文章