开发Java Web项目基础储备

news2024/12/28 21:51:47

大家好,我是邵奈一,一个不务正业的程序猿、正儿八经的斜杠青年。
1、世人称我为:被代码耽误的诗人、没天赋的书法家、五音不全的歌手、专业跑龙套演员、不合格的运动员…
2、这几年,我整理了很多IT技术相关的教程给大家,爱生活、爱分享。
3、如果您觉得文章有用,请收藏,转发,评论,并关注我,谢谢!
博客导航跳转(请收藏):邵奈一的技术博客导航
| 公众号 | 微信 | CSDN | 掘金 | 51CTO | 简书 | 微博 |

文章内容

    • 一、开发工具
    • 二、配置文件参考
        • 1、pom.xml 依赖版本
        • 2、web.xml 文件参考
    • 三、前后端数据交互
        • 1、发送数据到后端
        • 2、后端接受前端传过来的数据
        • 3、执行完后端代码跳转页面
        • 4、后端传数据给前端
        • 5、前端接收后端传过来的数据
        • 6、一些其他特性
    • 三、运行项目

本文章主要是讲解一下开发Java Web项目所需要的一些基础储备,注意,这里的Java Web指的是我们学习Java Web最基础的内容,比如JSP、Servlet、Tomcat等等,而不是SSM、SpringBoot这些框架应用,这些内容以后有机会可以再补上。

一、开发工具

IDEA专业版or社区版?
可以使用IDEA专业版或者社区版,如果是专业版的话,开发起来会相对简单很多,因为内置了Tomcat选项,如果是社区版,其实是没有Tomcat选项的,也就是说无法直接结合Tomcat到编辑器中,但是我们可以通过添加插件的方式来实现(直接在插件中搜tomcat即可看到,建议安装Smart Tomcat),然后还得下载Tomcat,因为版本也比较高了,建议也不要用太高,我用的是Tomcat9。此外,如果使用社区版本,其实是无法新建Java Web项目的,所以需要将普通的项目转化成Java Web项目,可以使用插件来实现(安装JBLJavaToWeb,装好后右击选择则可自动添加webapp目录及web.xml文件)。如果是使用专业版本,直接新建一个Java Web项目就可以了(参考教程:0x02 初始化工程)。

二、配置文件参考

1、pom.xml 依赖版本

完整pom.xml文件可参考如下(仅适合开发简单的增删改查功能):

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  <modelVersion>4.0.0</modelVersion>  
  <groupId>com.javaweb</groupId>  
  <artifactId>mymall</artifactId>  
  <version>1.0-SNAPSHOT</version>  
  <packaging>war</packaging>  
  <properties> 
    <maven.compiler.source>11</maven.compiler.source>  
    <maven.compiler.target>11</maven.compiler.target>  
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
  </properties>
  <dependencies> 
    <!--Servlet 依赖-->  
    <dependency>
      <groupId>javax.servlet</groupId>  
      <artifactId>javax.servlet-api</artifactId>  
      <version>4.0.1</version>  
      <!--<scope>provided</scope>-->
    </dependency>  
    <!--JSP 依赖-->  
    <dependency> 
      <groupId>javax.servlet.jsp</groupId>  
      <artifactId>javax.servlet.jsp-api</artifactId>  
      <version>2.3.3</version> 
    </dependency>  
    <!--JSTL 表达式的依赖-->  
    <!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api -->  
    <dependency> 
      <groupId>javax.servlet.jsp.jstl</groupId>  
      <artifactId>jstl-api</artifactId>  
      <version>1.2</version> 
    </dependency>  
    <!--standard标签库-->  
    <!-- https://mvnrepository.com/artifact/taglibs/standard -->  
    <dependency> 
      <groupId>taglibs</groupId>  
      <artifactId>standard</artifactId>  
      <version>1.1.2</version> 
    </dependency>  
    <!--添加MySQL依赖-->  
    <dependency> 
      <groupId>mysql</groupId>  
      <artifactId>mysql-connector-java</artifactId>  
      <version>8.0.30</version> 
    </dependency> 
  </dependencies>  
  <!--配置阿里云远程镜像仓库-->  
  <repositories> 
    <repository> 
      <id>nexus-aliyun</id>  
      <name>Nexus aliyun</name>  
      <url>https://maven.aliyun.com/repository/public</url>  
      <layout>default</layout>  
      <snapshots> 
        <enabled>false</enabled> 
      </snapshots>  
      <releases> 
        <enabled>true</enabled> 
      </releases> 
    </repository> 
  </repositories>
</project>

2、web.xml 文件参考

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_4_0.xsd"
	version="4.0">
	<welcome-file-list>
		<welcome-file>login.jsp</welcome-file>
	</welcome-file-list>
</web-app>

welcome-file-list 定义的是欢迎页面,即首次启动打开的是什么页面。

三、前后端数据交互

前端页面可以传递数据给后端,后端拿到后可以进行相应的校验等,比如登录功能实现。

1、发送数据到后端

登录时候,需要输入用户名、密码和角色。
login.jsp 核心代码为:

<div style="text-align:center;margin-top:120px">
    <h1>登录页面</h1>
    <form action="/login" method="post">
        <table style="margin-left:40%">
            <tr>
                <td>用户名:</td>
                <td><input type="text" size="21" name="username"/></td>
            </tr>
            <tr>
                <td>密码:</td>
                <td><input type="text" size="21" name="password"/></td>
            </tr>
            <tr>
                <td>角色:</td>
                <td>
                    <input type="radio" name="role" value="0" checked="checked">管理员
                    <input type="radio" name="role" value="1">普通用户
                </td>
            </tr>
        </table>
        <input type="submit" value="登录"/>
        <input type="reset" value="重置"/>
    </form>
    <a href="register.jsp">跳转注册</a>
</div>

2、后端接受前端传过来的数据

提交到后台的LoginServlet文件,URL为:/login ,方式是post方式:

核心代码为:

@WebServlet(urlPatterns = "/login")
public class LoginServlet extends HttpServlet {

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

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

        // 获取前端页面传过来的值
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String role = req.getParameter("role");

        // 执行查询数据库逻辑
        UserDao userDao = new UserDaoImpl();
        User user = userDao.login(username, password);

        // 如果根据用户名和密码能查得到值
        if (user != null) {
            int roleDb = user.getRole();
            // 权限的选择跟数据库不匹配时,且不是管理员用户时,返回无权限
            if (roleDb != Integer.parseInt(role) && roleDb != 0) {
                req.setAttribute("message", "无权限登录");
                req.getRequestDispatcher("defeat.jsp").forward(req,resp);
            } else {
                req.setAttribute("user", user);
                req.getRequestDispatcher("success.jsp").forward(req,resp);
            }
        } else {    // 用户名或者密码错误执行以下代码
            req.setAttribute("message", "用户名或者密码错误");
            req.getRequestDispatcher("defeat.jsp").forward(req,resp);
        }

    }
}

String username = req.getParameter(“username”);
String password = req.getParameter(“password”);
String role = req.getParameter(“role”);
这样就可以让后端接收到了。

3、执行完后端代码跳转页面

执行完后跳转的页面为:
req.getRequestDispatcher(“success.jsp”).forward(req,resp);

4、后端传数据给前端

如果需要设置值到页面,则可以通过这样的方式设置上:
req.setAttribute(“user”, user);

5、前端接收后端传过来的数据

那设置给 success.jsp 页面的值怎么接受并显示到页面呢?
参考 success.jsp 的核心代码:

<%@ page import="com.shaonaiyi.mymall.domain.User" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: shaonaiyi
  Date: 2022/3/6
  Time: 14:59
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录成功</title>
</head>
<body>
<div style="text-align:center;margin-top:120px">
    <h1>登录成功!</h1>
    <br>
    <font color="red">
        <%
            User user = (User)request.getAttribute("user");
            String username = user.getUsername();
        %>
        欢迎您:
        <%
            out.print(username);
        %>
    </font>
    <form action="/query" method="post">
        <table style="margin-left:40%">
            <tr>
                <td>用户名:</td>
                <td><input type="text" size="21" name="username" readonly="readonly" value="${user.username}"/></td>
            </tr>
            <tr>
                <td>密码:</td>
                <td><input type="text" size="21" name="password" readonly="readonly" value="${user.password}"/></td>
            </tr>
            <tr>
                <td>角色:</td>
                <td>
                <c:if test="${user.role == 0}">
                    <input type="radio" name="role" value="0" checked="checked">管理员
                </c:if>
                <c:if test="${user.role == 1}">
                    <input type="radio" name="role" value="1" checked="checked">普通用户
                </c:if>
                </td>
            </tr>
        </table>
        <input type="submit" value="管理员跳转用户管理按钮"/>
    </form>
</div>
</body>
</html>

通过这样的符号就包起来,就可以使用java代码啦!

<%
    User user = (User)request.getAttribute("user");
    String username = user.getUsername();
%>

需要注意的是,如果需要使用java代码,需要单独隔开,包括{}号也要单独隔开,特别是在for循环或者if语句的时候,可能会需要用到(所以说,还是有点难看的其实…)

6、一些其他特性

<c:if test="${user.role == 1}">
    <input type="radio" name="role" value="1" checked="checked">普通用户
</c:if>

c:if 可以判断,test进行判断,如果里面的内容是真,则显示里面的内容。

同时,有点需要特别关注的是,如果需要引入类,则可以使用这样的方式进行引入:
<%@ page import=“com.shaonaiyi.mymall.domain.User” %>

如果需要用到c:if这样的标签,其实也是需要引入进来的:
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
这样才可以使用,否则会报错。

三、运行项目

运行项目很简单,直接跑就可以,可能需要设置一下Deployment directory,如果需要设置的话,设置成webapp这个文件夹就可以了,如下图所示:

在这里插入图片描述
感谢看完,想要学习更多有用的知识,请关注我,我可能是个有用的人!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/95339.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

互联网寒冬下奇葩公司行为艺术一览!你就是想笑死我继承我的代码

干货不少&#xff0c;有图有真相&#xff0c;大家慢慢看下去&#xff01; 既然创业&#xff0c;我为什么不自己当老板&#xff0c;要去给你当合伙人&#xff1f;是为了那1K-2K的高薪吗&#xff1f; 这招的不是高级工程师与合伙人&#xff0c;招的怕不是个傻子&#xff01; 有…

[激光原理与应用-58]:激光器 - 光学 - 常见光学镜片的特性

目录 一、纯度 二、透明度与透光率 三、均匀度 四、折射率 五、色散率 六、反射率 七、透光率 八、光线吸收率 一、纯度 光学纯度又称旋光纯度。 二、透明度与透光率 透光率&#xff0c;表示光线透过介质的能力&#xff0c;是透过透明或半透明体的光通量与其入射光…

域名停靠(域名抢注的几种形式)

域名停靠,又叫域名停放。简单来说,就是将具有一定流量的优质域名交给域名停靠服务商管理,让他们在你的域名上面投放广告。 “域名停靠”来自于英文Domain Name Parking&#xff0c;简称DNParking&#xff0c;也称域名停放。如果您有一个理想的域名或者带有流量&#xff08;即&…

杂七杂八的网络安全知识

杂七杂八的网络安全知识 博客链接&#xff1a;https://www.blog.23day.site/articles/81 一、信息安全概述 1.信息与信息安全 信息与信息技术 信息奠基人&#xff1a;香农&#xff1a;信息是用来消除随机不确定性的东西 信息的定义&#xff1a;信息是有意义的数据&#xff…

python采集付费论文批量下载 并保存到文档,毕设论文再也不愁......

嗨害大家好鸭&#xff01; 我是小熊猫鸭~ 大家是不是在写毕业论文的时候 需要参考某一段的内容 要用到复制粘贴&#xff0c;但是吧&#xff0c;某文库就需要付费&#xff0c; 就老难受了… 我们今天就来解决这个"老难受" 环境使用&#xff1a; python 3.8 pych…

2021年全球区块链投融资概况 美国融资量最多 数字资产相关领域依旧火热

据不完全统计&#xff0c;2021年&#xff0c;全球区块链产业共发生1812笔融资事件&#xff0c;从月度投资量来看&#xff0c;3月和4月投资量均达200笔以上&#xff0c;3月数量最多为239笔&#xff0c;其次是4月数量为214笔。1月和2月则获投量最少&#xff0c;均不达100笔&#…

怎么写一个树形穿梭框

图片懒加载基本原理 所谓图片懒加载&#xff0c;就是需要展示图片的时候再加载&#xff0c;当图片没有进入我们的视觉范围内的时候&#xff0c;图片还没有加载&#xff0c;只用一个占位符或者 loading 图片替代。当我们滚动页面时&#xff0c;占位符或者 loading 图片进入到我…

[附源码]Python计算机毕业设计Django绿色生活交流社区网站

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

部门来了个测试开发,听说是培训生,上来一顿操作给我看呆了...

&#x1f4cc; 博客主页&#xff1a; 程序员二黑 &#x1f4cc; 专注于软件测试领域相关技术实践和思考&#xff0c;持续分享自动化软件测试开发干货知识&#xff01; &#x1f4cc; 公号同名&#xff0c;欢迎加入我的测试交流群&#xff0c;我们一起交流学习&#xff01; 前段…

大数据呀大数据

大数据 啥是大数据? 我自己的一些经历–>>在做代码开发之前,一直觉得大数据这件事是高大上的一门学问,门槛很高,而且我上大学的时候这个词才刚刚在众多互联网记住中展露头角; 我的个人经历–>> 我上大学时那时候安卓的版本才到安卓4.4,在智能手机出来普及以前,各…

STM32 10个工程实战前言

从今年2022年元旦开通博客到现在基本接近一年了&#xff0c;真的会感到感觉时间飞逝&#xff0c;尤其当你全身心地投入一件工作上时&#xff0c;在FPGA基础篇和FPGA 20个经理例程篇后&#xff0c;又准备了STM32基础篇和STM32 10个工程实战篇&#xff0c;前两者即将收尾&#xf…

外汇天眼:欧洲央行加息50基点!加息的步伐将会放缓

欧洲央行(European Central Bank)在周四的会议上选择小幅加息&#xff0c;将基准利率从1.5%上调至2%。而其主要再融资操作和边际贷款工具的借贷成本分别升至2.50%和2.75%。 它还表示&#xff0c;从2023年3月初开始&#xff0c;到2023年第二季度末&#xff0c;它将开始平均每月减…

付费视频被人薅走?了解一下hls视频加密

前言 作者现在主要负责的项目是通过音视频等课程提高教师职业能力的&#xff0c;说白了就是给老师卖课赚钱。大家都知道知识付费现在还是很火的&#xff0c;既然是要付费的知识&#xff0c;就肯定有人想白嫖&#xff0c;直接去下载课程里面音视频。业界就有很多工具&#xff0…

世界杯观赛调研公布: Z世代消费者首选海信电视

2022世界杯决赛在即&#xff0c;作为观赛主体的Z世代迎来了四年一度的足球狂欢季。12月12日&#xff0c;市场研究机构千趣GKURC&#xff08;关键用户调查研究中心&#xff09;发布了《Z世代2022世界杯观赛和消费行为特征》调查报告&#xff08;以下简称报告&#xff09;。 报告…

图解设计模式:Teamplate Method 模板方法模式 由子类实现具体内容的模式

前言 &#x1f4e3; &#x1f4e3; &#x1f4e3; &#x1f4e2;&#x1f4e2;&#x1f4e2; ☀️☀️点开就是缘分认识一下&#xff0c;我是小冷。是一个兴趣驱动自学练习两年半的的Java工程师。 &#x1f4d2; 一位十分喜欢将知识分享出来的Java博主⭐️⭐️⭐️&#xff0c;…

ChatGPT的博弈:一场猫捉老鼠的游戏画上句号

前言 上周日我在B站发了个视频(https://www.bilibili.com/video/BV1Ud4y1e7BP)&#xff0c;本来想水一期的(毕竟一个半月没更新了)&#xff0c;不过借着ChatGPT的热度&#xff0c;播放量突破2w。 随之而来的是大批网友涌入群聊&#xff0c;想测验一下ChatGPT的性能&#xff0…

手把手教你在Ubuntu定制文件系统

为了给客户的测试和开发提供便利&#xff0c;飞凌嵌入式的开发板产品一般都支持多种操作系统&#xff0c;以基于全志T507H处理器设计研发的OKT507-C开发板为例&#xff0c;它支持三种操作系统&#xff0c;分别是&#xff1a;Linux、Android 和 Forlinx Desktop&#xff08;Ubun…

招聘惊现997工作要求!HR:因为下班比较晚,所以公司一般不加班

对于程序员来说&#xff0c;加班就像阳光和空气&#xff0c;实在是太正常不过的事情了。 就算本身并不是需要加班的公司&#xff0c;在项目上线的前夕多多少少肯定还是需要加一些班的&#xff01; 但是&#xff0c;下面这家公司就不一样了&#xff0c;直言公司就是997工作制……

Centos 配置磁盘加密(crypt-disk)

文章目录 Crypt-disk 创建一块新的磁盘,启用磁盘加密,解锁密码为“CSK2022!”; 映射到/dev/mapper/crypt 分区,并挂载到/mut/crypt 目录。一、去虚拟机添加一块磁盘二、安装cryptsetup2.对/dev/sdb 进行加密操作3.映射加密磁盘4.格式化5.挂载到到/mut/crypt 目录。题目 Cry…

Pytest测试框架(二):fixture 方法等相关操作--自定义测试用例的前置后置条件

pytest中的fixture&#xff1a; fixture是pytest特有的功能&#xff0c;它用pytest.fixture标识&#xff0c;定义在函数前面。fixture有明确的名字&#xff0c;在其他函数&#xff0c;模块&#xff0c;类或整个工程调用它时会被激活。fixture是基于模块来执行的&#xff0c;每个…