实验5 Servlet
需要资料的,文章末尾自提
一、实验目的:
1、理解Servlet的生命周期。
2、熟悉web.xml文件的作用。
3、熟悉ServletConfig接口和SservletContext接口的使用。
二、 实验内容:
1、创建一个Servlet,在浏览器中显示诗歌名。具体要求:
(1)该Servlet在第一次被调用时,初始化一个存储诗歌的数组。
(2)当用户通过浏览器访问Servlet时,如果URL中带参数num,则在浏览器中显示诗歌数组中下标为num的诗歌名,如图1所示;如果URL中不带参数num,则从诗歌数组中随机选择一个诗歌名,如图2所示。
图1 按照下标的诗歌名输出
图2 诗歌名的随机输出
【实验步骤】(补全代码
)
(1)新建一个Web应用程序,项目名称为“web5”。
(2)在项目中创建“it.entity”包,并在包中创建Poetry类。
package it.entity;
public class Poetry {
private String artist; //作者
private String title ; //诗歌名
//【代码一】带2个参数的构造函数;以及成员变量的getter和setter
}
(3)在项目中创建“it.servlet”包,并在包中创建RandomeServlet类。
package it.servlet;
import it.entity.Poetry;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
public class RandomServlet implements Servlet {
Poetry[] poetrys ;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
poetrys = new Poetry[]{
new Poetry("泰戈尔", "太阳颂"),
new Poetry("泰戈尔", "生如夏花"),
new Poetry("泰戈尔", "飞鸟集"),
new Poetry("泰戈尔", "太阳颂"),
new Poetry("泰戈尔", "园丁集"),
new Poetry("泰戈尔", "吉檀迦利"),
new Poetry("泰戈尔", "闲暇")};
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
String numString = servletRequest.getParameter("num");
servletResponse.setContentType("text/html;charset=UTF-8");
//当没有传num参数时,随机显示一首诗歌名
if (/*【代码一】*/) {
int random = (int) (Math.random() * poetrys.length);
servletResponse.getWriter().println("今天的诗:"+/*【代码二】*/);
return;
}
//判断num的值是否在诗歌数组的下标范围内,
//如果是,则显示诗歌数组中下标为num的诗歌名
int num = Integer.parseInt(numString);
if (/*【代码三】*/) {
servletResponse.getWriter().println("今天的诗:"+poetrys[num].getTitle());
} else {
servletResponse.getWriter().println("<h1>Error!</h1><br/>");
servletResponse.getWriter().println("num的值应在0~" + (poetrys.length - 1) + "之间");
}
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
(4)在web.xml文件中,实现Random类和“/random”的映射。例如:
(5)设置项目的Application Context为“/web5”。启动tomcat,部署项目,查看结果。
2、完善第1题的应用。诗歌信息以如下格式存储在“poetry.txt”文件中,读取该文件,以完成诗歌数据的初始化。
【实验步骤】
(1)将“poetry.txt”文件拷贝到“web5”项目的“WEB-INF”节点下。
(2)在“web5”项目的“it.servlet”包中新建“RandomServlet2”类。
package it.servlet;
import it.entity.Poetry;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
@WebServlet("/random2")
public class RandomServlet2 implements Servlet {
ArrayList<Poetry> poetryList = new ArrayList<>();
//通过字符串的解析,实现诗歌对象的添加
void addPoetry(String lineToParse) {
String[] tokens = lineToParse.split("/");
poetryList.add(new Poetry(tokens[0], tokens[1]));
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
try {
//获取poetry.txt的实际路径
File file = new File(servletConfig.getServletContext().getRealPath("/WEB-INF/poetry.txt"));
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = null;
while ((line = reader.readLine()) != null) {
addPoetry(line);
}
System.out.println("诗歌数组初始化完毕!");
} catch (Exception ex) {
ex.printStackTrace();
}
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
String numString = servletRequest.getParameter("num");
servletResponse.setContentType("text/html;charset=UTF-8");
//当没有传num参数时,随机显示一首诗歌名
if (numString == null) {
int random = (int) (Math.random() * poetryList.size());
servletResponse.getWriter().println("今天的诗:"+/*【代码一】*/);
return;
}
//判断num的值是否在诗歌数组的下标范围内,
//如果是,则显示诗歌数组中下标为num的诗歌名
int num = Integer.parseInt(numString);
if (/*【代码二】*/) {
servletResponse.getWriter().println("今天的诗:"+poetryList.get(num).getTitle());
} else {
servletResponse.getWriter().println("<h1>Error!</h1><br/>");
servletResponse.getWriter().println("num的值应在0~" + (poetryList.size() - 1) + "之间");
}
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
3、登录功能的实现。其中,初始化的用户名与密码存储于web.xml配置文件中。LoginServlet类读取web.xml文件中的初始化的用户名与密码,如果用户输入的用户名与密码正确,则显示“***,欢迎您!”,否则显示“用户名或密码错误”。
【实验步骤】
(1)在“web5”项目中新建“HTML”文件,命名为“login”。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="login" method="post">
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="userpass"><br/>
<input type="submit" value="提交">
<input type="reset" value="清空">
</form>
</body>
</html>
(2)在“it.servlet”包中新建java类“LoginServlet”。LoginServlet类实现Servlet接口,并判断用户输入的用户名与密码是否与web.xml文件中的用户名与密码一致,如果一致,显示“***,欢迎您”,否则输出“用户名或密码错误”。
package it.test;
import java.io.IOException;
import javax.servlet.*;
public class LoginServlet implements Servlet {
//请填写代码
@Override
public void init(ServletConfig servletConfig) throws ServletException {
this.servletConfig = servletConfig;
}
@Override
public ServletConfig getServletConfig() {
return servletConfig;
}
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
// 获取web.xml中配置的用户名和密码
String correctUsername = servletConfig.getInitParameter("username");
String correctPassword = servletConfig.getInitParameter("userpass");
// 获取用户输入的用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("userpass");
if (username != null && password != null && username.equals(correctUsername) && password.equals(correctPassword)) {
// 用户名和密码正确
out.println(username + ",欢迎您");
} else {
// 用户名或密码错误
out.println("用户名或密码错误");
}
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
// 清理资源
System.out.println("服务器重重启或关闭,资源已清除!!!");
}
}
(3)在web.xml文件中,实现LoginServlet与/login的绑定,并指定初始的用户名与密码。
4、创建一个Servlet,实现网站访问次数的统计,效果如图3所示。
图3 网站访问次数统计
【实验步骤】
在“it.servlet”包中新建java类“CountServlet”。当浏览器通过“/count”访问该类时,能在浏览器中输出网站的访问次数。
package it.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/count")
public class CountServlet implements Servlet {
private ServletConfig servletConfig;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//请填写代码
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
三、具体实现
//第一题
package it.entity;
public class Poetry {
private String artist; //作者
private String title ; //诗歌名
//【代码一】带2个参数的构造函数;以及成员变量的getter和setter
public Poetry(String artist, String title) {
this.artist = artist;
this.title = title;
}
public String getArtist() {
return artist;
}
public void setArtist(String artist) {
this.artist = artist;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
package it.servlet;
import it.entity.Poetry;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
public class RandomServlet implements Servlet {
Poetry[] poetrys ;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
poetrys = new Poetry[]{
new Poetry("泰戈尔", "太阳颂"),
new Poetry("泰戈尔", "生如夏花"),
new Poetry("泰戈尔", "飞鸟集"),
new Poetry("泰戈尔", "太阳颂"),
new Poetry("泰戈尔", "园丁集"),
new Poetry("泰戈尔", "吉檀迦利"),
new Poetry("泰戈尔", "闲暇")};
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
String numString = servletRequest.getParameter("num");
servletResponse.setContentType("text/html;charset=UTF-8");
//当没有传num参数时,随机显示一首诗歌名
if (numString == null || numString.isEmpty()/*【代码一】*/) {
int random = (int) (Math.random() * poetrys.length);
servletResponse.getWriter().println("今天的诗:"+ poetrys[random].getTitle()/*【代码二】*/);
return;
}
//判断num的值是否在诗歌数组的下标范围内,
//如果是,则显示诗歌数组中下标为num的诗歌名
int num = Integer.parseInt(numString);
if (num >= 0 && num < poetrys.length/*【代码三】*/) {
servletResponse.getWriter().println("今天的诗:"+poetrys[num].getTitle());
} else {
servletResponse.getWriter().println("<h1>Error!</h1><br/>");
servletResponse.getWriter().println("num的值应在0~" + (poetrys.length - 1) + "之间");
}
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
//第二题
package it.servlet;
import it.entity.Poetry;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
@WebServlet("/random2")
public class RandomServlet2 implements Servlet {
ArrayList<Poetry> poetryList = new ArrayList<>();
//通过字符串的解析,实现诗歌对象的添加
void addPoetry(String lineToParse) {
String[] tokens = lineToParse.split("/");
poetryList.add(new Poetry(tokens[0], tokens[1]));
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
try {
//获取poetry.txt的实际路径
File file = new File(servletConfig.getServletContext().getRealPath("/WEB-INF/poetry.txt"));
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = null;
while ((line = reader.readLine()) != null) {
addPoetry(line);
}
System.out.println("诗歌数组初始化完毕!");
} catch (Exception ex) {
ex.printStackTrace();
}
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
String numString = servletRequest.getParameter("num");
servletResponse.setContentType("text/html;charset=UTF-8");
//当没有传num参数时,随机显示一首诗歌名
if (numString == null) {
int random = (int) (Math.random() * poetryList.size());
servletResponse.getWriter().println("今天的诗:"+ poetryList.get(random).getTitle()/*【代码一】*/);
return;
}
//判断num的值是否在诗歌数组的下标范围内,
//如果是,则显示诗歌数组中下标为num的诗歌名
int num = Integer.parseInt(numString);
if (num >= 0 && num < poetryList.size()/*【代码二】*/) {
servletResponse.getWriter().println("今天的诗:"+poetryList.get(num).getTitle());
} else {
servletResponse.getWriter().println("<h1>Error!</h1><br/>");
servletResponse.getWriter().println("num的值应在0~" + (poetryList.size() - 1) + "之间");
}
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
//第三题
package it.test;
import java.io.IOException;
import javax.servlet.*;
public class LoginServlet implements Servlet {
//请填写代码
private ServletConfig servletConfig;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
this.servletConfig = servletConfig;
}
@Override
public ServletConfig getServletConfig() {
return servletConfig;
}
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
// 获取web.xml中配置的用户名和密码
String correctUsername = servletConfig.getInitParameter("username");
String correctPassword = servletConfig.getInitParameter("userpass");
// 获取用户输入的用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("userpass");
if (username != null && password != null && username.equals(correctUsername) && password.equals(correctPassword)) {
// 用户名和密码正确
out.println(username + ",欢迎您");
} else {
// 用户名或密码错误
out.println("用户名或密码错误");
}
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
// 清理资源
System.out.println("服务器重重启或关闭,资源已清除!!!");
}
}
//第四题
package it.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/count")
public class CountServlet implements Servlet {
private ServletConfig servletConfig;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//请填写代码
// 获取ServletContext对象
ServletContext context = servletRequest.getServletContext();
Integer visitCount = (Integer) context.getAttribute("visitCount");
//包装类的好处:解决第一次未null值的时候不会报空指针问题
if(visitCount == null)
visitCount =1;
else
visitCount ++;
// 将访问次数存储回ServletContext中
context.setAttribute("visitCount", visitCount);
servletResponse.setContentType("text/html;charset=UTF-8");
servletResponse.getWriter().println("访问次数: " + count);
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
四、资料自提
链接:https://pan.baidu.com/s/1a0D9tsHb3B5CYFosJBI0Bw?pwd=v8ui
提取码:v8ui