Servlet中url-pattern配置
绝对匹配/aaa 举例: /Test
目录匹配 /aaa/bbb/*. /Test/aaa/a
有后缀的路径 .jsp .do .action 注意前面不能有/ /Test/aaa/a.do
优先级:绝对匹配>目录匹配>有后缀的路径
Servletconfig对象
在这个servlet初始化的时候Tomcat容器将这个对象作为参数传递给了init方法
对这个servlet的描述的一些数据或是它初始化时候携带的数据
<init-param>
<param-name>a</param-name>
<param-value>a1</param-value>
</init-param>
<init-param>
<param-name>b</param-name>
<param-value>b1</param-value>
</init-param>
获取初始化参数。 使用servletconfig对象的两个方法
String a = config.getInitParameter("a");
System.out.println(a);
// 获取所有的初始化参数的name
Enumeration<String> names = config.getInitParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
System.out.println(name);
ServletConfig对象常用方法
getInitParamterNames()
getInitParamter()
ServletContext对象(了解)
一个web项目里面有且只有一个ServeltContext对象
创建的时候
在这个web应用发布到Tomcat容器中,Tomcat就会为这个应用创建一个ServletContext对象
配置中写在哪里?
web.xml中,servlet标签前面
<context-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</context-param>
怎么获取这个对象?
ServletContext context = this.getServletConfig().getServletContext();
ServletContext context2 = this.getServletContext();
第一种麻烦,多数用第二种
作用
1.获取全局的初始化参数(重要)见上
2.作为全局的唯一的一个对象,作为此应用程序的一个数据容器,实现整个应用程序的数据共享(重要)
本次项目中,通过ContextObject3写入,ContextObject3和ContextObject2都可以读取。
Object3源码
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取对象
ServletContext context = this.getServletContext();
// 向域对象中放置数据
context.setAttribute("name","张三");
// 从域中取数据
Object object = context.getAttribute("name");
System.out.println(object);
}
Object2源码
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext context2 = this.getServletContext();
// String string = context2.getInitParameter("encoding");
// System.out.println(string);
// 从域中取数据
String name = (String) context2.getAttribute("name");
System.out.println(name);
}
此时,3写入之后2才可以读,不写入读到的就是null,通过servletContext对象实现了数据的共享。
3.获取项目名(了解)写在Service中
// 获取对象
ServletContext context = this.getServletContext();
// 获取项目名
String string = context.getContextPath();
/WEB09
4.获取文件真实路径 读取流 拿到内容(重要)
// 获取文件的真实路径 content
// String Path = context.getRealPath("/WEB-INF/classes/db.properties");
// 获取文件的读取流 666
// String Path = context.getRealPath("/WEB-INF/db.properties");
// 获取文件的内容 123
String Path = context.getRealPath("/db.properties");
db.properties位置在src下,文件位置在/WEB-INF/classes/db.properties
在WEB-INF下,文件位置在/WEB-INF/db.properties
在WebContent下,文件位置在/db.properties
5.读取web流
InputStream in =context.getResourceAsStream("/db.properties")
6.实现转发(了解)
特点:
1.地址不会改变
2.是服务器的内部行为,客户端并不知道
WEB-INF里面的资源不允许外部访问,此时可以利用功能
// 获取对象
ServletContext context = this.getServletContext();
// 获取转发器
RequestDispatcher dispatcher = context.getRequestDispatcher("/WEB-INF/1.html");
// 转发
dispatcher.forward(request, response);
实现了1.html,地址栏仍然是转发页面本身的地址
ServletContext常用方法
对域中的数据进行操作
getAttributeNames()
getAttribute() 取出数据
setAttribute() 放入数据
removeAttribute() 从域中移除数据
获取全局的初始化参数
getInitParameter()
getInitParameterNames()
获取文件的类型
getMiMeType()
获取
getRealPath()真实地址
getResourceAsStream()读取web流
getRequestDispatcher()获取转发器,调用forward实现转发
注:关于重置新建Servlet的内容(mac+eclipse环境下)
搜索templates,找到java目录下对应的模版
add一个Servlet,Pattern中填入对应代码,可自定义。
package ${enclosing_package};
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ${primary_type_name} extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
}
}
保存即可
新建Servlet后全选删除。输入Servlet,补全代码就出现模板了。