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

Ⅰ、ServletConfig

就是Servlet的配置信息,一个ServletConfig对应一个Servlet(配置在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

一个ServletContext对应一个Servlet。

当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,它是Servlet的私有对象,在Servlet初始化时实例化,负责初始化当前Servlet的配置参数。
第二个:ServletContext全局对象,这个对象是在服务器启动之后实例化,封装了全局的配置信息,可以被所有Servlet共享。

Ⅲ、作用域对象0

域对象:有作用域的对象就是域对象。域对象可以用来存储并在不同组件之间进行传递,域对象限制了数据的访问范围,其值会随着对象的消失而消失。Servlet提供了三个域对象(request、session、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");
			}
		}
	}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈年_H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值