目录
(2)Tomcat的安装与启动、调整项目(chapter05)的Tomcat配置
(3)不用手动导入servlet-api.jar包,项目(chapter05)中已经导入
第一个类:LastAccessServlet.java。按照书本P104~P105添加即可。
第二个类:ListCakeServlet.java。按照书本P110添加即可。
第三个类:PurchaseServlet.java。按照书本P110~P111添加即可。
第四个类:CartServlet.java。按照书本P111添加即可。
第五个类:IndexServlet.java。按照书本P113添加即可。
第六个类:LogoutServlet.java。按照书本P114添加即可。
(使用IDEA旗舰版(2024)完成)
一、IDEA中打开实训所需项目(chapter05)
(1)学习通下载部分源代码(需修改)
(第五章——>拿到项目"chapter05")
(2)在IDEA中打开该项目
二、配置实训项目(chapter05)的所需环境
(1)Java环境变量(选择合适的JDK版本)
- 检查自己的Java的jdk安装的版本(win+R),输入cmd,输入"java -version"。为了和tomcat版本相配,我把自己的JDK17更改成JDK1.8版本的。
- 具体详细的配置JAVA_HOME可以去看我之前写的博客,有详细介绍!
(2)Tomcat的安装与启动、调整项目(chapter05)的Tomcat配置
- 首先去资料找到对应的Tomcat下载版本(这里采用Tomcat8.5版本),然后解压,记住文件的位置(一般放到D盘)。
- 打开该目录,可以看到它其中的目录结构。
- 打开bin目录,找到startup.bat,双击它。它就是启动Tomcat的脚本文件。
- Tomcat服务器启动后,就可以去浏览器地址栏访问:"http://localhost:8080",去访问Tomcat服务器,若显示如下图所示,就表示安装成功了!!(不是https!!!)
- 若出现问题,可以去检查一下Java的jdk环境配置或者查看是否tomcat启动时默认端口号8080被系统占用,若被占用,可以去其安装目录下查看conf文件,用记事本编辑,修改其启动时的默认端口号变成(0~65535中的一个)(可以看书P56页)
- 现在打开之前已经在IDEA打开的项目(chapter05),调整该项目原来的Tomcat配置的位置路径,修改成上面安装的Tomcat8.5版本的安装路径。
(3)不用手动导入servlet-api.jar包,项目(chapter05)中已经导入
可以看到:web目录——>WEB-INF——>lib——>servlet.api.jar。这里项目的src爆红是因为你虽然
三、开始修改和填写src目录下代码
第一个类:LastAccessServlet.java。按照书本P104~P105添加即可。
import java.io.IOException; import java.net.URLDecoder; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; //注意注解 @WebServlet(name = "LastAccessServlet",urlPatterns = "/LastAccessServlet") public class LastAccessServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException { //指定服务器输出内容的编码方式UTF-8,防止发生乱码 response.setContentType("text/html;charset=utf-8"); //获取所有cookie Cookie[] cookies = request.getCookies(); //定义flag的boolean变量,用于判断cookies是否为空 boolean flag = false; //遍历cookie数组 if (cookies.length > 0 && cookies != null) { for (Cookie cookie : cookies) { //获取cookie的名称 String name = cookie.getName(); //判断名称是否有lastTime if ("lastTime".equals(name)) { //该cookie不是第一次访问 flag = true; //响应数据 //获取cookie的value时间 String value = cookie.getValue(); System.out.println("解码前:" + value); //URL解码 value = URLDecoder.decode(value, "utf-8"); System.out.println("解码后:" + value); response.getWriter().write("欢迎回来,您上次访问时间" + "为:" + value); //设置cookie的value //获取当前时间的字符串,重写设置cookie的值,发送给cookie Date date = new Date(); SimpleDateFormat timesdf = new SimpleDateFormat("yyyy年MM" + "月dd日 HH:mm:ss"); String str_time = timesdf.format(date); System.out.println("编码前:" + str_time); //URL编码 str_time = URLEncoder.encode(str_time, "utf-8"); System.out.println("编码后:" + str_time); cookie.setValue(str_time); //设置cookie存活时间 cookie.setMaxAge(60 * 60 * 24 * 30); //一个月 //加入当前cookie请求时间 response.addCookie(cookie); break; } } //如果cookies中没有时间,也就是没有访问过 if( cookies==null || cookies.length==0 || flag == false){ //设置cookie的value //获取当前时间的字符串;重写设置cookie的值,重新发送cookie Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日"+"HH:mm:ss"); String str_date = sdf.format(date); System.out.println("编码前:" + str_date); //URL编码 str_date=URLEncoder.encode(str_date, "utf-8"); System.out.println("编码后:" + str_date); Cookie cookie = new Cookie("lastTime", str_date); //设置cookie存活时间 cookie.setMaxAge(60 * 60 * 24 * 30);//一个月 response.addCookie(cookie); response.getWriter().write("您好,欢迎您首次访问"); } } } public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{ this.doPost(request,response); } }
第二个类:ListCakeServlet.java。按照书本P110添加即可。
package cn.itcast.session.servlet; import cn.itcast.session.entity.Cake; import cn.itcast.session.entity.CakeDB; import java.io.*; import java.util.Collection; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; @WebServlet(name = "ListCakeServlet",urlPatterns="/ListCakeServlet") public class ListCakeServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); PrintWriter out = resp.getWriter(); Collection<Cake> cakes = CakeDB.getAll(); out.write("本站提供的蛋糕有:<br>"); for (Cake cake : cakes) { String url = "PurchaseServlet?id=" + cake.getId(); out.write(cake.getName() + "<a href='" + url + "'>点击购买</a><br>"); } } }
第三个类:PurchaseServlet.java。按照书本P110~P111添加即可。
package cn.itcast.session.servlet; import cn.itcast.session.entity.Cake; import cn.itcast.session.entity.CakeDB; import java.io.IOException; import java.util.*; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; @WebServlet(name = "PurchaseServlet",urlPatterns="/PurchaseServlet") public class PurchaseServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 获得用户购买的商品 String id = req.getParameter("id"); if (id == null) { //如果id为null,重定向到ListCakeServlet页面 String url = "ListCakeServlet"; resp.sendRedirect(url); return; } Cake cake = CakeDB.getCake(id); // 创建或者获得用户的Session对象 HttpSession session = req.getSession(); //从Session对象中获得用户的购物车 List<Cake> cart = (List) session.getAttribute("cart"); if (cart == null) { // 首次购买,为用户创建一个购物车(List集合模拟购物车) cart = new ArrayList<Cake>(); // 将购物城存入Session对象 session.setAttribute("cart", cart); } // 将商品放入购物车 cart.add(cake); // 创建Cookie存放Session的标识号 Cookie cookie = new Cookie("JSESSIONID", session.getId()); cookie.setMaxAge(60 * 30); cookie.setPath("/Servlet"); resp.addCookie(cookie); // 重定向到购物车页面 String url = "CartServlet"; resp.sendRedirect(url); } }
第四个类:CartServlet.java。按照书本P111添加即可。
package cn.itcast.session.servlet; import cn.itcast.session.entity.Cake; import java.io.*; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; @WebServlet(name = "CartServlet",urlPatterns="/CartServlet") public class CartServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); PrintWriter out = resp.getWriter(); //变量cart引用用户的购物车 List<Cake> cart = null; //变量purFlag标记用户是否买过商品 boolean purFlag =true; //获取用户的session HttpSession session = req.getSession(false); //如果session为null,则purFlag置为false if(session == null){ purFlag = false; }else { //获取用户购物车 cart = (List) session.getAttribute("cart"); //如果用的购物车为null,则purFlag置为false if(cart == null){ purFlag = false; } } /* * 如果purFlag为false,表明用户没有购买蛋糕,则重定向到ListServlet页面 * */ if(!purFlag){ out.write("对不起!您还没有购买任何商品!<br>"); }else { //否则显示用户购买蛋糕的信息 out.write("您购买的当有:<br>"); double price = 0; for(Cake cake : cart){ out.write(cake.getName()+"<br>"); } } } }
第五个类:IndexServlet.java。按照书本P113添加即可。
package cn.itcast.session.servlet; import cn.itcast.session.entity.User; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; @WebServlet(name = "IndexServlet",urlPatterns="/IndexServlet") public class IndexServlet extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { // 解决乱码问题 response.setContentType("text/html;charset=utf-8"); // 创建或者获取保存用户信息的Session对象 HttpSession session = request.getSession(); User user = (User) session.getAttribute("user"); if (user == null) { response.getWriter().print("您还没有登录,情<a href='/chapter05/login.html'>登录</a>"); } else { response.getWriter().print("您已登录,欢迎你," + user.getUsername() + "!"); response.getWriter().print( "<a href='/chapter05/LogoutServlet'>退出</a>"); // 创建Cookie存放Session的标识号 Cookie cookie = new Cookie("JSESSIONID", session.getId()); cookie.setMaxAge(60*30); cookie.setPath("/chapter05"); response.addCookie(cookie); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
第六个类:LogoutServlet.java。按照书本P114添加即可。
package cn.itcast.session.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; @WebServlet(name = "LogoutServlet",urlPatterns="/LogoutServlet") public class LogoutServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 将Session对象中的User对象移除 request.getSession().removeAttribute("user"); response.sendRedirect("/chapter05/IndexServlet"); } public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { doGet(request, response); } }
最后一个修改登录界面:login.html。按照书本P115添加即可。
<html> <head> <meta charset="UTF-8"> <meta http-equiv="Content-Type" content="text/html"> <title>Title</title> </head> <body> <form name="reg" action="http://localhost:8080/chapter05/LoginServlet" method="post"> 用户名:<input name="username" type="text"/><br/> 密码:<input name="password" type="password"/><br/> <input type="submit" value="提交" id="bt"/> </form> </body> </html>
四、最后对应实训要求,所需的各个截图(请勿直接复制拿去提交!)
(1)访问地址:http://localhost:8080/chapter05/LastAccessServlet
(2)第二次访问该地址
(3)访问http://localhost:8080/chapter05/ListCakeServlet
(4)点击购买A类蛋糕
(5)访问http://localhost:8080/chapter05/login.html
(6)输入正确的账号和密码(itcast,123)
(7)退出登录