week2
<!DOCTYPE html>
<html>
<head>
<title>四级查询</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!--link用于引用外部样式表,href指定引用的文件的路径 Ctrl+\-->
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<!--div是用于布局的一个元素,建议页面的最外面添加一个div用于布局-->
<div>
<!--Emmet插件->用一些缩写快速完成全写-->
<h1>四级查询程序</h1>
<hr>
<br>
<!--h1+hr+br->tab-->
<!--如果需要提交数据到服务器,则文本框等元素的外面必须加-->
<form>
<!--input->tab-->
考号:<input type="text">
<br><br>
姓名:<input type="text">
<br><br>
<!--提交按钮才能将表单的数据提交给服务器,除非你使用ajax发送请求-->
<input type="submit" value="查询">
</form>
</div>
</body>
</html>
div{
width: 300px;
margin: 50px auto;
text-align: center;
background-color: darkcyan;
padding: 20px 20px 30px 20px;
color: white;
}
div h1{
color: lightgoldenrodyellow;
}
input[type="text"]{
padding: 8px 10px;
border: solid 1px lightblue;
outline: none;
border-radius: 5px;
}
input[type="text"]:hover{
box-shadow: 0px 0px 5px yellow;
}
div input[type="submit"]{
background-color: darkgreen;
width: 100px;
height: 30px;
border: none;
outline: none;
color: white;
font-size: 16px;
border-radius: 5px;
}
div input[type="submit"]:hover{
cursor: pointer;
background-color: brown;
font-size: 102%;
}
margin
例子 1
margin:10px 5px 15px 20px;
上外边距是 10px
右外边距是 5px
下外边距是 15px
左外边距是 20px
例子 2
margin:10px 5px 15px;
上外边距是 10px
右外边距和左外边距是 5px
下外边距是 15px
例子 3
margin:10px 5px;
上外边距和下外边距是 10px
右外边距和左外边距是 5px
例子 4
margin:10px;
所有 4 个外边距都是 10px
padding
例子 1
padding:10px 5px 15px 20px;
上内边距是 10px
右内边距是 5px
下内边距是 15px
左内边距是 20px
例子 2
padding:10px 5px 15px;
上内边距是 10px
右内边距和左内边距是 5px
下内边距是 15px
例子 3
padding:10px 5px;
上内边距和下内边距是 10px
右内边距和左内边距是 5px
例子 4
padding:10px;
week3 C01_D02_LoginSystem
index.html
<!DOCTYPE html>
<html>
<head>
<title>用户登录</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/style.css"/>
</head>
<body>
<div>
<h1>用户登录</h1>
<hr>
<br>
<!--表单的action属性指定表单提交的请求交给服务器端的哪个组件处理(Servlet或JSP)-->
<!--如果是一个servlet,则action指定为该servlet的url模式,也就是访问路径-->
<form action="ls">
账号:<input type="text" name="uname">
<br><br>
密码:<input type="password" name="pwd">
<br><br>
<input type="submit" value="登录">
</form>
</div>
</body>
</html>
second.html
<!DOCTYPE html>
<html>
<head>
<title>这是我的第二个页面</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="background-color:red;">
<h1>这是我的第二个页面!</h1>
</body>
</html>
div{
width: 300px;
margin: 50px auto;
text-align: center;
background-color: darksalmon;
padding: 20px 20px 30px 20px;
color: white;
}
div h1{
color: lightgoldenrodyellow;
}
input[type="text"],input[type="password"]{
padding: 8px 10px;
border: solid 1px lightblue;
outline: none;
border-radius: 5px;
}
input[type="text"]:hover,input[type="password"]:hover{
box-shadow: 0px 0px 5px yellow;
}
div input[type="submit"]{
background-color: crimson;
width: 100px;
height: 30px;
border: none;
outline: none;
color: white;
font-size: 16px;
border-radius: 5px;
}
div input[type="submit"]:hover{
cursor: pointer;
background-color: brown;
font-size: 102%;
}
LoginServlet
package com.qdu.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
*
* @author CN
*/
public class LoginServlet implements Servlet{
//一个Servlet有三个生命周期方法init(),service(),destroy()
//init() initialize 初始化的方法,一般用于编写执行初始化的代码
//Servlet创建一个对象后,会调用init方法执行初始化工作
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init()方法被调用...");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("service()方法被调用.....");
//1. 获取请求参数
//web程序中请求参数全部是以字符串提交,如果需要转换类型,需要手动转换
//Ctrl+Shift+上/下
String uname=req.getParameter("uname"); //根据请求参数的名称获取请求参数的值
String pwd=req.getParameter("pwd"); //根据请求参数的名称获取请求参数的值
//2. 执行业务逻辑,完成请求处理
//3. 生成动态响应内容
res.setContentType("text/html;charset=utf-8"); //设置响应内容的MIME类型和字符集
PrintWriter out=res.getWriter(); //Ctrl+Shift+I 修复导入
if("anna".equals(uname)&&"1234".equals(pwd))
out.println("<h1 style=\"color:green;text-align: center;\">登录成功,欢迎你,"+uname+"</h1>");
else
//双引号用于括起来字符串,双引号里面不可以直接放双引号,除非转义为普通字符串
out.println("<h1 style=\"color:red;text-align: center;\">登录失败,请检查用户名或密码是否正确!</h1>");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("destroy()方法被调用....");
}
}
C01_D06_SearchStudentInfo
<!DOCTYPE html>
<html>
<head>
<title>学生信息查询</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/bootstrap.min.css"/>
</head>
<body>
<div class="container">
<h1 class="text-center text-primary">学生信息查询</h1>
<hr>
<br>
<!--<input type="radio" id="genderM"><label for="genderM">男</label>-->
<!--<br><br>-->
<!--如果不希望表单中添加了form-control类的元素单独占据一行-->
<!--可以给form添加form-inline类,表示该表单是内联表单-->
<!--内联表单中添加了form-control类的元素不会单独占据一行-->
<!--action指定表单提交的请求给url模式是sis的servlet处理-->
<form class="form-inline" action="sis">
<!--label用于显示一个提示文字,也就是标签-->
<!--一般是和一个表单元素绑定使用,for指定绑定的元素的id-->
<label for="xuehao">学号:</label>
<!--可以使用类form-control给文本框、文本域、下拉列表添加样式-->
<!--该样式给元素添加基本的文本框样式,并且让该元素单独占据一行-->
<input class="form-control" id="xuehao" type="text" name="xuehao">
<button class="btn btn-sm btn-primary">查询</button>
</form>
<br><br>
<!--点击超链接,可以执行javascript,在href中添加javascript:js代码即可-->
<a href="javascript:alert('呵呵');">点击我</a>
<br><br>
<!--点击超链接可以请求一个页面或servlet,如果需要追加参数,直接追加即可-->
<a href="sis?xuehao=2017204612">张文宇</a>
<br><br>
<a href="sis?xuehao=2017204629">
<img src="images/img6.jpg" alt="这是吕品" title="这是吕品的头像">
</a>
</div>
</body>
</html>
DatabaseUtil
package com.qdu.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* 数据库工具类,帮助获取到对应数据库的连接和关闭连接
* @author Anna
*/
public class DatabaseUtil {
private static final String DRIVER_CLASS="com.microsoft.sqlserver.jdbc.SQLServerDriver";
private static final String URL="jdbc:sqlserver://localhost:1433;databaseName=QDU";
private static final String USERNAME="sa";
private static final String PASSWORD="sa";
/**
* 获取数据库连接
* @return 一个数据库连接对象
*/
public static Connection getConnection(){
try {
Class.forName(DRIVER_CLASS);
return DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
/**
* 关闭数据库连接
* @param rs 结果集对象
* @param ps 语句对象
* @param con 连接对象
*/
public static void close(ResultSet rs,PreparedStatement ps, Connection con){
try {
if(null!=rs) rs.close();
if(null!=ps) ps.close();
if(null!=con) con.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
StudentDao
package com.qdu.dao;
import com.qdu.pojo.Student;
import com.qdu.util.DatabaseUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* Dao类-数据访问对象类,专门用于访问数据库中的表 StudentDao包含方法用于对StudentMark表执行增删改查,
* 这里只封装了一个方法用于查询
* Data Access Object 数据访问对象,专门用于操作数据库中表的对象
*
* @author Anna
*/
public class StudentDao {
/**
* 根据学号查询学生所有信息
* @param rollno 学生学号
* @return 包含学生所有信息的学生对象
*/
public Student findStudentByRollno(String rollno) {
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
con = DatabaseUtil.getConnection();
ps = con.prepareStatement("select * from Student where Srollno=?");
ps.setString(1, rollno);
rs = ps.executeQuery();
if (rs.next()) {
return new Student(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5));
}
} catch (Exception e) {
e.printStackTrace();
} finally{
DatabaseUtil.close(rs,ps,con);
}
return null;
}
}
StudentInfoServlet
package com.qdu.servlet;
import com.qdu.dao.StudentDao;
import com.qdu.pojo.Student;
import java.io.IOException;
import java.io.PrintWriter;
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,用于处理查询学生信息的请求
*
* @author Anna
*/
//Ctrl+Shift+I
//@WebSevlet注解/标注将一个类注册为一个servlet,设置一个url模式,也就是访问路径就可以了
@WebServlet("/sis")
public class StudentInfoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1. 获取请求参数
String xuehao=req.getParameter("xuehao");
//2. 执行业务逻辑,完成请求处理
StudentDao dao=new StudentDao();
//调用StudentDao类的findStudentByRollno()根据学号查询单个学生的信息
//该方法返回一个Student对象,包含一个学生的5项信息
Student stu=dao.findStudentByRollno(xuehao);
//取消快捷键和添加注释快捷键相同 Ctrl+/
//Alt+Shift+F修复代码个事
//3. 显示动态响应
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<h1>学生信息</h1><hr>");
out.println("<br>学号:"+stu.getSrollno());
out.println("<br>姓名:"+stu.getSname());
out.println("<br>性别:"+stu.getSgender());
out.println("<br>密码:"+stu.getSpassword());
out.println("<br>班级:"+stu.getSbatch());
}
}
C01_D07_GetRequestParameters
<!DOCTYPE html>
<html>
<head>
<title>注册页面</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/bootstrap.min.css"/>
<style>
label{
margin-left: 3px;
margin-right: 16px;
}
label:hover{
cursor: pointer;
text-decoration: underline;
}
</style>
</head>
<body>
<div class="container">
<h1 class="text-danger">用户注册</h1>
<hr>
<form action="rs" class="form-inline">
<!--表单元素提交给服务器的都是自己的value属性的值,而不是显示文字-->
用 户: <input type="text" name="username" value="anna" class="form-control">
<br><br>
密 码: <input type="password" name="password" value="1234" class="form-control">
<br><br>
性 别:
<!--表单元素提交的都是value的值
同一组单选按钮的name必须相同,才是单选
male, female
-->
<input type="radio" name="gender" value="M" id="male">
<label for="male">男</label>
<input type="radio" name="gender" checked value="F" id="female">
<label for="female">女</label>
<br><br>
国 家:
<select name="country" class="form-control">
<option value="China">中国</option>
<option value="USA">USA</option>
<option value="Korea">한국</option>
<option value="Japan">Japan</option>
</select>
<br><br>
爱 好:
<!--多个同一个组的复选框名称可以相同,可以不同,但是一般建议相同-->
<!--如果相同,则参数作为一个字符串数组提交给服务器 hobby-->
<input id="h1" type="checkbox" name="hobbies" value="LOL"><label for="h1">英雄联盟</label>
<input id="h2" checked type="checkbox" name="hobbies" value="王者荣耀"><label for="h2">王者荣耀</label>
<input id="h3" checked type="checkbox" name="hobbies" value="绝地求生"><label for="h3">绝地求生</label>
<input id="h4" type="checkbox" name="hobbies" value="学习"><label for="h4">学习</label>
<br><br>
<input type="submit" value="提交注册" class="btn btn-sm btn-success">
</form>
</div>
</body>
</html>
RegisterServlet
package com.qdu.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/rs")
public class RegisterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/html;charset=utf-8");
PrintWriter out=res.getWriter();
out.println("<h1>注册信息</h1><hr>");
out.println("<br>账户:"+req.getParameter("username"));
out.println("<br>密码:"+req.getParameter("password"));
out.println("<br>性别:"+req.getParameter("gender"));
out.println("<br>国家:"+req.getParameter("country"));
out.println("<br>爱好:");
//如果想获取一个参数的多个值,比如通过复选框提交的参数
//可以调用getParameterValues()方法根据参数名获取参数的多个值
//以字符串数组返回多个值
String[] hbs=req.getParameterValues("hobbies");
//Http报头/标头
//forEach循环
//:后面跟着要遍历的数组或集合的名称
//:前面跟着一个变量,变量类型和数组类型相同,表示遍历的当前元素
for(String x:hbs){
out.println(x+" ");
}
}
}
package com.qdu.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/rs")
public class RegisterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
//ServletRequest
//ServletResponse
//HttpServletRequest继承ServletRequest
//HttpServletResponse继承ServletResponse
//除了响应内容,也可设置一些响应报头/标头,关于响应的额外信息
//调用setHeader()方法可以设置标头的名称和值
//refresh标头指定间隔多长时间刷新响应内容
//3是用秒表示的时间间隔,也可添加一个url,表示间隔多久后跳转到目标页面
//res.setHeader("refresh","3;url=https://www.baidu.com");
//content-type用于设置响应内容的MIME类型和字符集编码
//setContentType()方法中的代码其实就是设置content-type这个报头
res.setHeader("content-type", "text/html;charset=utf-8");
//res.setContentType("text/html;charset=utf-8");
PrintWriter out=res.getWriter();
out.println("<h1>注册信息</h1><hr>");
out.println("<br>账户:"+req.getParameter("username"));
out.println("<br>密码:"+req.getParameter("password"));
out.println("<br>性别:"+req.getParameter("gender"));
out.println("<br>国家:"+req.getParameter("country"));
out.println("<br>爱好:");
//如果想获取一个参数的多个值,比如通过复选框提交的参数
//可以调用getParameterValues()方法根据参数名获取参数的多个值,以字符串数组返回多个值
String[] hbs=req.getParameterValues("hobbies");
for(String x:hbs){
out.println(x+" ");
}
//请求是客户端发送的,所以作为服务器端的servlet,servlet可以获取请求报头
out.println("<br>客户端优先接受的MIME类型:"+req.getHeader("accept"));
out.println("<br>客户端优先接受的语言:"+req.getHeader("accept-language"));
out.println("<br>客户端的浏览器信息:"+req.getHeader("user-agent"));
}
}
index.html
<!DOCTYPE html>
<html>
<head>
<title>ServletConfig接口和ServletContext接口</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/bootstrap.min.css"/>
</head>
<body>
<div class="container">
<h1 class="text-center text-danger">ServletConfig接口 和 ServletContext接口</h1>
<hr>
<br>
<!--点击超链接可以请求一个资源(页面、图片、servlet)-->
<a href="s1">请求Servlet1</a>
<br><br>
<a href="s2">请求Servlet2</a>
<br><br>
<!--点击超链接可以执行js代码,href中javascript:开头,后面跟着js代码即可-->
<a href="javascript:alert('呵呵呵呵呵');">点击我试试</a>
</div>
</body>
</html>
C01_D08_ServletConfig_ServletContext
Servlet1
package com.qdu.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet1
*
* @author Anna
*/
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//硬编码: 将一些用到的数据写死在代码里,不方便程序维护
//如果有一些初始数据是多个servlet或整个程序需要使用的
//可以考虑在web.xml中配置为程序的初始化参数,程序的初始化参数叫做上下文参数
//每个web程序有且仅有一个ServletContext对象,用于在整个程序中共享数据
//程序的上下文参数也会封装到该对象中
//在Servlet中可调用getServletContext()方法获取程序的上下文对象
ServletContext ctx=getServletContext();
//上下文参数是初始化参数的一种,调用getInitParameter()方法可根据参数名获取参数值
//这样如果需要修改编码,修改web.xml中的上下文参数的值即可,无需修改每个Servlet
String encoding=ctx.getInitParameter("encoding");
resp.setContentType("text/html;charset="+encoding);
try (PrintWriter out = resp.getWriter()) {
out.println("<h1>Servlet1哈哈</h1>");
out.println("<hr>");
//也可直接获取上下文对象直接操作,而不用变量接收
out.println("<br>上下文参数encoding:"+getServletContext().getInitParameter("encoding"));
//如果有一些初始数据是某个Servlet要用的,可考虑定义为该Servlet的初始化参数
//每个servlet的配置信息(包括servlet的初始化参数)被封装到一个ServletConfig对象中
//一个Servlet有一个对应的ServletConfig对象
//该对象通过Servlet的init()方法传入给Servlet
//在Servlet中可通过调用getServletConfig()方法获取对应的ServletConfig对象
ServletConfig cfg=getServletConfig();
out.println("<br>Servlet1的初始化参数emailId:"+cfg.getInitParameter("emailId"));
out.println("<br>Servlet1的初始化参数emailPwd:"+cfg.getInitParameter("emailPwd"));
//如果在程序运行的过程中,某个servlet产生了一些数据(可以是任何类型:整数、字符串或其他对象),需要共享给其他servlet用
//可以考虑将数据作为一项属性(attribute)添加到上下文对象中
//setAttribute()方法用于添加一项属性到上下文对象中,要求给出属性名和属性值
//属性名是字符串表示的名称,属性值可以是任何对象
Random rand=new Random();
int num=rand.nextInt(10001);
ctx.setAttribute("number", num);
//在其他Servlet中可以通过调用getAttribute(String name)方法根据属性名获取属性值
out.println("<br>Servlet1生成的数字:"+num);
}
}
}
自从JDK最初版本发布起,我们就可以使用java.util.Random类产生随机数了。在JDK1.2中,Random类有了一个名为nextInt()的方法:
public int nextInt(int n)
给定一个参数n,nextInt(n)将返回一个大于等于0小于n的随机数,即:0 <= nextInt(n) < n。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<!--如果有一些初始数据是多个servlet或整个程序要使用的,可以考虑定义程序的初始化参数,-->
<!--叫做上下文参数(context parameter)-->
<context-param>
<description>servlet响应内容的编码</description>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</context-param>
<!--
<context-param>
<param-name>dbusername</param-name>
<param-value>sa</param-value>
</context-param>
<context-param>
<param-name>dbpassword</param-name>
<param-value>sa</param-value>
</context-param>
-->
<servlet>
<servlet-name>servlet1</servlet-name>
<servlet-class>com.qdu.servlet.Servlet1</servlet-class>
<!--servlet的初始化参数在servlet中定义-->
<!--init-param标记定义一个初始化参数,param-name定义参数的名称,param-value定义参数的值-->
<init-param>
<description>公司邮箱地址</description>
<param-name>emailId</param-name>
<param-value>anna@163.com</param-value>
</init-param>
<init-param>
<description>公司邮箱密码</description>
<param-name>emailPwd</param-name>
<param-value>666666</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>servlet2</servlet-name>
<servlet-class>com.qdu.servlet.Servlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet1</servlet-name>
<url-pattern>/s1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>servlet2</servlet-name>
<url-pattern>/s2</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>
这是什么意思来着?
Servlet2
package com.qdu.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet2
*
* @author Anna
*/
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext ctx = getServletContext();
//上下文参数是初始化参数的一种,调用getInitParameter()方法可根据参数名获取参数值
//因为上下文参数是属于整个程序的,所以每个servlet都可以用,所以Servlet2也可获取到上下文参数的值
String encoding = ctx.getInitParameter("encoding");
resp.setContentType("text/html;charset=" + encoding);
try (PrintWriter out = resp.getWriter()) {
out.println("<h1>Servlet2呵呵</h1>");
out.println("<hr>");
out.println("<br>上下文参数encoding:" + getServletContext().getInitParameter("encoding"));
//这里调用getServletConfig()获取的是Servlet2自己的ServletConfig对象,所以没有初始化参数
ServletConfig cfg = getServletConfig();
out.println("<br>Servlet1的初始化参数emailId:" + cfg.getInitParameter("emailId"));
out.println("<br>Servlet1的初始化参数emailPwd:" + cfg.getInitParameter("emailPwd"));
//Servlet1放入上下文对象的属性可以通过getAttribute()方法根据属性名获取到属性值
out.println("<br>Servlet1生成的数字:"+ctx.getAttribute("number"));
}
}
}
//这里调用getServletConfig()获取的是Servlet2自己的ServletConfig对象,所以没有初始化参数,所以显示null