目录 --------- Servlet学习笔记1------------ ----------Servlet学习笔记2------------ ----------Servlet学习笔记3------------
1.5 在Eclipse开发工具创建servlet
两种方式: (1)先创建一个普通的java类,需要去实现Servlet接口或者继承对应的HttpServlet(GEnericServlet)类,咱们普通的javaLei 就具有了servlet功能,所以需要手动在web.xml配置文件中添加访问servlet的路径信息。 (2)直接创建servlet,会自动在web.xml文件中添加访问servlet的路径信息。 步骤: (1)新建web项目,比如说创建一个web项目名称:chapter03 (2)创建一个servlet程序:比如说,先创建一个包,名称cn.itcast.servlet,servlet的名称:TestServlet01 (3)部署和访问servlet:通过开发工具部署web项目,如chapter03,访问它下面的servlet资源。访问的地址:http://localhost:8080/chapter03/testServlet01 注意:一般情况下,为了简化开发,咱们会在post方法里面调用doGet()方法。 具体见以下代码:
代码语言:javascript复制/*
* doGet()方法,用来接收浏览器发送的get请求
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
PrintWriter out=response.getWriter();
out.print("this servlet is created by eclipse");
}
/*
* doPost()方法,用来接收浏览器发送的post请求
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
this.doGet(request,response);
}
需求:可以发送get请求和post请求得到1到100之间的和
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int sum=0;
for(int i=0;i<=100;i ){
sum =i;
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);//简化开发
}
1.6 实现Servlet的虚拟路径映射
1.Servlet的多重映射:一个servlet,可以对应多个访问路径。 比如:
代码语言:javascript复制 <servlet-mapping>
<servlet-name>TestServlet01</servlet-name>
<url-pattern>/testServlet01</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>TestServlet01</servlet-name>
<url-pattern>/test02</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>TestServlet01</servlet-name>
<url-pattern>/test03</url-pattern>
</servlet-mapping>
2.servlet的映射路径可以使用通配符 servlet的映射路径有三种方式: (1)完全目录匹配:比如/hello (2)目录匹配:比如/abc/或者/ (3)扩展名匹配:比如*.do,.action 注意/.do这种写法是错误的 优先级:完全目录匹配>目录匹配>扩展名匹配 例如:servlet的路径: /abc/* 对应的servlet01的访问路径 /* 对应servlet02 /abc 对应servlet03 *.do 对应servlet04
在浏览器输入的url地址如下: /abc/a.html :访问/abc/* servlet路径匹配度更高, servlet01 /abc :访问servlet03 /abc/a.do :访问 servlet01 /a.do :访问servlet02 3.缺省Servlet 什么是缺省Servlet:它的映射路径"/",代表这是一个缺省的servlet. 缺省的servlet的作用:处理请求的资源找不到的问题(404 代表请求的起源找不到)
二、ServletConfig接口
什么是ServletConfig:他是servlet的配置对象,作用就是获取与servlet相关的初始化参数。 它的子类是:GenericServlet和HttpServlet. 它被实例化通过web服务器实现的。 得到ServletConfig对象:getServletConfig() ServletConfig常用的方法: getInitParameter(String name)//获取初始化参数的值 :根据encoding获取utf-8 getInitParameterNames()//获取servlet初始化参数的名称:获取encoding和username的名称 getServletContext()//得到ServletContext对象 getServletName() //获取servlet的名称:对应web.xml里面TestServlet02 初始化参数的配置:
代码语言:javascript复制 <!-- servlet初始化参数的配置 -->
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>username</param-name>
<param-value>xiaozhang</param-value>
</init-param>
三、ServletContext接口
代码语言:javascript复制ServletContext对象实在web服务器启动时就创建了,是web服务器创建的ServletContext对象。
每一个web项目只有一个ServletContext对象。
ServletContext对象的作用: [1]获取web应用程序的初始化参数.(web应用程序就是web项目) [2]在web应用程序能共享数据. [3]获取web项目下的资源文件. 得到ServletContext对象: (1)通过ServletConfig对象:config.getServletContext() (2)直接得到:getServletContext(); 1.获取web应用程序的初始化参数.(web应用程序就是web项目) [1]获取全局初始化参数的值:getInitParameter(String name) [2]获取全局初始化参数的名称:getInitParameterNames() 比如:
代码语言:javascript复制 <!-- 配置全局的初始化参数 -->
<context-param>
<param-name>AAA</param-name>
<param-value>aaa</param-value>
</context-param>
<context-param>
<param-name>BBB</param-name>
<param-value>bbb</param-value>
</context-param>
2.实现多个servlet对象之间共享数据:因为一个web项目只有一个ServletContext对象 ServletContext对象就是域对象:域对象在一定范围内能存值和取值。 域对象相关的方法: [1]存值:setAttribute(String name,Object obj); [2]取值:Object obj=getAttribute(String name); [3]删除值:void removeAttribute(String name); 比如: 在TestServlet05里面存值
代码语言:javascript复制 //[1].得到ServletContext对象
ServletContext context=this.getServletContext();
//[2].存值
context.setAttribute("key", "servlet05里面存的值");
在TestServlet06里面获取值
代码语言:javascript复制 //[1].得到ServletContext对象
ServletContext context=this.getServletContext();
//[2].从ServletContext取值
Object obj=context.getAttribute("key");
String value=obj.toString();
response.setContentType("text/html;charset=utf-8");
response.getWriter().print(value);
3.获取web下面的资源文件 通过ServletContext对象能够获取web项目下面文件的字节输入流或者文件的 绝对路径 路径问题: [1]普通java项目:直接使用jdk编译java文件,所以说文件的路径是相对与工作 空间. 比如:
代码语言:javascript复制 Properties por=new Properties();
InputStream instream=new FileInputStream("src/config.properties");
por.load(instream);
String value=por.getProperty("key");
System.out.println(value);
[2]web项目:运行在tomcat服务器上面的,所有文件的路径是相对于tomcat 服务器。 服务器端是没有src这个目录,在写路径时不能写src,必须相对于tomcat 服务器端的路径。 (1)获取文件的字节输入流:路径是相对于tomcat服务器的路径 InputStream in=getResourseAsStream(String path) 比如:
代码语言:javascript复制 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//[1]获取文件的字节输入流
ServletContext context=this.getServletContext();
//写相对于tomcat服务器的路径,不要用绝对路径
String path="/WEB-INF/classes/config.properties";
InputStream in=context.getResourceAsStream(path);
Properties pro=new Properties();
pro.load(in);
//获取配置文件的值
String v1=pro.getProperty("Company");
String v2=pro.getProperty("Address");
response.getWriter().print("company name:" v1 "company address:" v2);
}
(2)获取文件的绝对路径:路径是相对于服务器端的路径 String realPath=getRealPath(path) 比如:
代码语言:javascript复制 //[1]得到ServletContext对象
ServletContext context=this.getServletContext();
//[2]获取文件的绝对路径
String path="/WEB-INF/classes/config.properties";
//[3]调用getRealPath,获取绝对路径
String realPath=context.getRealPath(path);
System.out.println(realPath);
InputStream in=new FileInputStream(realPath);
Properties pro=new Properties();
pro.load(in);
//获取配置文件的值
String v1=pro.getProperty("Company");
String v2=pro.getProperty("Address");
response.getWriter().print("company name:" v1 "company address:" v2);