Servlet(上)

一,Servlet简介

Java Servlet是与平台无关的服务器端组件,它运行在Servlet容器中(Tomcat服务器)。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用“请求/响应”的模式。


Servlet是一个接口。






二,一个简单的Servlet实例:

package com.Test;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class HelloServlet implements Servlet{

	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("destroy");
	}

	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		System.out.println("getServletConfig");
		return null;
	}

	public String getServletInfo() {
		// TODO Auto-generated method stub
		System.out.println(" getServletInfo");
		return null;
	}

	public void init(ServletConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("init");
		
	}

	public void service(ServletRequest arg0, ServletResponse arg1)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("service");
	}
	
	public HelloServlet(){
		System.out.println("HelloServlet");
	}
}
结果如下:


实现步骤:
①创建一个类实现Servlet接口
②在web.xml中配置和映射Servlet

  <servlet>
  <servlet-name>helloServlet</servlet-name>
  <servlet-class>com.Test.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  <servlet-name>helloServlet</servlet-name>
  <url-pattern>/hello</url-pattern>     < ! --   /  代表当前应用的根目录>
  </servlet-mapping>

三,生命周期和方法

Servlet容器(Tomcat服务器)自己创建Servlet实例和调用方法,管理整个Servlet生命周期。

Servlet容器的作用:
①创建Servlet,并且调用Servlet的相关生命周期方法
②运行JSP,Filter,Listener,Tag...等软件环境

Servlet生命周期的方法:(以下方法都是容器来调用的)
①构造器:第一次请求servlet时创建servlet实例,调用构造器方法,只有第一次请求的时候才调用,单实例,只被调用一次。
②init方法:只被调用一次,在实例后立即被调用,用于初始化当前servlet
③service:每次请求都会调用service方法,用于响应请求
④destory:只被调用一次,在当前servlet所在的WEB应用被卸载前调用,释放资源。

配置参数  load-on-startup参数:指定servlet被创建的时机。服务器一启动,则会自动创建servlet实例和调用init方法。
①配置在servlet节点中,
  <servlet>
  <servlet-name>helloServlet</servlet-name>
  <servlet-class>com.Test.HelloServlet</servlet-class>
  <load-on-startup>5</load-on-startup>
  </servlet>

如果是负数,则在第一次请求时创建,如果是正数或者0,则在当前web应用被Servlet容器加载的时候创建实例,而且数值越小,越早被创建。



ServletConfig:封装了servlet的配置信息,并且可以获取ServletContext对象。
①配置servlet的初始化参数
<servlet>
  		<servlet-name>helloServlet</servlet-name>
  		<servlet-class>com.Test.HelloServlet</servlet-class>
  		
  		<init-param>
  		<!-- 初始化参数名和参数值 -->
  			<param-name>user</param-name>
  			<param-value>root</param-value>
  		</init-param>
  		
  		<init-param>
  			<param-name>password</param-name>
  			<param-value>1230</param-value>
  		</init-param>
  		<load-on-startup>5</load-on-startup>
  </servlet>
注意:配置参数要放在load-on-startup前
②获取配置参数:
---》getInitParameter(String name):获取指定参数的初始化参数
---》getInitParameterNames():获取参数名组成的Enumeration对象
		String user = arg0.getInitParameter("user");
		System.out.println(user);
		
		Enumeration<String> names = arg0.getInitParameterNames();
		while(names.hasMoreElements()){
			String name = names.nextElement();
			System.out.println(name);
		}
		


ServletContext:



①可以由ServletConfig获取

ServletContext servletcontext = servletconfig.getServletContext();

②该对象代表当前web应用的一个大管家,可以从中获取到web应用各方面的信息。

配置当前web应用的 初始化参数:这个参数可以被所有的servlet所获取,而Servlet的初始化参数只能被那个servlet所获取。
  <context-param>
  		<param-name>driver</param-name>
  		<param-value>com.mysql.jdbc.Driver</param-value>
  </context-param>
  
  
    <context-param>
  		<param-name>jdbcUrl</param-name>
  		<param-value>jdbc:mysql:///atguigu</param-value>
  </context-param>

获取当前web应用的初始化参数:

		//获取ServletContext对象
		ServletContext servletcontext = arg0.getServletContext();
		String driver = servletcontext.getInitParameter("driver");
		System.out.println(driver);
		
		Enumeration<String> names2 = servletcontext.getInitParameterNames();
		while(names2.hasMoreElements()){
			String name = names2.nextElement();
			System.out.println(name);
		}

获取当前web应用的某一个文件在服务器的绝对路径。(此文件必须放在WebRoot下)
--》getRealPath(String path)


获取当前应用的名字。
--》getContextPath()

获取当前web应用某一个文件对应的输入流
--》getResourceAsStream(String path):path的/ 为当前web应用的跟目录,一下用了两种方法

		try {
			ClassLoader classLoader = getClass().getClassLoader();
			
			InputStream is = classLoader.getResourceAsStream("jdbc.properties");
			System.out.println("1." + is);
			InputStream is2 = servletcontext.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
			System.out.println("2." + is2);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		


HTTP简介与post,get请求







在浏览器的地址栏输入一个url或者点开一个超链接,请求方式是get请求,如果FROM表单中的method属性设置为get,则使用get请求
POST请求发送的数据量比GET请求的数据量大得多。文件上传的时候必须使用POST请求。


在Servlet中获取请求信息。

①Servlet的service方法用于应答请求。因为每次请求都会调用service。

ServletRequest:封装了请求信息,可以从中获取到任何请求信息
ServletResponse:封装了响应信息,如果想给客户什么信息,具体可以使用改接口的方法实现。

这两个接口的实现类都是服务器实现的,并且是服务器调用service方法的时候传入的。

ServletRequest:
获取请求参数:
String getParameter(String name):根据参数的名字返回参数值
Map getParameterMap():根据请求参数的名字返回请求参数的字符串数组(多选框)
Enumeration getParameterNames():返回参数名的Enumeration对象
String[] getParameterValues(String name):返回请求参数的键值对:key是参数名,value是参数值
	public void service(ServletRequest request, ServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("请求来了");
		String user = request.getParameter("user");
		String password = request.getParameter("password");
		System.out.println(user + ", "+ password);
		
		String[] interestings = request.getParameterValues("interesting");
		for(String interest :interestings){
			System.out.println("-->" + interest);
		}
		
		Map<String,String[]> map = request.getParameterMap();
		for(Map.Entry<String, String[]> entry : map.entrySet()){
			System.out.println("**" + entry.getKey() + ":" + Arrays.asList(entry.getValue()));
		}
		
		
		
	}

获取请求的URL:
可以使用ServletRequest的子接口:httpServletRequesr获取与http请求相关的信息

HttpServletRequest httpServletRequest = (HttpServletRequest) request;
String requestURL = httpServletRequest.getRequestURL();



获取请求的方式:

String method = httpServletRequest.getMethod();

获取请求参数的字符串(get请求的参数):
String queryString = httpServletRequest.getQueryString();







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值