文章目录
七、 获取初始化参数
1.获得servlet初始化参数
web3.0–初始化参数
package com.JavaWeb.Week4;
import java.io.IOException;
import java.io.PrintWriter;
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;
/**
* Servlet implementation class GetInitParamServlet
*/
@WebServlet(
urlPatterns="/GetInitParamServlet",
initParams= {@WebInitParam(name = "baseNum", value="初始化参数")}
)
public class GetInitParamServlet extends HttpServlet {
String ServletInitParam = null;
public void init(ServletConfig config) throws ServletException {
//获取servlet初始化参数
this.ServletInitParam = config.getInitParameter("baseNum");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("Servlet初始化参数:"+ServletInitParam);
out.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
web2.0–初始化参数+上下文
xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>test1</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>appName</param-name>
<param-value>Servlet Context InitParam</param-value>
</context-param>
<servlet>
<servlet-name>GetInitParamServlet</servlet-name>
<servlet-class>com.JavaWeb.week4.GetInitParamServlet</servlet-class>
<init-param>
<param-name>baseName</param-name>
<param-value>Servlet InitParam</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>GetInitParamServlet</servlet-name>
<url-pattern>/GetInitParamServlet</url-pattern>
</servlet-mapping>
</web-app>
servlet:
package com.JavaWeb.week4;
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;
public class GetInitParamServlet extends HttpServlet {
String basename = null;
String appname =null;
public void init(ServletConfig config)throws ServletException{
//初始化
this.basename = config.getInitParameter("baseName");
//上下文
ServletContext context = config.getServletContext();
this.appname = context.getInitParameter("appName");
//this.appname = config.getServletContext().getInitParameter("appName");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("Servlet InitParam(初始化参数):"+basename+"<br>");
out.println("Servlet Context InitParam(上下文初始化参数):"+appname);
out.close();
}
}
八、跟踪会话
1. cookie
1.1 临时cookie、持久cookie
临时cookie:
关闭浏览器重新访问http://localhost:8080/Demo/CookieClientServlet
持久cookie:
关闭浏览器重新访问http://localhost:8080/Demo/CookieClientServlet
代码:
CookieServerServlet:
package com.JavaWeb.Week4;
import java.io.*;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class CookieServerServlet
*/
@WebServlet("/CookieServerServlet")
public class CookieServerServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String ID = UUID.randomUUID().toString();//生成128位随机数,转为字符串
Cookie cookie = new Cookie("id",ID);//键名-键值
//cookie.setMaxAge(60*60);//设置cookie有效期,单位:秒。默认值为-1
response.addCookie(cookie);//发送cookie
//response.getWriter().print("已经给你发送了ID");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("send ID ,success!");
out.println("<a href='CookieClientServlet'>show cookie</a>");
out.println("</body>");
out.println("</html>");
out.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
CookieClientServlet:
package com.JavaWeb.Week4;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class CookieClientServlet
*/
@WebServlet("/CookieClientServlet")
public class CookieClientServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
Cookie[] cs = request.getCookies() ;//获取cookie对象。用cookie数组装(可以接收不止一个cookie)
if(cs != null) {
for(Cookie c:cs) {//循环
if(c.getName().equals("id")) {
out.println("You cookie ID is "+c.getValue());
}else {
out.println("Fail! name:"+c.getName()+" value:"+c.getValue());
}
}
}else {
out.println("Fail! NULL");
}
out.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
1.2 创建三个不同生命周期的Cookie对象。
测试:
60s内重开新打浏览器
60s后重开新打浏览器
CookieAServlet:
package com.JavaWeb.Week4;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class CookieAServlet
*/
@WebServlet("/CookieAServlet")
public class CookieAServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = new Cookie("name", "liaoshui");
response.addCookie(cookie);
cookie = new Cookie("type", "cookie");
cookie.setMaxAge(60);
response.addCookie(cookie);
cookie = new Cookie("age", "20");
cookie.setMaxAge(3600);
response.addCookie(cookie);
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("send ID ,success!");
out.println("<a href='CookieBServlet'>show cookie</a>");
out.println("</body>");
out.println("</html>");
out.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
CookieBServlet:
package com.JavaWeb.Week4;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class CookieBServlet
*/
@WebServlet("/CookieBServlet")
public class CookieBServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cs[]= request.getCookies();//获取cookie对象
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
if(cs != null) {
out.println("send cookie ,success!");
for(Cookie c:cs) {
out.println("<br>cookie name:"+c.getName()+" cookie value:"+c.getValue());
}
}else {
out.println("Fail!!");
}
out.println("</body>");
out.println("</html>");
out.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
1.3 使用Cookie记录用户访问次数,当用户第5次访问时告诉他获得一份礼物。
测试结果:
源码:
package com.JavaWeb.Week4;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class CookieGiftServlet
* 使用Cookie记录用户访问次数,当用户第5次访问时告诉他获得一份礼物。
*/
@WebServlet("/CookieGiftServlet")
public class CookieGiftServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//取到cookie访问次数
Cookie cs[] = request.getCookies();
Cookie mycookie = null;//中间值,做更改用
boolean k = false;//状态标识
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
//取到cookie中的登陆参数
if (cs != null) {
for (Cookie c : cs) {// 循环
if (c.getName().equals("loginCount")) {
mycookie = c;
k = true;
}
}
} else {//第一个次访问会出现
//out.println("Cookie Is NULL! Get Cookies Fail!");
}
//更改登陆参数
int temp= 0;//记录登陆次数
if(k) { //登陆过
temp = Integer.parseInt(mycookie.getValue());
temp++;
mycookie.setValue(String.valueOf(temp));
if(temp==5)out.println("Congratulations!!!!!!!!!!! A gift is awaiting you.<br>");
}else { //未登陆过,没有名为loginCount的cookie
temp = 1;
mycookie = new Cookie("loginCount",String.valueOf(temp));
}
mycookie.setMaxAge(60*60*24*30);
out.println("欢迎你,你是第" + String.valueOf(temp) + "次访问本站点");
//将改变的值传回
response.addCookie(mycookie);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
1.4 正确登陆后将用户名的信息以Cookie形式写给客户端
修改之前的登录程序,当用用户名、密码正确登录成功时,将用户名的信息以Cookie的形式写给客户端,设置有效期是1个月,编写ShowServet查看这个Cookie的信息。
2. session
刷新不变。重开浏览器、服务器会变。
代码:
九、servlet跳转
1. 客户端跳转–重定向
2. 服务器端跳转–请求转发
十、servlet间数据共享
1.不同用户的页面的数据共享、同一个用户不同页面的数据共享
session数据不能被其他用户使用:
servlet1:
package com.JavaWeb.Week4;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class servlet1
*/
@WebServlet("/servlet1")
public class servlet1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().println("<html><body>");
//1.同一个用户不同页面的数据共享
//获取session
HttpSession session = request.getSession();
//充值
session.setAttribute("account", 1000);
response.getWriter().write("servlet1: your account is "+session.getAttribute("account").toString()+"<br>");
//2.不同用户的页面的数据共享
getServletContext().setAttribute("wash", 2000);
response.getWriter().write("servlet1: wash is "+getServletContext().getAttribute("wash").toString()+"<br>");
response.getWriter().println("</body></html>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
servlet2:
package com.JavaWeb.Week4;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class servlet2
*/
@WebServlet("/servlet2")
public class servlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().println("<html><body>");
//1.同一个用户不同页面的数据共享
HttpSession session = request.getSession();
if(session.getAttribute("account") != null) {
response.getWriter().write("servlet2: your account is "+session.getAttribute("account").toString()+"<br>");
}else {
response.getWriter().write("servlet2, account null!");
}
//2.不同用户的页面的数据共享
if(getServletContext().getAttribute("wash") != null) {
response.getWriter().write("servlet2: wash is "+getServletContext().getAttribute("wash").toString()+"<br>");
}else {
response.getWriter().write("servlet2, wash null!");
}
response.getWriter().println("</body></html>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
servlet3:
package com.JavaWeb.Week4;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class servlet3
*/
@WebServlet("/servlet3")
public class servlet3 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.getWriter().println("<html><body>");
// 1.同一个用户不同页面的数据共享
HttpSession session = request.getSession();
if (session.getAttribute("account") != null) {
response.getWriter().write("servlet3: your account is" + session.getAttribute("account").toString()+"<br>");
} else {
response.getWriter().write("servlet3, null!");
}
// 2.不同用户的页面的数据共享
if (getServletContext().getAttribute("wash") != null) {
response.getWriter().write("servlet3: wash is " + getServletContext().getAttribute("wash").toString() + "<br>");
} else {
response.getWriter().write("servlet3, wash null!");
}
response.getWriter().println("</body></html>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
2.服务器端跳转下的数据共享
servlet1:
package com.JavaWeb.Week4;
import java.io.IOException;
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 implementation class servlet11
*/
@WebServlet("/servlet11")
public class servlet11 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
// 3.服务器端跳转下的数据共享
request.setAttribute("info", "3");
request.getRequestDispatcher("servlet22").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
servlet2:
package com.JavaWeb.Week4;
import java.io.IOException;
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 implementation class servlet22
*/
@WebServlet("/servlet22")
public class servlet22 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//3.服务器端跳转下的数据共享
String info =null;
if(request.getAttribute("info") != null) {
info = request.getAttribute("info").toString();
response.getWriter().write("servlet22: info is "+request.getAttribute("info").toString());
}else {
response.getWriter().write("servlet22, info null!");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
十一、web3.0上传下载
upload.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form name="uploadform" method="post" action="../fileuploadServlet" enctype="multipart/form-data">
<h4>文件上传:<input type="file" name="uploadfile" value="" /></h4>
<input type="submit" value="提交" class="button" />
</form>
</body>
</html>
fileuploadServlet:
package com.JavaWeb.Week4Project;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
/**
* Servlet implementation class fileupload
*/
@WebServlet("/fileuploadServlet")
@MultipartConfig // 支持文件上传
public class fileuploadServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
// 上传
// 创建文件保存目录
File path = new File("F:\\JavawebFile");
if (!path.exists()) {
path.mkdir();
}
// 获取part对象
Part part = request.getPart("uploadfile");
// 获取文件名称1
// String filename = part.getSubmittedFileName();//无法获取文件名
// 获取文件名称2:获取请求头信息,从头信息中获取filename
String header = part.getHeader("content-disposition");
String filename = getFileName(header);
// 构建物理路径,将文件写入指定路径中
String filePath = path.getPath() + "\\" + filename;
part.write(filePath);
// 输出下载查看的链接
// 对文件名进行URL编码,因为放在了get方式的地址中:中文必须进行编码
String urlname = URLEncoder.encode(filename, "UTF-8");
response.getWriter().write("<h2>文件上传成功,请点击如下链接下载查看</h2>");
response.getWriter().write("<a href='DownloadfileServlet?file=" + urlname + "'>" + filename + "</a>");
}
private String getFileName(String header) {
/**
* String[] tempArr1 = header.split(";");
* 代码执行完之后,在不同的浏览器下,tempArr1数组里面的内容稍有区别
*
* 火狐或者google浏览器下:tempArr1={form-data,name="file",filename="snmp4j--api.zip"}
* IE浏览器下:tempArr1={form-data,name="file",filename="E:\snmp4j--api.zip"}
*/
String[] tempArr1 = header.split(";");
/**
* 火狐或者google浏览器下:tempArr2={filename,"snmp4j--api.zip"}
* IE浏览器下:tempArr2={filename,"E:\snmp4j--api.zip"}
*/
String[] tempArr2 = tempArr1[2].split("=");
//获取文件名,兼容各种浏览器的写法
String fileName = tempArr2[1].substring(tempArr2[1].lastIndexOf("\\") + 1).replaceAll("\"", "");
return fileName;
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
DownloadfileServlet::
package com.JavaWeb.Week4Project;
import java.io.FileInputStream;
import java.io.IOException;
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 implementation class DownloadfileServlet
*/
@WebServlet("/DownloadfileServlet")
public class DownloadfileServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取文件名--get方式:http://localhost:8080/Demo/DownloadfileServlet?file=xxx
String file = request.getParameter("file");//获取file
//获取文件路径
String filepath = "F:\\JavawebFile\\"+file;
//根据文件名称获取文件MIME类型,用于指定ContentType(文件类型)。告诉浏览器发送什么类型的数据。
String mimetype = getServletContext().getMimeType(file);
response.setContentType(mimetype);
// 设定Content-disposition属性值:文件下载浏览器后以什么方式打开。inline表示在浏览器内部直接打开文件,其他可以网上了解
response.setHeader("Content-disposition", "inline");
FileInputStream fis = new FileInputStream(filepath);
byte[] in = new byte[2048];
while (fis.read(in, 0, in.length) != -1) {
response.getOutputStream().write(in);
}
response.getOutputStream().flush();
fis.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
十二、实战–session登陆、注销功能(登陆后才能访问欢迎界面)
代码:
login.html
<body>
<form action="../SessionLoginServlet" method="post">
用户名<input type="text" name="username" /><br>
密码<input type="password" name="password" /><br>
<input type="submit" value="提交" />
</form>
</body>
loginservlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><body>");
String username = request.getParameter("username");
String password = request.getParameter("password");
HttpSession session = request.getSession();
if(username == null || username.equals("") || password == null || password.equals("")) {
out.println("用户名或密码为空,请 <a href='html/4sessionlogin.html'>重新输入</a>");
}
else if( !username.equals("admin") || !password.equals("123")) {
out.println("用户名或密码错误,请 <a href='html/4sessionlogin.html'>重新输入</a>");
}
else {
session.setAttribute("username", username);
response.setHeader("refresh","2;URL=SessionWelcomeServlet");//定时跳转
out.println("登陆成功,2秒后跳转到欢迎页面!");
out.println("<br>如果跳转失败,<a href='SessionWelcomeServlet'>请点击</a>");
}
out.println("<html><body>");
out.close();
}
welcomeservlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><body>");
HttpSession session = request.getSession();
if(session.getAttribute("username") == null) {
request.getRequestDispatcher("html/4sessionlogin.html").forward(request,response);//服务器端跳转
}
else {
out.println("欢迎到来,"+ session.getAttribute("username").toString() +"!<br>");
out.println("<a href='SessionLogoutServlet'>注销</a>");
}
out.println("<html><body>");
out.close();
}
logoutservlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><body>");
HttpSession session = request.getSession();
session.invalidate();//session失效
//请求转发
//request.getRequestDispatcher("html/4sessionlogout.html").forward(request, response);//乱码,why?
//跳转
response.setHeader("refresh","2;URL=html/4sessionlogout.html");//定时跳转
out.println("注销成功,2秒后显示注销提示!");
out.println("<br>如果跳转失败,<a href='html/4sessionlogout.html'>请点击</a>");
out.println("<html><body>");
out.close();
}
logout.html
<body>
<h1>欢迎再次访问</h1>
thank you !
</body>