栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JavaWeb学习+实例代码

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JavaWeb学习+实例代码

前言

会根据学习进度持续更新,觉得写的不错的可以收藏跟进。不足之处可以评论
编辑器:IDEA
JDK:11
Tomcat:9.0.54
数据库:MySQL 8.0

目录
  • 前言
  • 一、 Servlet配置
  • 二、 Servlet应用
    • 1. 处理数据请求
      • 1.1. 超链接
      • 1.2. Form表单
    • 2. 重定向与请求转发
      • 2.1. 重定向
      • 2.2. 请求转发
      • 2.3 对数据的存取
      • 2.4 重定向与请求转发区别
  • 三、 Servlet接口
    • 1. Config接口
    • 2. Context接口
    • 3. Request接口
    • 4. Response接口
  • 四、 会话跟踪
    • 1. cookie
    • 2. Session
    • 3.URL重写技术应用
    • 4. 隐藏表单域
  • 五、 JSP
    • 1. JSP基础
      • 1.1 JSP与Servlet
      • 1.2. JSP基本结构

一、 Servlet配置

声明Servlet

  • 3.0以后以注解为准

@WebServlet(name = "类名,可以不写",urlPatterns = "/类名url")

二、 Servlet应用 1. 处理数据请求
  • 请求数据方式:超链接和Form表单
1.1. 超链接
  • 超链接一般用于获取/查询资源,属于get类型。数据会依附在URL之后,以?分割URL和传输数据,参数之间以&相连
    • 缺点:安全性差,长度限制
1.2. Form表单
  • Form用于更新资源信息,默认使用GET类型,多使用POST类型。由于POST请求类型理论上没有数据大小限制,可用表单来传比较大的数据
2. 重定向与请求转发 2.1. 重定向
  • 用HttpServletResponse对象的sendRedirect()实现

    • 可以指定到任意页面

    实现类

    @WebServlet(name = "RedirectServlet",urlPatterns = "/RedirectServlet")
    public class RedirectServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("utf-8");
            resp.setContentType("text/html;charset=utf-8");
            resp.sendRedirect("/RedirectTest");
            resp.getWriter().println("redirect test重定向测试");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    

    测试类

    @WebServlet(name = "RedirectTest",urlPatterns = "/RedirectTest")
    public class RedirectTest extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("utf-8");
            resp.setContentType("text/html;charset=utf-8");
            PrintWriter pw = resp.getWriter();
            pw.println("successful成功");
        }
    
        @Override
        protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
2.2. 请求转发
  • 请求转发不能指定任意地址

实现类如下,测试类为RedirectTest

@WebServlet(name = "ForwardServlet",urlPatterns = "/ForwardServlet")
public class ForwardServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        req.getRequestDispatcher("/RedirectTest").forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
  • Forward与include区别
    • Forward以请求页面为主体,请求另一个页面
    • include把请求页面发回Servlet再次请求另一个页面,Servlet为主体
    • 响应结果都是请求页。
2.3 对数据的存取
  • 重定向不传输数据,请求转发传输数据

实现类

@WebServlet(name = "ForwardAttributeServlet",urlPatterns = "/ForwardAttributeServlet")
public class ForwardAttributeServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        req.setAttribute("objname","jing");
        req.getRequestDispatcher("/ResultTest").forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
@WebServlet(name = "RedirectAttributeServletServlet",urlPatterns = "/RedirectAttributeServlet")
public class RedirectAttributeServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        req.setAttribute("objname","jing");
        resp.sendRedirect("/ResultTest");
        resp.getWriter().println("redirect test重定向测试");

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

测试类

@WebServlet(name = "ResultTest",urlPatterns = "/ResultTest")
public class ResultTest extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter pw = resp.getWriter();
        String obj = (String) req.getAttribute("objname");
        pw.println("

result

"); pw.println("

obj name is

"+ obj); } @Override protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
2.4 重定向与请求转发区别 三、 Servlet接口 1. Config接口
  • 一个Servlet有一个Config接口

  • 获取参数和对象方法

    1. 重写GenericServlet的init()方法,通过初始化init()方法传递过来的ServletConfig对象获取
    public void init(ServletConfig config) throws ServletException {
            super.init(config);
            String username = config.getInitParameter("username");
            String password = config.getInitParameter("password");
            System.out.println("账号:"+username+"t密码"+password);
        }
    
    1. 直接调用GenericServlet里的getServletConfig()方法获取 (常用方法)
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletConfig config = getServletConfig();
        String username = config.getInitParameter("username");
        String password = config.getInitParameter("password");
        System.out.println("账号:"+username+"t密码"+password);
    }
    
2. Context接口
  1. 获取应用初始化参数,在xml里进行配置,Context会读取这些配置存在ServletContext对象中
  • 实例
public class ContextInitParaServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        ServletContext context = getServletContext();
        String website = context.getInitParameter("website");
        String email = context.getInitParameter("email");
        PrintWriter out = resp.getWriter();
        out.println("jingjiu个人主页地址:" + website + "
"); out.println("jignjiu邮箱:" + email ); Enumeration paramNames = context.getInitParameterNames(); out.println("
"); while ((paramNames.hasMoreElements())){ out.println(paramNames.nextElement()+" "); } } }
 
        website
        http://jingjiu.itdage.cn/u.html?userid=30
    

    
        email
        lybhlh@163.com
    

  1. 应用域:ServletContext可以理解为容器内的一个共享空间,可以存放应用级别作用域的数据,web组件都可以共享这些数据,数据以键值对形式存在
  • 例子:网站计数
public class ContextAttributeServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //创建Context对象
        ServletContext context = getServletContext();
        Integer vistedcount = (Integer) context.getAttribute("vistedcount");
        if(vistedcount == null){
            vistedcount = 1;
        }else {
            vistedcount += 1;
        }
        //设置值
        context.setAttribute("vistedcount", vistedcount);
        //创建值
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date = sdf.format(new Date());
        //输出
        PrintWriter out = resp.getWriter();
        out.println("

当前网站被访问次数:"+vistedcount+"

"); out.println("

本次访问时间:"+date+"

"); } }
  1. 获取应用信息
public class ContextInfoServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        ServletContext context = getServletContext();
        String contextPath = context.getContextPath();//返回根路径
        String servletcontextname = context.getServletContextName();//servlet设置名称
        String servletInfo = context.getServerInfo();//web容器版本名称
        String version = context.getMajorVersion() + "-" + context.getMajorVersion();//获取API主次版本号
        context.log("自定义日志信息");
        context.log("自定义错误",new Exception("异常堆栈信息"));

        PrintWriter out = resp.getWriter();
        out.println("当前web应用上下文(当前项目)根路径:" + contextPath + "
"); out.println("当前servlet设置的显示名称:" + servletcontextname + "
"); out.println("当前web容器名称、版本:" + servletInfo + "
"); out.println("支持Servlet API主、次版本号:" + version); } }
3. Request接口
  • 部分常用方法
public class RequestLineServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //获取请求Http的方法
        String method = req.getMethod();
        //获取请求中资源名部分
        String url = req.getRequestURI();
        //获取协议版本号
        String protocol = req.getProtocol();
        //获取请求URL后面查询的字符串
        String queryStr = req.getQueryString();
        //获取当前请求的Servlet路径
        String servletPath = req.getServletPath();
        //获取请求资源所属的web路径
        String contextPath = req.getContextPath();
        String serverName = req.getServerName();
        int serverPort = req.getServerPort();
        String scheme = req.getScheme();
        PrintWriter out = resp.getWriter();
        out.println("

获取请求Http的方法:"+ method + "

"); out.println("

获取请求中资源名部分:"+ url + "

"); out.println("

获取协议版本号:"+ protocol + "

"); out.println("

获取请求URL后面查询的字符串:"+ queryStr + "

"); out.println("

获取当前请求的Servlet路径:"+ servletPath + "

"); out.println("

获取请求资源所属的web路径:"+ contextPath + "

"); out.println("

获取网站域名:" + serverName + "

"); out.println("

获取端口号:" + serverPort + "

"); out.println("

获取请求协议:" + scheme + "

"); } }
4. Response接口
  • Http响应报文

    • 1xx:表示信息,服务器收到请求,需要请求者继续执行操作
    • 2xx:表示请求已经成功被服务器接收
    • 3xx:表示需要客户端进一步操作才能完成请求
    • 4xx:客户端错误,请求包含语法错误或者无法完成请求
    • 5xx:服务器在处理请求过程中有错误或者异常状态发生,也可能服务器意识到无法完成对请求的处理
  • 设置响应头

    • 实例:利用refresh制作一个动态时钟

    • public class ResponseRefreshServlet extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              req.setCharacterEncoding("utf-8");
              resp.setContentType("text/heml;charset=utf-8");
              resp.setHeader("Course","JavaWeb");
              resp.setHeader("refresh","1");
              PrintWriter out = resp.getWriter();
              SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
              out.println(sdf.format(new Date()));
          }
      }
      
  • 中文输出:setCharacterEncoding()与setContentType()区别

    • setCharacterEncoding()只能设置PrintWriter输出流中字符的编码方式,优先权最高
    • setContentType()既可以设置PrintWriter输出流中字符的编码方式,也可以设置浏览器接收到这些字符后以什么编码方式来解码
  • 实例:输出一张图片(图片放在webapp文件夹下)

public class OutputStreamServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("image/png");
        ServletContext context = getServletContext();
        InputStream is = context.getResourceAsStream("/image/picture.jpg");
        ServletOutputStream sos = resp.getOutputStream();
        int i = 0;
        while ((i = is.read())!= -1){
            sos.write(i);
        }
    }
}
四、 会话跟踪 1. cookie
  • cookie构造方法需要两个参数
    • String类型指定cookie的属性名
    • String类型指定属性值

示例cookie unamecookie = new cookie("username","jingjiu");

  • addcookie()

    • 参数为一个cookie对象
    • 通过此方法增加"Set-cookie"响应头的方式将cookie对象响应给客户端浏览器,储存在客户端机器上
    • 生成的cookie仅在当前浏览器有效
  • 储存在客户端的cookie通过getcookies()方法获取,返回所访问网站的所有cookie的对象数组,遍历该数组可以获得各个cookie对象

    实例:

@WebServlet(name = "cookieExampleServlet", urlPatterns = "/cookieExampleServlet")
public class cookieExampleServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        int visitedCount = 0;//访问次数
        String lastVisTime = "";//访问时间
        cookie[] cookie = req.getcookies();
        if (cookie != null) {
            for (cookie cookies : cookie) {
                if ("visitedCount".equals(cookies.getName())) {
                    visitedCount = Integer.valueOf(cookies.getValue());
                }
                if ("lastVisTime".equals(cookies.getName())) {
                    lastVisTime = cookies.getValue();
                }
            }
        }
        PrintWriter out = resp.getWriter();
        if (!"".equals(lastVisTime)) {
            out.println("上一次访问时间:" + lastVisTime);
        }
        out.println("第" + (visitedCount + 1) + "次访问此网站");
        cookie visitCountC = new cookie("visitedCount", String.valueOf(visitedCount + 1));
        resp.addcookie(visitCountC);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-ddHH:mm:ss");
        cookie lastVisTimeC = new cookie("lastVisTime", sdf.format(new Date()));
        resp.addcookie(lastVisTimeC);
    }
}
  • cookie有存活时间,默认在关闭浏览器时失效。若要长时间保存,使用setMaxAge()方法设置存活时间,保存在磁盘上的cookie称为持久cookie

缺点:

  1. cookie可能被禁用
  2. 不同浏览器不能互相访问
  3. 可能被用户删除
  4. 大小个数受限,单个cookie不能超过4k,一个站点最多保存20个cookie
2. Session
  • Session使用HttpSession对象实现会话跟踪技术,在服务器端保持会话跟踪。

  • HttpSession对象会在用户第一次访问服务器时由容器创建,用来保存单个用户访问时的一些信息

  • 实现简单的购物车功能

    • html

    • 
      
      
          
          书籍选购
      
      
      

      JavaEE应用与开发

      JavaEE从入门到放弃

      数据库应用与开发

      Spring框架

    • ShoppingCarServlet

    • @WebServlet(name = "ShoppingCarServlet", urlPatterns = "/ShoppingCarServlet")
      public class ShoppingCarServlet extends HttpServlet {
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              req.setCharacterEncoding("utf-8");
              resp.setContentType("text/html;charset=utf-8");
      
              //获取Session
              HttpSession session = req.getSession();
              Map car = (Map) session.getAttribute("ShopCar");
              if (car == null) {
                  car = new HashMap();
              }
              //获取用户选择的书籍信息
              String[] books = req.getParameterValues("book");
              if (books != null && books.length > 0) {
                  for (String b : books) {
                      //根据书名(map中的key)判断此书是否在购物车
                      if (car.get(b) != null) {
                          int num = car.get(b);
                          car.put(b, num + 1);
                      } else {
                          car.put(b, 1);
                      }
                  }
              }
              session.setAttribute("ShopCar",car);
              resp.sendRedirect("ShoppingListServlet");
          }
      }
      
    • ShoppingListServlet

    • @WebServlet(name = "cookieExampleServlet", urlPatterns = "/cookieExampleServlet")
      public class cookieExampleServlet extends HttpServlet {
      
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              req.setCharacterEncoding("utf-8");
              resp.setContentType("text/html;charset=utf-8");
      
              int visitedCount = 0;//访问次数
              String lastVisTime = "";//访问时间
              cookie[] cookie = req.getcookies();
              if (cookie != null) {
                  for (cookie cookies : cookie) {
                      if ("visitedCount".equals(cookies.getName())) {
                          visitedCount = Integer.valueOf(cookies.getValue());
                      }
                      if ("lastVisTime".equals(cookies.getName())) {
                          lastVisTime = cookies.getValue();
                      }
                  }
              }
              PrintWriter out = resp.getWriter();
              if (!"".equals(lastVisTime)) {
                  out.println("上一次访问时间:" + lastVisTime);
              }
              out.println("第" + (visitedCount + 1) + "次访问此网站");
              cookie visitCountC = new cookie("visitedCount", String.valueOf(visitedCount + 1));
              resp.addcookie(visitCountC);
              SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-ddHH:mm:ss");
              cookie lastVisTimeC = new cookie("lastVisTime", sdf.format(new Date()));
              resp.addcookie(lastVisTimeC);
          }
      }
      
3.URL重写技术应用
  • 对应用所有的请求都重写才能将jsessionid 1维持下来
  • URL地址必须为动态请求地址
4. 隐藏表单域
  • 可以完全脱离浏览器对cookie的使用限制,在用户无法从页面显示看到隐藏标识的情况下,将标识随请求一起传送给服务器处理,实现会话跟踪。
五、 JSP 1. JSP基础 1.1 JSP与Servlet
  • JSP是一种服务器端脚本语言,降低了Servlet编写页面的难度,本质上就是一种Servlet
1.2. JSP基本结构
  • JSP包含3种元素
    • 脚本元素

      • 脚本<%%>
        表达式<%=%>
        声明<%!%>
        注释<%-- --%>
        
    • 指令元素

      • <%@page %>导入包,指明输出内容类型,控制Session
        <%@include file="文件" %>在页面翻译期间引入另一个文件,新文件不能和当前文件定义同名变量
        <%@taglib uri="标签库URI" prefix="标签前缀"%>
        
    • 动作元素

      • 引入文件
        把请求转发到另一个页面
        用于查找或者实例化一个JavaBean
        用于设置JavaBean的属性
        用于输出某个JavaBean的属性
        

  1. 追加的会话标识,服务器通过它来之别跟踪某个用户的访问 ↩︎

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/606113.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号