Servlet(下)——ServletConfig、ServletContext、作用域对象、请求转发与重定向、注解、XML && 练习

标签: 交互  java  html

Ⅰ、ServletConfig

就是Servlet的配置信息

在运行Servlet程序时,可能需要一些辅助信息,例如:文件使用的编码、使用Servlet程序的共享信息等。这些信息可以在web.xml文件中使用一个或者多个<init-param>标签进行配置。当Tomcat初始化一个Servlet时,会将该Servlet的配置信息封装到ServletConfig对象中,此时可以通过调用init(ServletConfig config)方法将ServletConfig对象传递给Servlet。

在这里插入图片描述

下面进行共享信息的测试

xml

<servlet>
  	<servlet-name>ConfigServlet</servlet-name>
  	<servlet-class>com.hbw.servlet.ConfigServlet</servlet-class>
  	
  	<init-param>
  		<param-name>test1</param-name>
  		<param-value>This is testXml01</param-value>
  	</init-param>
  	<init-param>
  		<param-name>test2</param-name>
  		<param-value>This is testXml02</param-value>
  	</init-param>
  </servlet>
  <servlet-mapping>
  	<servlet-name>ConfigServlet</servlet-name>
  	<url-pattern>/config</url-pattern>
  </servlet-mapping>

servlet代码0

package com.hbw.servlet;

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

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

public class ConfigServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public ConfigServlet() {
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取ServletConfig对象,可省略(猜测初始化时获取了ServletConfig对象)
//		ServletConfig config = getServletConfig();//继承而来的方法,可以直接使用
		//根据关键字获取值
//		String value = config.getInitParameter("test1");
		String value = getInitParameter("test1");
		System.out.println(value);
		//获取所有的name,再获取值
		Enumeration<String> names = getInitParameterNames();
		while(names.hasMoreElements()) {
			String name = names.nextElement();
			String value1 = getInitParameter(name);
			System.out.println(name + "\t" + value1);
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

}

关于猜测
查看ConfigServlet(自定义的Servlet)的超类GenericServlet发现,其中实现了ServletConfig接口。而且调用getInitParameter、getInitParameterNames时都return了ServletConfig对象

在这里插入图片描述

前端

<body>
<a href="config">测试config</a>
</body>

Ⅱ、ServletContext

当Tomcat启动时,Tomcat会为每个Web应用创建一个唯一的ServletContext对象代表当前的Web应用,该对象封装了当前Web应用的所有信息。可以利用该对象获取整个Web应用程序的初始化信息、读取资源文件等。他与Servlt是一对多的关系,其内部封装的信息可以被同一web应用内的所有Servlet共享。

下面进行web应用程序的初始化信息获取练习。
xml

 <servlet>
  	<servlet-name>ContextServlt</servlet-name>
  	<servlet-class>com.hbw.servlet.ContextServlt</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>ContextServlt</servlet-name>
  	<url-pattern>/context</url-pattern>
  </servlet-mapping>
  
  <context-param>
  	<param-name>test_context1</param-name>
  	<param-value>This is test_context1</param-value>
  </context-param>
  <context-param>
  	<param-name>test_context2</param-name>
  	<param-value>This is test_context2</param-value>
  </context-param>

Servlet代码

package com.hbw.servlet;

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

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

public class ContextServlt extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public ContextServlt() {
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		ServletContext context = getServletContext();
		String value = context.getInitParameter("test_context1");
		System.out.println(value);
		
		Enumeration<String> names = context.getInitParameterNames();
		while(names.hasMoreElements()) {
			String name = names.nextElement();
			String value1 = context.getInitParameter(name);
			System.out.println(name + "\t" + value1);
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

}

前端

<body>
<a href="context">测试context</a>
</body>

总结0

在Tomcat启动时,除了request、response对象创建之外,还有两个对象被创建了。
第一个:ServletConfig,它是Servlett的私有对象,在Servlet初始化时实例化,负责初始化当前Servlet的配置参数。
第二个:ServletContext全局对象,这个对象是在服务器启动之后实例化,封装了全局的配置信息,可以被所有Servlet共享。

Ⅲ、作用域对象0

域对象:有作用域的对象就是域对象。域对象可以用来存储并在不同组件之间进行传递,域对象限制了数据的访问范围,其值会随着对象的消失而消失。Servlet提供了两个域对象(request、ServletContext)

即,作用于对象可以用来存值,并且在不同的文件之间进行传递。受本身作用范围的限制,超过该范围,就失效。

Servlet提供的域对象:
HttpServletRequest对象,在一次请求内有效
ServletContext对象,在当前项目中都有效

【域对象通用的常用方法】

setAttribute(key,value)设置(key:String、value:Object)
getAttribute(key)获取
removeAtribute(key)移除

request

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setAttribute("test", 123);
		System.out.println(request.getAttribute("test"));//123
		request.removeAttribute("test");
		System.out.println(request.getAttribute("test"));//null
		//只在当前请求范围内可以被。访问
	
	}

context

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		ServletContext context = getServletContext();
		context.setAttribute("test1", 123);
		context.setAttribute("test2", "abc");
		System.out.println(context.getAttribute("test1"));//123
		System.out.println(context.getAttribute("test2"));//“abc”
		//在当前服务器未结束之前都可以被访问
	}

在当前项目的其他文件中也可以获取这里设置的test1、test2

总结0

request作用域仅限于一次请求范围内可以实现信息共享,一次请求结束,request对象消失,内部的值也会随之消失,周期短,但效率高,不会占用过多的资源,而ServletContext时一个全局的作用域对象,整个web项目的所有组件(Servlet、jsp)共享信息、周期长,可以用来保存所有web组件之间需要共享的信息。它在tomcat服务器启动时创建,关闭时销毁。

Ⅳ、请求转发与重定向0

都是用于实现页面跳转的。

一、请求转发:带数据跳转
在这里插入图片描述

服务器行为

客户端发送请求,AServlet可能不能完成处理,AServlet将该请求转给BServlet处理,BServlet处理之后返回响应结果。

特点:
1)只有一个请求,所以request作用域,在整个过程中涉及的servlet都是共享的
2)浏览器地址栏不会随着转发的servlet不同而改变

语法:
request.getRequestDispatcher("url").forward(request, response);

下面进行请求转发的测试:

RequestForward01代码

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setAttribute("test", "abc");
		request.getRequestDispatcher("forward02").forward(request, response);
	}

RequestForward02代码

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("请求转发");
		System.out.println(request.getAttribute("test"));//abc
	}

二、重定向:不带数据跳转
在这里插入图片描述

客户端(浏览器)行为

客户端发送请求,AServlet可能不能完成处理,AServlet将可以完成该处理的AServlet返回给客户端。客户端重新发送请求给BServlet,处理之后回送响应。

特点:
1)至少有两次请求
2)浏览器地址栏会随着servlet不同而改变

语法:
response.sendRedirect(url)

下面进行重定向的测试:

sendRedirect01代码

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setAttribute("test", "abc");
		response.senRedirect("forward02");
	}

sendRedirect02代码

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("请求转发");
		System.out.println(request.getAttribute("test"));//null
	}

三、【区别】

1、发生位置不同,请求转发是服务器的行为;重回定向是客户端行为
2、请求转发浏览器地址栏不变;重定向浏览器地址栏可能会发生改变
3、请求转发一次只发送一个请求;重回定向一次至少发送两个请求
4、请求转发时request作用域的数据可共享;重定向不可共享
5、请求转发在服务器内部完成,速度高于重定向
6、请求转发的地址只能是当前项目;重定向的地址可以是任意地址
7、代码
请求转发:request.getRequestDispatcher(“url”).forward(request,response)
重定向:response.sendRedirect(“url”)

Ⅴ、注解

java注解(Annotation)又称Java标注,是JDK1.5之后支持的新特性。主要作用:简化复杂的编码
Java语言中的类、方法、变量、参数和包等都能被注解。
Servlet的注解(@WebServlet)是Servlet3.0之后版本支持的,为了简化web.xml的配置

记住:@WebServlet(/…)即可

package com.hbw.servlet;

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;

//@WebServlet("/annote")
//urlPatterns可以省略,默认存在
@WebServlet(urlPatterns={"/annote","/a","/b"},loadOnStartup=1,initParams= {@WebInitParam(name="test1",value="value1"),@WebInitParam(name="test2",value="value2")})
public class Annotation extends HttpServlet {
	private static final long serialVersionUID = 1L;
    public Annotation() {
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("使用Servlet注解");
		//获取config对象,可以省略
		ServletConfig config = getServletConfig();
		System.out.println(config.getInitParameter("test1"));
		
		Enumeration<String> names = getInitParameterNames();
		while(names.hasMoreElements()) {
			String name = names.nextElement();
			String value = getInitParameter(name);
			System.out.println(name+":"+value);
		}
		
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

}

Ⅵ、XML

一、概述
在这里插入图片描述
作用:存储和传输数据

XML与HTML

1)xml可扩展性的标记语言,其标签未事先定义,由程序员自定义;html标签事先已经定好
	注意:web.xml中之所以需要按要求写标签是因为其中有限制
2)xml用于存储和传输数据;html用于页面展示

二、创建xml文件

格式要求
1、第一行必须是版本和编码格式
2、有且只有一个根标签
3、严格区分大小写
4、标签成对存在
5、标签正确嵌套
6、标签不能以数字开头,可以使用下划线开头,不能含有空格
创建及编写代码

在这里插入图片描述
version:版本信息
encoding:编码格式

<?xml version="1.0" encoding="UTF-8"?>
<students>
	<student sex="">
		<name>张三</name>
		<age>17</age>
	</student>
	<student sex="">
		<name>李四</name>
		<age>17</age>
	</student>
	<student>
		<name>Mary</name>
		<age>18</age>
	</student>
	
</students>

三、xml解析
【描述待补充】

Ⅶ、练习题——学生管理系统3(+新增学生信息的操作)

👉在原来的基础上👈 +

前端代码

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>新增学生信息</title>
</head>
<body>
<form action="students" method="post" style="margin: auto;width: 300px;">
	<input type="hidden" value="insert" name="flage"/>
	<table border="1" cellpadding="10px" cellspacing="5px">
		<thead>
			<tr>
				<td colspan="2" align="center">
					<h2>新增信息</h2>
				</td>
			</tr>
		</thead>
		<tbody>
			<tr>
				<td>学号:</td>
				<td>
					<input type="text" name="ssno" />
				</td>
			</tr>
			<tr>
				<td>姓名:</td>
				<td>
					<input type="text" name="sname" />
				</td>
			</tr>
			<tr>
				<td>性别:</td>
				<td>
					<input type="text" name="ssex" />
				</td>
			</tr>
			<tr>
				<td colspan="2" align="center">
					<input type="submit" value="提交" style="font-size: 20px"/>
				</td>
			</tr>
		</tbody>
	</table>
</form>



</body>
</html>

dao层

public class StudentsDao {
	//使用DUBTils与c3p0与数据库进行交互
		 static ComboPooledDataSource ds = new ComboPooledDataSource();
		 static QueryRunner qr = new QueryRunner(ds);

		//查询所有学生
		public static List<Students> getStudents() {
			……
		}
		
		//新增
		public static int insertStudents(String ssno,String sname,String ssex) {
			int rows = 0;
			String sql = "insert into students(ssno,sname,ssex) values(?,?,?)";
			try {
				rows = qr.update(sql, ssno,sname,ssex);
			} catch (SQLException e) {
				e.printStackTrace();
			}
			return rows;
			
		}
}

service层

public class StudentsService {
	//查询全部
	public static List<Students> getStudents() {
		……
	}
	//新增
	public static boolean insertStudents(String ssno,String sname,String ssex) {
		int rows = StudentsDao.insertStudents(ssno, sname, ssex);
		return rows==0 ? false : true;
		
	}
}

servlet层

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//中文乱码
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
				
		String flage = request.getParameter("flage");
		String ssno = request.getParameter("ssno");
		String sname = request.getParameter("sname");
		String ssex = request.getParameter("ssex");
		//新增操作
		if("insert".equals(flage)) {
			if(StudentsService.insertStudents(ssno, sname, ssex)) {
				response.sendRedirect("/student-management02/students");
			}
		}
	}
版权声明:本文为Today_He原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Today_He/article/details/109047800

智能推荐

websocket基本原理

HTTP中一个request只能有一个response。而且这个response也是被动的,不能主动发起 因此过去的服务端推送信息是通过客户端不停的轮询实现的 websocket是双向通信协议,提供了服务端主动推送信息的能力 需要客户端(浏览器)和服务端同时支持 如果经过代理的话,还需要代理支持,否则有些代理在长时间无通信时会自动切断连接 因此WS为了保证连接不被断掉,会发心跳 WebSocket...

mybatis+ehcache二级缓存

导入jar包 mapper.xml文件开启二级缓存 pojo类实现序列化接口 配置ehcache.xml 测试...

python+opencv实现图像拼接

任务 拍摄两张图片去除相同部分,拼接在一起 原图 结果 步骤 读取两张图片 使用sift检测关键点及描述因子 匹配关键点 处理并保存关键点 得到变换矩阵 图像变换并拼接 代码实现 扩展 这里对右边图像进行变换,右边变得模糊,可以修改代码对左边图像变换 这里只有两张图片拼接,可以封装实现多张图片拼接 可以修改代码实现上下图片的拼接...

python_sklearn机器学习算法系列之AdaBoost------人脸识别(PCA,决策树)

          注:在读本文之前建议读一下之前的一片文章python_sklearn机器学习算法系列之PCA(主成分分析)------人脸识别(k-NearestNeighbor,KNN)         本文主要目的是通过一个简单的小...

memmove函数与memcpy函数的模拟实现

memmove函数和memcpy函数都是在内存复制任意类型的,但是它俩也有区别。当源区域和目标区域有重复的,memmove函数会复制缓冲区重叠的部分,而memcpy相反,会报出未知错误。 下面给出两个函数的实现 首先,memmove函数。 实现的基本原理如下图。 具体代码如下: memcpy函数的实现很简单,就直接给出源代码了...

猜你喜欢

SpringFramework核心 - IOC容器的实现 - 总结

1. 概述 把Spring技术内幕第一章和第二章过了一遍,也做了一些笔记, 对IOC容器的实现有了一定皮毛理解,现在跟着源码再过一遍总结一下IOC容器的初始化,Bean的初始化的过程,做一下总结 ① IOC容器和简单工厂模式 在开始之前,先想想我们平时是怎么使用IOC容器为我们管理Bean的,假设我们要把下面的User类交给IOC容器管理 我们不想关心如何创建一个User对象实例的,仅仅在需要他的...

Python和Django的安装

个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈  一、下载并安装Python Python 官方下载地址:http://www.python.org/ftp/python/ 我们这里选择的是 Python 2.7.2 。虽然目前最新版是Python 3.2.2, 但是Django目前还不支持 Python 3.2.2。 安装步骤很简单,双击安装包开...

OpenStack代码贡献初体验

为什么80%的码农都做不了架构师?>>>     OpenStack如今已成为开源云平台中的明星项目,得到广泛关注。OpenStack的优秀出众依赖于众多开发者的努力,在享受其带来的便利与快捷的同时,为其做一份贡献也是一个开发者的义务。  在前段时间的OpenStack的测试过程中,我发现Nova项目中的一个Bug,于是向社区提交了Bug报...

SQL Server之8:sql查询每个学生得分最高的两门课

这是一道面试题,今天有空把它记下来,以后遇到此类问题作个参考!刚一看到这个题目,估计好多人都会想到关键字top,其实这里用到的关键字是partition, 好了,先看看表结构,及数据吧!     接下来看一看partition的功能,执行语句   结果如下:   到这里一目了然知道最终结果了!   View Code     &...