servlet2

JAVAEE API5
JAVAEE API7

servlet构造器

servlet对象的创建分为两种:

  1. 延迟加载(默认)

    服务器第一次接收到请求访问servlet时,会根据url查找对应的servlet-name,然后再根据servlet-name找到对应的servlet-class,找到之后,调用该servlet对象的无参构造器进行构造。

  2. 立即加载

    在服务器一启动就将调用servlet的无参构造器构建对象。

package com.lzyy.servlet.day02;

import java.io.IOException;

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

public class DemoLoad2Servlet extends GenericServlet {

	public DemoLoad2Servlet() {
		System.out.println("DemoLoad2Servlet被加载");
	}

	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		// TODO Auto-generated method stub

	}

}

运行结果:

在这里插入图片描述
xml配置:

<servlet>
		<servlet-name>load2</servlet-name>
		<servlet-class>com.lzyy.servlet.day02.DemoLoad2Servlet</servlet-class>
		<!-- 延迟 -->
		<load-on-startup>2</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>load2</servlet-name>
		<url-pattern>/load2</url-pattern>
</servlet-mapping>

<load-on-startup>整数</load-on-startup>

  • 负整数:延迟加载
  • 正整数或者0:立即加载
  • 值越小越先被加载,0最先被加载

控制servlet对象是延迟加载还是立即加载方式是在web.xml中配置servlet时添加一个配置选项<load-on-startup>

在这里插入图片描述

单例模式

单例模式特点:

  • 单例模式instance必须是static
  • getInstance静态的方法
  • 构造函数必须设置为私有函数
public class Singleton {
	/**
	 * 创建对象:私有化 --> 只能自己使用
	 * 			static --> 类加载时,加载static,只加载一次
	 * 构造器私有化 --> 保证在该类外部,无法通过new的方式来创建对象实例
	 * 
	 */
	private static Singleton s = new Singleton();
	private Singleton() {}
	//公有的访问单例实例的方法
	public static Singleton getInstance() {
		return s;
	}
}

初始化

在这里插入图片描述

package com.lzyy.servlet.day02;

import java.io.IOException;

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

public class DemoLoad2Servlet extends GenericServlet {

	public DemoLoad2Servlet() {
		System.out.println("DemoLoad2Servlet被加载");
	}

	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {

	}
	
	@Override
	public void init(ServletConfig config) throws ServletException {
		String servletName = config.getServletName();
		System.out.println(servletName);
	}

}

运行结果:

DemoLoad2Servlet被加载
load2

公共接口ServletConfig
ServletConfig:servlet容器使用的servlet配置对象,用于在初始化期间将信息传递给servlet。

  • 方法总结:
修饰符和类型方法说明
StringgetInitParament(String name)获取具有给定名称的初始化参数的值。
Enumeration<String>getInitParamentNames()以字符串对象的枚举形式返回servlet的初始化参数的名称,如果servlet没有初始化参数,则返回空枚举。
ServletContextgetServletContext()返回对调用方,正在执行的ServletContext的引用。
StringgetServletName()返回当前servlet实例的名称。
package com.lzyy.servlet.day02;

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 DemoLoadServlet implements Servlet {
	
	ServletConfig config;
	
	public DemoLoadServlet() {
		System.out.println("DemoLoadServlet被创建");
	}

	/**
	 * 当然容器监测到一个servlet从服务中被移除时, 
	 * 容器调用该方法,释放资源
	 */
	@Override
	public void destroy() {
		System.out.println("释放资源");
	}

	/**
	 * 获取当前servlet对象的配置
	 */
	@Override
	public ServletConfig getServletConfig() {
		// 将init的config写成全局变量
		return config;
	}

	// 获取servlet相关信息
	@Override
	public String getServletInfo() {
		return config.getServletName();
	}

	/**
	 * 初始化的时候回调用
	 */
	@Override
	public void init(ServletConfig config) throws ServletException {
		this.config = config;
		// 获取servlet名字
		String servletName = config.getServletName();
		System.out.println(servletName);
		// 获取初始化参数根据参数名
		String version = config.getInitParameter("version");
		System.out.println(version);
		// 获取所有的参数名
		Enumeration<String> en = config.getInitParameterNames(); 
		while (en.hasMoreElements()) {
			String name = en.nextElement();
			String value = config.getInitParameter(name);
			System.out.println(name + "====" + value);
		}
	}

	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		System.out.println("nice to miss you ");
	}

}
	<servlet>
		<servlet-name>loadOne</servlet-name>
		<servlet-class>com.lzyy.servlet.day02.DemoLoadServlet</servlet-class>
		<!-- 配置初始化参数,没有特殊要求, 所有你想在创建Servlet对象时即传递给该Servlet的参数都可以卸载这里 -->
		<init-param>
			<param-name>version</param-name>
			<param-value>1.0</param-value>
		</init-param>
		<init-param>
			<param-name>author</param-name>
			<param-value>adam</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>loadOne</servlet-name>
		<url-pattern>/loadOne</url-pattern>
	</servlet-mapping>

运行结果:
在这里插入图片描述

注解配置

package com.lzyy.servlet.day02;

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

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 对于一个servlet基于注解方式的配置与xml文件的配置 只能二选一
 * 默认直接写当前那servlet的url-patten 此时的servlet-name就是全限定类名
 * @author ASUS
 *
 */
//@WebServlet("/ann")
// @WebServlet(name="ann",urlPatterns = {"/ann","/annotation"})

public class AnnotationSevlet extends HttpServlet {
	
	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println(config.getServletName());
		//获取全部的参数名
		Enumeration<String> en = config.getInitParameterNames();
		while (en.hasMoreElements()) {
			String name = en.nextElement();
			String value = config.getInitParameter(name);
			System.out.println(name + " == " + value);
		}
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//		doPost(req, resp);
		System.out.println("hello world");
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("do post");
	}

}

运行结果:

ann
author == adam
version == 1.0

hello world


@WebServlet :

属性名类型描述
nameString指定Servlet 的 name 属性,等价于<servlet-name>。如果没有显式指定,则该Servlet 的取值即为类的全限定名。
valueString[]该属性等价于urlPatterns属性。两个属性不能同时使用
urlPatternsString[]指定一组Servlet 的 URL 匹配模式。等价于<url-pattern>标签
loadOnStartupint指定Servlet的加载顺序,等价于<load-on-startup>标签。
initParamsWebInitParam[]指定一组Servlet初始化参数,等价于<init-param>标签
asyncSupportedboolean声明Servlet是否支持异步操作模式,等价于<async-supported> 标签
descriptionString该Servlet的描述信息,等价于<description>标签
displayNameString该 Servlet的显示名,通常配合工具使用,等价于<display-name>标签

上面的代码还可以写成:

@WebServlet("/ann")
@WebServlet(name="ann",urlPatterns= {"/ann","/annotation"})
@WebServlet(name="ann",urlPatterns= {"/ann"},initParams= {@WebInitParam(name="version",value="1.0"),@WebInitParam(name="author",value="adam")})
@WebServlet(name="ann",urlPatterns= {"/ann"},initParams= {@WebInitParam(name="version",value="1.0"),@WebInitParam(name="author",value="adam")},loadOnStartup=0)

servlet获取请求参数

创建一个servlet类的,会默认生成代码
修改doget()里面的代码

package com.lzyy.servlet.day02;

import java.io.IOException;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

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

/**
 * Servlet implementation class ParmServlet1
 */
@WebServlet("/ParmServlet1")
public class ParmServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ParmServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//设置请求的编码
		request.setCharacterEncoding("utf-8");
		// 通过参数名获取参数值
		String username = request.getParameter("username");
		// 获取所有的参数名
		Enumeration<String> en = request.getParameterNames();
		while (en.hasMoreElements()) {
			String pname = en.nextElement();
			// 如果获取的是一个多值参数的参数值,默认获取第一个
			String pvalue = request.getParameter(pname);
			System.out.println(pname + " == " + pvalue);
		}
		//获取所有的参数的map集合
		Map<String, String[]> map = request.getParameterMap();
		Set<Entry<String, String[]>> set = map.entrySet();
		for (Entry<String, String[]> entry : set) {
			for (String v : entry.getValue()) {
				System.out.println(entry.getKey()+" === "+v);
			}
		}
		// 获取多值参数的参数值
		String[] strings = request.getParameterValues("hobby");
		System.out.println(Arrays.toString(strings));
		// 获取的必须是get请求的参数字符串
		String string = request.getQueryString();
		System.out.println(string);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

所有发送的请求都会被封装在Request对象中,所以想要获取请求相关的信息都从Request中获取

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
	<!--  表单提交的时候  action属性后面的/表示 
 ip:port-->
	<form action="param" method="post">
		<div>
			<label>姓名</label> <input name="username" type="text">
		</div>
		<div>
			<label>密码</label> <input name="password" type="password">
		</div>
		<div>
			<label>年龄</label> <input name="age" type="text">
		</div>
		<div>
			<label>电话</label> <input name="tel" type="text">
		</div>
		<div>
			<label>性别</label> <input name="gender" type="radio" value=""><input name="gender" type="radio" value=""></div>
		<div>
			<label>地址</label> <select name="address">
				<option value="北京">北京</option>
				<option value="上海">上海</option>
				<option value="广东">广东</option>
				<option value="宁夏">宁夏</option>
			</select>
		</div>
		<div>
			<label>爱好</label> <input type="checkbox" name="hobby" value="篮球">篮球
			<input type="checkbox" name="hobby" value="足球">足球 <input
				type="checkbox" name="hobby" value="乒乓球">乒乓球 <input
				type="checkbox" name="hobby" value="羽毛球">羽毛球 <input
				type="checkbox" name="hobby" value="铅球">铅球
		</div>
		<div>
			<button type="submit">注册</button>
			<button type="reset">清空</button>

		</div>
	</form>
	<a href="demo">点我看信息</a>
	<img alt="走丢了" src="img/t.png">
	<script type="text/javascript" src="js/param.js"></script>

</body>
</html>

获取请求参数的方法:

  • 接受单一值参数的value:request.getParameter(String ParamName)
  • 获取多值参数的values:request.getParameterValues(ParamName)
  • 获取所有参数名和参数值的映射:request.getParameterMap()
  • 获取所有请求参数的名字:request.getParameterNames()
  • get方式的请求,可以获取url后边跟所有的请求参数的字符串:request.getQueryString()

servlet跳转

跳转有两种方式:

  1. 服务器内部跳转:
    主要借助RequestDispatcher
    ※ 获取RequestDispatcher的方式 :由服务器在执⾏完⼀个servlet之后,在继续访问下⼀个资源
    1. req.getRequestDispatacher(path)
    2. servletContext.getRequestDispatcher(String path)
    ※ 通过RequestDispatcher进行跳转的方式 :
    1. forward(request,response):会清空response里边的信息
    2. inclue(request,response):不会清空,⽽是将要跳转到的资源的信息包含到当前response⾥边
    所以是先获取,后使用

@WebServlet("/ForwardServlet"):

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取RequestDispatcher 的两种方式
		// 通过request直接获取
	//	RequestDispatcher rd = request.getRequestDispatcher("WEB-INF/Demo.html");
		//通过RequestDispatcher 发生跳转  并且清空当前响应的信息
	//	rd.forward(request, response);
		
		// 通过servletcontext获取RequestDispatcher
		// 先获取servletcontext
		ServletContext servletContext = request.getServletContext();
		RequestDispatcher rd = servletContext.getRequestDispatcher("/WEB-INF/Demo.html");
		// 携带着当前的响应信息去做跳转
		rd.include(request, response);
	}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<img src="img/t.png">
	<h1>hello</h1>
</body>
</html>

运行结果:
在这里插入图片描述

类似于:
在这里插入图片描述

  1. 重定向:由服务器返回给客户端浏览器⼀个地址,由客户端再发起⼀次请求,这个过程也是⾃动完成的

    主要是使用:response.sendRedirect(path)

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("welcom to servlet");
		// 重定向
		response.sendRedirect("ForwardServlet");
	}

类似于:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值