Servlet 简单入门

Servlet三大域对象:request session application(ServletContext)
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>day09_01</display-name>
  
  <servlet>
    <servlet-name>xxx</servlet-name>
    <servlet-class>cn.itcast.web.servlet.AServlet</servlet-class>
    <init-param>
    	<param-name>p1</param-name>
    	<param-value>v1</param-value>
    </init-param>
    <init-param>
    	<param-name>p2</param-name>
    	<param-value>v2</param-value>
    </init-param>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>xxx</servlet-name>
    <url-pattern>/AServlet</url-pattern>
  </servlet-mapping>
  
  <servlet>
    <servlet-name>yyy</servlet-name>
    <servlet-class>cn.itcast.web.servlet.EServlet</servlet-class>
    
  </servlet>
  <servlet>
    <servlet-name>FServlet</servlet-name>
    <servlet-class>cn.itcast.web.servlet.FServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>

  
  <servlet-mapping>
    <servlet-name>yyy</servlet-name>
    <url-pattern>/EServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>FServlet</servlet-name>
    <url-pattern>/FServlet</url-pattern>
  </servlet-mapping>
  
</web-app>


1.实现Servlet的方式

1.实现javax.servlet.Servlet接口   
package cn.itcast.web.servlet;

import java.io.IOException;
import java.util.Enumeration;

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

public class AServlet implements Servlet {

	@Override
	public void destroy() {
		System.out.println("destroy()..");

	}
	
	//获取Servlet配置信息
	@Override
	public ServletConfig getServletConfig() {
		System.out.println("getServletConfig()");
		return null;
	}

	//获取Servlet的信息
	@Override
	public String getServletInfo() {
		System.out.println("getServletInfo()");
		return "我是一个快乐的Servlet";
	}

	//调用一次 在servlet对象创建之后马上执行一次
	@Override
	public void init(ServletConfig servletConfig) throws ServletException {
		System.out.println("init()..");
		
		//获取初始化参数
		System.out.println(servletConfig.getInitParameter("p1"));
		System.out.println(servletConfig.getInitParameter("p2"));
		
		//获取所有初始化参数的名字
		Enumeration e = servletConfig.getInitParameterNames();
		while (e.hasMoreElements()) {
			System.out.println(e.nextElement());
		}

	}

	@Override
	public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
		
		System.out.println("service()..");
	}

}
package cn.itcast.web.servlet;

import java.io.IOException;

import javax.ejb.Init;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;


//模拟GenericServlet
public class BServlet implements Servlet {
	
	private ServletConfig config;
	
	//需要就写 不需要不写
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("a我要死了");
	}
	
	//这个方法 一定会在init()后被调用,本类的this。config 已经有值了
	
	@Override
	public ServletConfig getServletConfig() {
		return this.config;
	}
	
	//没有用
	@Override
	public String getServletInfo() {
		// TODO Auto-generated method stub
		return "我是一个快乐的Servlet";
	}

	//由Tomcat调用 只用一次
	//他是这些方法中第一个被调用的 在构造器之后立马调用
	@Override
	public void init(ServletConfig config) throws ServletException {
		//把Tomcat传递的ServletConfig赋值给本类的一个成员,其实就是把它保存起来,方便在其他类中使用
		this.config = config;
		init();
	}
	
	//自己定义的方法 
	public void init(){
		
	}
	
	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		System.out.println("每次处理请求都会被调用!");
		
	}
	public ServletContext getServletContext(){
		return config.getServletContext();
	}
	public String getServletName(){
		return config.getServletName();
	}
	public String getInitParameter(String name){
		return config.getInitParameter(name);
	}
}
package cn.itcast.web.servlet;

import java.io.IOException;

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

public class CServlet extends BServlet {
	@Override
	public void init() {
		System.out.println("娃娃 我出生啦");
	}
	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		String  value = getInitParameter("p1");
		
	}
}

2.继承javax.servlet.GenericServlet类
package cn.itcast.web.servlet;

import java.io.IOException;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class DServlet extends GenericServlet {

	@Override
	public void init() throws ServletException {
		System.out.println("哈哈哈 我来也");
	}
	
	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		System.out.println("hello world");
	}
	
	@Override
	public void destroy() {
		System.out.println("destroy()...");
	}
}

3.继承javax.servlet.http.HttpServlet类

新增一个login.html测试post方法

<body>
    This is my HTML page. <br>
    <form action="/day09_01/EServlet" method="post">
    <input type="submit" value="提交">
    </form>
  </body>

package cn.itcast.web.servlet;

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 EServlet extends HttpServlet {
	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("doGet()...");
	}
	@Override
	public void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println("doPost()..");
	}
}

在<servlet>中配置<load-on-startup>中给出一个非负整数。服务器启动即开始。

package cn.itcast.web.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FServlet extends HttpServlet {

	@Override
	public void init() throws ServletException {
		System.out.println("hello--world 服务器第一次启动就开始");
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("测试eclipse的Servlet doGet()方法");
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.getServletContext();
		this.getServletConfig().getServletContext();
	}

}



2.一个ServletConfig对象,对应一段web.xml中Servlet的配置信息

API: String getServletName(),获取的是<servlet_name>中的内容

        ServletContext  getServletContext():获取Servlet上下文对象

        String getInitParameter(String name):通过名称获取指定初始化参数的值

        Enumeration getInitParameterName():获取所有初始化参数的名称

3.不要在servlet创建成员变量,创建局部变量即可。。。。。可以创建无状态成员,或者只读有状态的成员



5.一个项目只有一个ServletContext对象 application;

  获取方法4种(先写2种):  this.getServletContext

   this.getServletConfig().getServletContext();

4.在<servlet>中配置<load-on-startup>中给出一个非负整数。服务器启动即开始。

6.4个域对象(用来多个Servlet传递数据):1.PageContext   2.ServletRequest  3.HttpSession   4.ServletContex

 域内部有一个Map ,所以

l  void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性,例如:servletContext.setAttribute(“xxx”, “XXX”),在ServletContext中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;

l  Object getAttribute(String name):用来获取ServletContext中的数据,当前在获取之前需要先去存储才行,例如:String value = (String)servletContext.getAttribute(“xxx”);,获取名为xxx的域属性;

l  void removeAttribute(String name):用来移除ServletContext中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做;

l  Enumeration getAttributeNames():获取所有域属性的名称;



AServlet 向ServletContext中保存数据(加入一个name 张三),BServlet获取数据

package cn.itcast.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AServlet extends HttpServlet {
//演示向ServletContext中保存数据
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		/*
		 * 1.获取ServletContext对象
		 * 2.调用其setAttribute()方法完成保存数据
		 * */
		ServletContext application  = this.getServletContext();
		application.setAttribute("name", "张三");
	}


}
package cn.itcast.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//演示从ServletContext获取数据
public class BServlet extends HttpServlet {


	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		/*
		 * 1.获取ServletContext对象
		 * 2.调用其getAttribute()方法完成获取数据
		 * */
		ServletContext application = this.getServletContext();
		String name = (String) application.getAttribute("name");
		System.out.println(name);
	}

}

CServlet 获取公共的初始化参数

公共的初始化参数在web.xml中</web-app>前创建即可

 <context-param>
  	<param-name>context-param</param-name>
  	<param-value>context-value</param-value>
  </context-param>
package cn.itcast.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CServlet extends HttpServlet {
	//演示ServletContext 获取公共的初始化参数
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		/*
		 * 1.得到servletcontext
		 * 2.调用它getInitParamter(String)得到初始化参数
		 */
		ServletContext application = this.getServletContext();
		String value =  application.getInitParameter("context-param");
		System.out.println(value);
	}

}

DServlet 使用Servletcontext获取资源路径

package cn.itcast.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Set;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DServlet extends HttpServlet {

	//使用Servletcontext获取资源路径
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//得到的是有盘符的路径 如:F:/xx/x/x/x
		String path = this.getServletContext().getRealPath("/index.jsp");
		System.out.println(path);
		
		//获取资源的路径后 再创建出输入流
		InputStream inputStream = this.getServletContext().getResourceAsStream("/index.jsp");
	
		//获取当前路径下所有资源的路径
		Set<String> paths =  this.getServletContext().getResourcePaths("/WEB-INF");
		System.out.println(paths);
	
	
	}

}



接下来是两个实用的小demo

1.统计访问量

package cn.itcast.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.omg.IOP.ServiceContext;

public class AServlet extends HttpServlet {

	//统计访问量
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		/*
		 * 1.获取servletContext对象
		 * 2.从ServletContext对象中获取名为count对象
		 * 3.如果存在,加1 保存
		 * 4.如果不存在,则证明第一次存在,向ServletContext保存名为count的属性
		 */
		ServletContext application = this.getServletContext();
		Integer count = (Integer) application.getAttribute("count");
		if(count == null){
			application.setAttribute("count", 1);
		}else{
			application.setAttribute("count", count+1);
		}
		/*
		 * 向浏览器输出
		 * 需要使用响应对象
		 */
		PrintWriter pw = response.getWriter();
		pw.print("<h1>"+count+"</h1>");
	}

}

2.获取类路径下的资源

这是类路径的资源 txt里面内容随便写写


这里下载一个commons-io-1.4.jar方便读取输入流内容并转换成String,,,,,放在WEB-INF的lib下。

commons-io-1.4下载地址

String string = IOUtils.toString(inputStream); //读取输入流内容,转换成字符串返回
		System.out.println(string);


package cn.itcast.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;

public class BServlet extends HttpServlet {
	//演示获取类路径下的资源
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		/*
		 * 1.得到classLoader
		 * 》先得到Class 再得到ClassLoader
		 * 2.调用其getResourceAsStream(),得到一个InputStream
		 */
		//相对/classes
//		ClassLoader classLoader = this.getClass().getClassLoader();
//		InputStream inputStream = classLoader.getResourceAsStream("cn/itcast/servlet/a.txt");
//		
		//相对当前.class文件所在目录
		Class c =this.getClass();
//		InputStream inputStream = c.getResourceAsStream("a.txt");
		
		//相对于classes下
//		InputStream inputStream = c.getResourceAsStream("/a.txt");
		
		InputStream inputStream = c.getResourceAsStream("/../../index.jsp");
		
		String string = IOUtils.toString(inputStream); //读取输入流内容,转换成字符串返回
		System.out.println(string);
		
	}

}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值