一、开发环境配置
1.1 JDK环境
1.1.1 jdk下载
-
进入oracle官网
-
点击Resources
-
点击Downloads --> JDK
-
点击Java archive,并找到Java SE 8(8u202 and earlier)
-
找到jdk-8u131-windows -x64.exe
-
登陆后点击下载
1.1.2 jdk安装
-
在D盘新建一个java文件夹,在java目录下分别创建jdk和jre目录,这里的盘符可以修改
-
找到刚刚下载的安装程序,点击安装
-
选择刚刚创建的java下的jdk目录
-
按下一步,安装好jdk后,选择jre安装目录为刚刚创建的java下的jre目录
-
安装完成后点击关闭
1.1.3 环境变量配置
-
找到我的电脑(或计算机,此电脑) --> 右键属性
-
找到高级系统设置(我这里是在“关于”里面)
-
环境变量 --> 新建系统变量 --> 变量名:JAVA_HOME 变量值:刚刚安装的jdk目录
-
在系统变量中找到path变量 --> 新建 --> 路径:%JAVA_HOME%\bin --> 一直点击确定
1.1.4 检查是否安装成功
-
win+r 或者 搜索栏搜运行
-
输入cmd点击确定
-
输入javac查看是否配置环境变量成功
-
输入java -version查看版本号
1.2 配置Tomcat
-
下载对应系统zip文件
-
解压后得到文件
-
配置环境变量
添加变量:CATALINA_HOME 变量值:D:\Tomcat\apache-tomcat-10.0.22 path添加:%CATALINA_HOME%\bin
-
测试是否安装成功
打开cmd输入:startup.bat或startup
在浏览器输入网址http://localhost:8080/,出现小猫咪页面即安装成功
输入shutdown.bat关闭Tomcat
注意:不能输入shutdown,这个是关机命令
-
控制台乱码问题
将CATALINA_HOME/conf/logging.properties文件中的内容修改如下:java.util.logging.ConsoleHandler.encoding = GBK【utf-8 --> GBK】
原因:原因:由于Windows中文系统中,命令提示符默认的编码是 "简体中文 GBK",tomcat启动后默认编码UTF-8,编码不一致,所以只需配置启动tomcat后为GBK编码即可。
1.3 配置Maven
-
下载对应版本解压即可
-
配置环境变量
添加变量:M2_HOME 变量值:D:\maven\apache-maven-3.3.9\apache-maven-3.3.9-bin path添加:%M2_HOME%\bin
-
检查是否安装成功,打开cmd窗口:mvn -v 查看版本信息
-
修改本地仓库位置
M2_HOME\conf\settings.xml文件
将下列信息【仓库位置可自行设定】
<localRepository>D:/maven/apache-maven-3.3.9/repository</localRepository>
添加到下列对应位置
<!-- localRepository | The path to the local repository maven will use to store artifacts. | | Default: ${user.home}/.m2/repository <localRepository>/path/to/local/repo</localRepository> --> <!--Configure local warehouse location--> <!--下一行为添加的本地仓库配置信息,将其添加到此位置--> <localRepository>D:/maven/apache-maven-3.3.9/repository</localRepository> <!-- interactiveMode | This will determine whether maven prompts you when it needs input. If set to false, | maven will use a sensible default value, perhaps based on some other setting, for | the parameter in question. | | Default: true <interactiveMode>true</interactiveMode> -->
二、Eclipse
2.1 安装Eclipse
-
选择对应版本下载
-
解压后点击eclipse.exe即可使用
2.2 配置eclipse环境
2.2.1 配置jdk
-
打开eclipse点击Window --> Perferences
-
进入设置界面后,找到”Java“选项,单击”Installed JRES“,单击”添加“
-
在弹出的对话框中点击next
-
选择jdk目录finish-->apply即可
2.2.2 设置编码集
Window - Preferences - General - WorkSpace - Other 选择UTF-8,点击Apply
2.2.3 设置Tomcat
Window - Preferences - Server- Runtime Environment - add
Apache - Apache Tomcat v10.0 - next
Browse选择Tomcat的安装路径,选择对应的jre
2.2.4 配置Maven
Window - Preferences - Maven - Installations - Add
选择Maven的文件夹
选择User Settings在Global Settings把settings.xml文件地址放进去,点击apply
三、数据库安装
3.1 下载MySQL
-
进入MySQL官网MySQL并点击DOWNLOADS
-
鼠标下滑到界面下方,点击MySQL Community(GPL) Downloads
-
点击MySQL Installer for Windows
-
点击第二个Download按钮(虽然写的是32位,但同时包含了64位)
-
点击No thanks, just start my download即可开始下载
3.2 安装MySQL
-
双击下载的msi文件,开始安装
-
点击同意协议之后点击“Next”。
-
选择“Custom”[自定义安装类型],点击"Next"。
-
点击“Next”
-
我们点击“Next”的时候弹出对话框:一个或者多个产品要求没有得到满足。哪些符合要求的产品将不会安装/升级。这里我选择了“Yes”。
-
点击“Execute”。
-
点击“Next”。
-
在product configutration(产品配置)页面能看到需要配置的程序,点击“Next”。
-
Config Type:选择Development Machine,用于小型以及学习所用足够了。
Port number:输入3306,也可以输入其他最好是3306-3309之间。
-
设置root密码,该密码要记住以后连接数据库时要用到,点击“Next”
-
配置Mysql在windows系统中的名字,是否选择开机启动Mysql服务,其他的没有进行修改,点击“Next”
-
Mysql服务配置完毕后点击“Finish”
3.3 配置环境变量
添加变量:MYSQL_HOME 变量值:D:\mysql\8.0.29-installer\Mysql Server path添加:%MYSQL_HOME%\bin
3.4 运行Mysql Workbench![](https://i-blog.csdnimg.cn/blog_migrate/9d3b01d82ce2a839a1f55360f474e242.png)
输入密码
打开
打开cmd,也可以直接连接数据库
3.5 导入sql文件
-
在cmd中使用source命令
四、编写Javaweb项目代码
4.1 控制台显示Tomcat
-
打开Eclipse - Window - Show View - Servers
-
点击No servers are available.Click this link to create a new server···
-
在弹出的对话框选择Apache - Tomcat v10.0 Server - next - Finish
4.2 新建项目
-
File - New -Maven Project
-
默认default Workspace location,直接next
-
找到webapp对应模板maven-archetype-webapp,再点击next
-
填写自己的Group Id和Artifact Id填好后finish
-
构建环境
-
修改jdk版本
-
修改为Alternate JRE
-
增加运行时环境
-
选择Server Runtime后选择Apache Tomcat v10.0
-
点击apply
-
若pom.xml文件报错Could not initialize class org.apache.maven.plugin.war.util.POM中包含有maven-war-plugin插件,插件版本太低,向pom.xml文件中加入
<build> <finalName>Servlet</finalName> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.1.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.2</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> </plugins> </pluginManagement> </build>
-
由于后续还需要用到json,mysql等依赖
向pom.xml文件中加入以下依赖
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.10</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.29</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.15</version> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20220320</version> </dependency> </dependencies>
-
右键点击Maven - Update Project
4.3 new菜单所选设置
eclipse原始new菜单如下图
由于开发项目类型不同,导致我们常用的new选项也会不同,所以需要我们自己定义选择我们常用的菜单项。步骤如下:
首先,选择Window–>Customize Perspective
打开Shortcuts选项卡,比如我经常用Interface、Class、Package,所以我找到java选项
4.4 编写项目
在java目录下新建package:com.jqn.servlet
使用mybatis连接数据库
首先编写mybatis核心配置文件
4.4.1 mybatis-config.xml
在xml文件中配置driver、url、username、password信息
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/stu_db?characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="Jqn112300$"/> </dataSource> </environment> </environments> </configuration>
4.4.2 编写工具类DB
1.在servlet目录下新建service包,在service包下创建DB工具类
2.创建SqlSessionFactory私有属性
private static SqlSessionFactory ssf;
3.根据mybatis说明文档,从 XML 文件中构建 SqlSessionFactory 的实例,使用类路径下的资源文件进行配置。
String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); ssf = new SqlSessionFactoryBuilder().build(inputStream);
4.既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
SqlSession sqlSession = ssf.openSession();
5.可以总结成以下代码:
package com.jqn.servlet.service; import java.io.IOException; import java.io.InputStream; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class DB { private static SqlSessionFactory ssf; static { try { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); ssf = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { // TODO: handle exception System.out.println(e); System.out.println("数据库连接失败!"); } } /** **创建数据库连接 * @return * @throws IOException */ public static SqlSession getConn() { SqlSession sqlSession = ssf.openSession(); return sqlSession; } }
在servlet目录下新建domain包,在domain包中新建Student类
4.4.3 编写Student类
创建实体类,将数据库将要查询的表(这里我选择的是stu_db中的basicinfo表单)中的字段设置为私有属性,并提供setter和getter,以及toString方法
package com.jqn.servlet.domain; public class Student { private String stuID; private String stuNum; private String stuName; private String StuAccount; private int grade_ID; public String getStuID() { return stuID; } public void setStuID(String stuID) { this.stuID = stuID; } public String getStuNum() { return stuNum; } public void setStuNum(String stuNum) { this.stuNum = stuNum; } public String getStuName() { return stuName; } public void setStuName(String stuName) { this.stuName = stuName; } public String getStuAccount() { return StuAccount; } public void setStuAccount(String stuAccount) { StuAccount = stuAccount; } public int getGrade_ID() { return grade_ID; } public void setGrade_ID(int grade_ID) { this.grade_ID = grade_ID; } @Override public String toString() { return "Student [stuID=" + stuID + ", stuNum=" + stuNum + ", stuName=" + stuName + ", StuAccount=" + StuAccount + ", grade_ID=" + grade_ID + "]"; } }
4.4.4 编写StudentMapper接口
编写Mapper接口类,在servlet目录下新建mapper包,在mapper包中新建StudentMapper接口,编写接口为编写sql语句的实现做准备
package com.jqn.servlet.mapper; import java.util.List; import com.jqn.servlet.domain.Student; public interface StudentMapper { Student findStudentBySno(String sno); List<Student> findAllStudents(); }
4.4.5 StudentMapper.xml
在resources目录下新建mapper包,在ampper包中新建StudentMapper.xml文件,在该文件中编写sql语句
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.jqn.servlet.mapper.StudentMapper"> <select id="findStudentBySno" resultType="com.jqn.servlet.domain.Student"> select * from stu_basicinfo where stuNum = #{sno}; </select> <select id="findAllStudents" resultType="com.jqn.servlet.domain.Student"> select * from stu_basicinfo where 1=1; </select> </mapper>
两个sql语句分别实现StudentMapper接口中的findStudentBySno和findAllStudents两个抽象方法。
#{sno}
这就告诉 MyBatis 创建一个预处理语句(PreparedStatement)参数,在 JDBC 中,这样的一个参数在 SQL 中会由一个“?”来标识,并被传递到一个新的预处理语句中。
4.4.6 注意
记得在核心配置文件mybatis-config.xml文件中使用<mapper>配置绑定mapper.xml文件
<mappers> <mapper resource="mapper/student-mapper.xml"/> </mappers>
4.4.7 编写StudentService接口
在service包中新建StudentService接口,在接口中提供通过学号查找学生信息和直接查找所有学生信息的两个方法
package com.jqn.servlet.service; import java.util.List; import com.jqn.servlet.domain.Student; public interface StudentService { /** **查找一个学号为sno * @param sno * @return */ Student getStudent(String sno); /** **返回所有Student * @return */ List<Student> getStudents(); }
4.4.8 自定义异常
自定义InvalidException类异常,设置私有属性code,记录异常代码
并提供setter和getter
package com.jqn.servlet.service; public class InvalidException extends RuntimeException{ private static final long serialVersionUID = -7068020689186356204L; private int code; public InvalidException() { } public InvalidException(int code,String message) { super(message); this.code = code; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } }
4.4.9 编写StudentServiceImp类
在service包中新建StudentServiceImp类,StudentServiceImp是StudentService接口的实现
私有属性
private StudentMapper studentMapper;
无参构造函数:通过mybatis工具类DB创建SqlSession对象session,使用session获取StudentMapper对象
SqlSession session = DB.getConn(); studentMapper = session.getMapper(StudentMapper.class);
public Student getStudent(String sno) {}方法:使用StudentMapper接口的findStudentBySno()方法查询数据库
Student stu = studentMapper.findStudentBySno(sno); if (stu == null) { System.out.println("查无此人"); throw new InvalidException(404, "查无此人"); } return stu;
public List<Student> getStudents() {}方法:使用StudentMapper接口的findAllStudents()方法查询数据库
List<Student> list = studentMapper.findAllStudents(); return list;
4.4.10 Json类
在service包中新建Json类,Json类中编写getString()方法,用读取字节流的形式将发送过来的json数据转成String
设为静态方法,方便直接调用
package com.jqn.servlet.service; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import jakarta.servlet.http.HttpServletRequest; public class Json { public static String getString(HttpServletRequest req){ String result = ""; BufferedReader in = null; try { in= new BufferedReader(new InputStreamReader( req.getInputStream(),"utf-8")); String line; while ((line = in.readLine()) != null) { result += line; } } catch (IOException e) { e.printStackTrace(); }finally { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } return result; } }
4.4.11 ApiResult类
在servlet目录下新建web包,包中新建ApiResult类
此类规定结果格式,将此类对象传入JSONObject有参构造得到Json类型数据,最后输出
所以需要有异常信息,查询到的学生信息,以及私有属性的setter、getter以及toString()方法
package com.jqn.servlet.web; import org.json.JSONArray; import org.json.JSONObject; public class ApiResult { private int code; private String msg; private JSONArray students; private JSONObject student; public ApiResult() { code = 500; msg = "服务器异常!"; student = null; students = null; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public JSONArray getStudents() { return students; } public void setStudents(JSONArray students) { this.students = students; } public JSONObject getStudent() { return student; } public void setStudent(JSONObject student) { this.student = student; } @Override public String toString() { return "ApiResult [code=" + code + ", msg=" + msg + ", student=" + student + ", students=" + students + "]"; } }
4.4.12 StudentController类
在servlet目录下新建controller包,包中新建StudentController类,继承HttpServlet类,重写doPost方法和doGet方法
设置私有属性
private StudentService studentService; private JSONObject jsonObject;
doPost方法:
设置请求和响应的字符集等
req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); resp.setContentType("applaction/json; charset=utf-8");
将req传入Json类的getString()静态方法,将返回的String字符串传入JSONObject对象的有参构造方法,然后就可以通过键值对读取了。使用try……catch避免异常出现
try { jsonObject = new JSONObject(Json.getString(req)); } catch(Exception e) { }
判断请求传入数据的格式是否正确,以及需要查询的意图
输入格式不正确则抛出异常
调用对应查询的方法后,将返回数据转成Json格式
ApiResult rs = new ApiResult(); String type = jsonObject.getString("type"); if(type.trim().length() == 0 || type.trim().length() != 3){ throw new InvalidException(400, "type格式错误"); } if(type.equals("all")){ List<Student> list = studentService.getStudents(); rs.setStudents(new JSONArray(list)); } else if(type.equals("one")){ String sno = jsonObject.getString("sno"); if(sno.trim().length() == 0 || sno.trim().length() > 10){ throw new InvalidException(400, "学号格式错误"); } Student stu = studentService.getStudent(sno); rs.setStudent(new JSONObject(stu)); } else { throw new InvalidException(400, "type格式错误"); }
若没有遇到异常,则设置结果为成功,并输出查询到的数据
rs.setCode(200); rs.setMsg("访问成功"); jsonObject = new JSONObject(rs); resp.getWriter().print(jsonObject); System.out.println("yes");
若捕捉到InvalidException异常,则设置结果为404失败,并输出错误信息
ApiResult rs = new ApiResult(); rs.setCode(e.getCode()); rs.setMsg(e.getMessage()); jsonObject = new JSONObject(rs); resp.getWriter().print(jsonObject);
若捕获到其他异常,则设置结果为500失败,并输出错误信息
e.printStackTrace(); ApiResult rs = new ApiResult(); rs.setCode(500); rs.setMsg("系统已挂"); jsonObject = new JSONObject(rs); resp.getWriter().print(jsonObject);
并在Servlet上使用注解
@WebServlet("/Api")
至此,javaweb编写完成
4.5 部署项目到Tomcat服务器
1.在Servers中的Tomcat上右击,选择Add and Remove
2.双击所需要添加的项目或点击添加,点击Finish完成
3.开启Tomcat服务器
4.6 测试
在PostMan中发送请求测试
4.7 发布项目
1.在项目上右击 - Export - WAR file【这个项目是JavaWeb项目,所以是war文件】
2.选择Tomcat目录下的webapps文件夹,点击Finish
3.打开cmd
4.输入startup.bat
5.在弹出的Tomcat对话框中可以看到,开启成功
6.再次在PostMan中发送请求测试
7.并且在Tomcat窗口看到Yes输出,发布成功
8.命令行输入shutdown.bat关闭Tomcat服务器