Servlet笔记3(Eclipse实现)

2023-02-25 11:38:51 浏览数 (2)

目录 --------- 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);

0 人点赞