Ⅰ、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");
}
}
}