分类 代码杂烩 下的文章 - NianSir's BLOG
首页
关于 | About US
文章协议
友情站点
搜 索
1
【Minecraft | 我的世界】PC存档转移到服务器存档教程
9,552 阅读
2
记一次七日杀(7Days to die)游戏服务器搭建及联机问题和解决方案
1,470 阅读
3
【陌辞论坛】送一批邀请码,带惊喜大礼
1,038 阅读
4
【Minecraft | 我的世界】服务器搭建记录
900 阅读
5
【免费主机】进行时数据 - 免费1G主机
895 阅读
生活杂谈
好物分享
技术探索
代码杂烩
学习笔记
登录
/
注册
搜 索
标签搜索
学习笔记
免费
服务器搭建
Java
MySQL
WEB
网络
CDN
网络安防
Minecraft
我的世界
Windows
JSP
参赛
奖品
Python
实战
站点优化
PILOT
百乐
NianSir
累计撰写
27
篇文章
累计收到
13
条评论
首页
栏目
生活杂谈
好物分享
技术探索
代码杂烩
学习笔记
页面
关于 | About US
文章协议
友情站点
用户登录
登录
注册
找到
5
篇与
相关的结果
2025-03-20
JSP历险记:Hello Servlet!
上一篇JSP学习笔记我们已经学习了通过JDBC如何与数据库交互这一次我们就来初步了解一下JSP“大脑”:Servlet!📚 00:Hello Servlet0.1 Servlet是什么?Servlet是Java编写的服务器端程序,运行在Web服务器(如Tomcat)中它遵循"请求-响应"模型:接收客户端(浏览器)的请求,处理业务逻辑,返回响应相比CGI,Servlet更高效,因为Java虚拟机常驻内存0.2 Servlet生命周期加载:服务器启动时,或通过<load-on-startup>配置初始化:调用init()方法(只执行一次)处理请求:每次请求调用service()方法(根据HTTP方法分派到doGet()/doPost())销毁:服务器关闭时调用destroy()方法🎮 开篇:为什么我们要学Servlet?在JSP中,Servlet的作用是处理客户端的请求并生成动态的内容。需要使用Servlet是因为它能够帮助我们与客户端进行交互,处理表单数据、数据库操作等,使网页变得更加动态和交互性。简单来说,就好比Servlet是网页的大厨,负责把客人点的菜做好并上桌,让整个用餐体验更加丰富和美味。想象一下,你正在开发一个酷炫的网站,用户可以在上面注册账号、登录、发表动态……而这一切的背后,都离不开一个核心角色——Servlet!它就像网站的大脑,处理用户的请求,返回动态的内容。今天,就让我们踏上Servlet的探险之旅,用一个简单的登陆注册页面例子带你入门!🛠️ 第一步:搭建开发环境1.1 安装JDK打开浏览器,搜索"JDK 8 下载"(注意:Servlet对JDK版本有一定要求,Tomcat 10以下建议用JDK 8,当然你也可选择高版本Java但是必须同时选择高版本Tomcat)在Oracle官网下载JDK( https://www.oracle.com/cn/java/technologies/downloads/ )Windows x64 Installer安装路径建议保持默认(比如C:\Program Files\Java\jdk1.8.0_291)配置环境变量(参考之前的Minecraft开服教程里有提及,这里不再赘述)1.2 安装Tomcat浏览器搜索"Tomcat 9 下载"(注意:Tomcat 10+需要JDK 11+,且包名从javax.servlet改为jakarta.servlet,容易出错)官网下载Windows Service Installer(32-bit/64-bit)安装时选择默认端口8080,管理员账号自己设置关键步骤:安装完成后,找到conf/server.xml,检查<Connector>标签的端口是否被占用1.3 配置IDE(以IntelliJ IDEA为例)新建Java项目 → 选择"Java Enterprise" → 勾选"Web Application"在"Project Structure" → "Libraries" → 添加Tomcat依赖在"Deployment" → 添加"Artifact" → 选择你的项目🛡️ 第二步:创建第一个Servlet2.1 编写Servlet类继承HttpServlet类重写doGet()或doPost()方法使用@WebServlet注解配置URL映射(或配置web.xml)@WebServlet("/hello") public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<h1>Hello Servlet!</h1>"); } }2.2 部署并运行将项目部署到Tomcat浏览器访问http://localhost:8080/你的项目名/hello如果看到"Hello Servlet!",恭喜你,第一个Servlet运行成功!🔑 第三步:实战案例——登录注册系统3.1 创建数据库(MySQL示例)新建数据库userdb创建表users:CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(50) NOT NULL );3.2 编写注册Servlet处理表单提交的POST请求连接数据库,插入新用户注意密码加密(这里简单示例用明文,实际项目请用MD5/SHA等)@WebServlet("/register") public class RegisterServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); // 数据库连接(需添加JDBC驱动) try (Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/userdb", "root", "123456")) { String sql = "INSERT INTO users (username, password) VALUES (?, ?)"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setString(1, username); stmt.setString(2, password); stmt.executeUpdate(); response.sendRedirect("login.html"); } catch (SQLException e) { e.printStackTrace(); } } }3.3 编写登录Servlet验证用户名和密码使用RequestDispatcher跳转页面@WebServlet("/login") public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); try (Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/userdb", "root", "123456")) { String sql = "SELECT * FROM users WHERE username=? AND password=?"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setString(1, username); stmt.setString(2, password); ResultSet rs = stmt.executeQuery(); if (rs.next()) { request.setAttribute("username", username); RequestDispatcher dispatcher = request.getRequestDispatcher("welcome.jsp"); dispatcher.forward(request, response); } else { response.sendRedirect("login.html?error=1"); } } catch (SQLException e) { e.printStackTrace(); } } }3.4 创建JSP页面login.html:登录表单register.html:注册表单welcome.jsp:登录成功页面<%-- welcome.jsp --%> <%@ page contentType="text/html;charset=UTF-8" %> <html> <head> <title>欢迎</title> </head> <body> <h1>欢迎,$!</h1> </body> </html>💡 第四步:解决版本兼容问题4.1 Tomcat 10+的坑如果你用了Tomcat 10+,可能会遇到java.lang.ClassNotFoundException: javax.servlet.Servlet错误原因:Tomcat 10+遵循Jakarta EE 9+,包名从javax.servlet改为jakarta.servlet解决方案:方法一:改用Tomcat 9(推荐新手)方法二:在pom.xml中添加依赖(Maven项目):<dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>5.0.0</version> <scope>provided</scope> </dependency>方法三:修改代码中的包名为jakarta.servlet(需要改所有相关类)4.2 JDBC驱动问题下载对应版本的MySQL Connector/J(比如8.0.x)将mysql-connector-java-8.0.x.jar放到Tomcat的lib目录下或在IDE中配置库依赖🔧 第五步:运行与调试启动Tomcat服务器访问http://localhost:8080/你的项目名/register.html注册账号访问http://localhost:8080/你的项目名/login.html登录测试检查数据库是否插入数据查看控制台输出,调试错误🎉 结语:Servlet的奇妙世界通过这个小案例,你已经掌握了Servlet的基本用法!当然,这只是一个简单的示例,实际项目中还需要考虑:密码加密存储防止SQL注入(使用PreparedStatement)会话管理(Cookie/Session)验证码功能记住我功能接下来,你可以尝试学习JSP标签库、EL表达式、JSTL等,让页面更动态!也可以研究Spring MVC等框架,简化Servlet的开发流程。记住,实践是检验真理的唯一标准,多动手写代码,你会越来越熟练!
2025年03月20日
30 阅读
0 评论
3 点赞
2025-03-18
JSP历险记:与数据库谈场"恋爱"——JDBC连接全攻略
序章:当Web程序遇上"数据焦虑"各位小伙伴好呀~今天咱们要聊的可是JavaWeb开发里的"灵魂伴侣"——JDBC数据库连接!想象一下这个场景:你兴冲冲地写了个网页程序,用户输入了姓名年龄,结果数据只能存在内存里,服务器一重启就"失忆"了。是不是像极了金鱼脑男友?这时候就需要给咱们的Web程序找个"持久化"的另一半啦!第一章:JDBC的前世今生在远古的Java 1.0时代,程序员们想要操作数据库可费劲了——每个数据库厂商都有自己的驱动API,写套MySQL代码换个Oracle就得全盘重构。直到Sun公司推出JDBC(Java Database Connectivity),就像给数据库世界制定了"普通话"标准。现在不管是MySQL、Oracle还是SQLite,统统都能用同一套API搞定,是不是突然感觉代码"兼容性"buff叠满了?📌 技术冷知识: JDBC其实是个"翻译官",它把Java代码翻译成数据库能听懂的SQL方言。不同数据库的JDBC驱动就像不同国家的翻译,虽然语言不同,但接口是统一的。第二章:搭建"相亲"环境工欲善其事必先利其器,咱们先来准备三件套:数据库:推荐新手村必备MySQL(毕竟免费又好用),记得装个图形化工具如Navicat(或者JetBrains家的DataGrip甚至IDEA已经内置了,学生可以去看我之前的免费JetBrains全家桶教育免费的申请教程: 【JetBrains正版激活】IDEA正版软件学生免费获取,申请指南 ),操作起来像在数据库里"逛街"驱动包:去MySQL官网下载最新JDBC驱动(现在叫Connector/J),就像给程序装个"翻译器": https://downloads.mysql.com/archives/c-j/ 在页面选择对应的驱动版本根据你的数据库版本而定,MySQL8.0后的数据库驱动程序请选择后缀带8.x的驱动,我这里用的是MySQL 5.7所以还是选择后缀5.x的驱动版本 😀 注意,这里下载下来的是一个独立的压缩包,解压后找到驱动对应名字的jar包,一般是有两个的,选带bin后缀的jar包复制进项目lib目录开发环境:Eclipse/IDEA任选,推荐IDEA(智能提示简直开挂)💡 安装小剧场: 把驱动jar包放进项目的WEB-INF/lib目录时,记得要"右键→Add as Library",不然就像给程序准备了满汉全席却忘了递筷子~第三章:JDBC连接五部曲(带弹幕解说版)Step1:加载驱动(破冰环节)Class.forName("com.mysql.jdbc.Driver"); // 新版驱动类名变了哦,别记错"身份证号",8.0以后的驱动是com.mysql.cj.jdbc.Driver // 弹幕:驱动类加载失败?检查MySQL版本是否匹配!这行代码就像给数据库寄了封介绍信,告诉它:"有个Java程序想认识你~"Step2:建立连接(初次约会)String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC"; String user = "root"; String password = "123456"; Connection conn = DriverManager.getConnection(url, user, password); // 弹幕:连接超时?检查防火墙是否放行3306端口! // 弹幕:时区报错?在url里明确指定serverTimezone=Asia/ShanghaiURL就像约会地点,记得把mydb改成你的数据库名。时区设置是常见坑点,就像跨国恋要倒时差~Step3:创建Statement(准备话题)Statement stmt = conn.createStatement(); // 弹幕:Statement有两种类型:TYPE_SCROLL_INSENSITIVE(可滚动)和TYPE_FORWARD_ONLY(默认)Statement就像聊天时的"开场白",接下来要说什么SQL语句由它传递。Step4:执行SQL(深入交流)// 查询示例(带分页) ResultSet rs = stmt.executeQuery("SELECT * FROM users LIMIT 10 OFFSET 20"); while(rs.next()) { String name = rs.getString("name"); int age = rs.getInt("age"); // 弹幕:列名不存在?检查数据库字段名是否匹配! // 弹幕:结果集遍历要用next()方法,不能用for循环! } // 更新示例(带事务) conn.setAutoCommit(false); try { stmt.executeUpdate("UPDATE users SET age=26 WHERE name='小王'"); stmt.executeUpdate("INSERT INTO logs VALUES('年龄更新')"); conn.commit(); } catch (SQLException e) { conn.rollback(); }ResultSet就像数据库返回的"情书",用next()方法逐行读取,是不是像极了拆盲盒?Step5:关闭资源(礼貌告别)// 传统写法(容易漏关) rs.close(); stmt.close(); conn.close(); // 现代写法(try-with-resources,自动关闭) try (Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) { // 操作代码 } // 自动关闭资源 // 弹幕:关闭顺序要反过来:ResultSet→Statement→Connection第四章:常见"翻车"现场(带解决方案)ClassNotFoundException:🔍 检查驱动包是否在WEB-INF/lib🔍 检查驱动类名是否正确(MySQL8+用com.mysql.cj.jdbc.Driver)🔍 是否执行了Class.forName()加载驱动?Access denied for user:🔑 检查用户名密码是否正确🔑 登录MySQL执行SELECT user,host FROM mysql.user,确认用户有远程访问权限🔑 尝试用GRANT ALL PRIVILEGES ON mydb.* TO 'root'@'%'授权SSL连接问题:🔒 在URL中添加useSSL=false🔒 或者配置MySQL的SSL证书(生产环境推荐)中文乱码:🌐 URL添加characterEncoding=UTF-8🌐 确保数据库、表、字段都设置为utf8mb4🌐 连接后执行SET NAMES utf8mb4ResultSet关闭异常:💡 使用try-with-resources自动关闭💡 单独关闭时检查是否为null第五章:进阶玩法(感情升温)PreparedStatement防SQL注入:String sql = "SELECT * FROM users WHERE name = ? AND age > ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, userInput); // 索引从1开始! pstmt.setInt(2, 18); // 弹幕:参数化查询就像给SQL语句戴"安全套" // 弹幕:预编译语句还能提升性能(数据库会缓存执行计划)连接池优化(以HikariCP为例):# 配置文件:src/main/resources/hikari.properties dataSourceClassName=com.mysql.cj.jdbc.MysqlDataSource dataSource.url=jdbc:mysql://localhost:3306/mydb dataSource.user=root dataSource.password=123456 maximumPoolSize=10HikariConfig config = new HikariConfig("/hikari.properties"); HikariDataSource ds = new HikariDataSource(config); Connection conn = ds.getConnection(); // 弹幕:连接池就像给数据库"排班",避免频繁创建销毁连接 // 弹幕:HikariCP是目前最快的连接池,Spring Boot默认使用事务管理(实战版):conn.setAutoCommit(false); Savepoint svpt = conn.setSavepoint("updateStart"); try { // 转账操作 stmt.executeUpdate("UPDATE accounts SET balance=balance-100 WHERE id=1"); stmt.executeUpdate("UPDATE accounts SET balance=balance+100 WHERE id=2"); conn.commit(); } catch (SQLException e) { conn.rollback(svpt); // 回滚到保存点 // 处理异常... } // 弹幕:保存点就像游戏存档,可以部分回滚 // 弹幕:默认隔离级别是REPEATABLE_READ,可能需要根据业务调整第六章:实战演练(约会实战)任务:做个简单用户管理系统,包含增删改查功能步骤:建表SQL:CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, age INT, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;JSP页面(list.jsp):<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <table> <tr><th>ID</th><th>姓名</th><th>年龄</th><th>操作</th></tr> <c:forEach items="$" var="user"> <tr> <td>$</td> <td>$</td> <td>$</td> <td> <a href="edit.jsp?id=$">编辑</a> <a href="delete?id=$">删除</a> </td> </tr> </c:forEach> </table> <a href="add.jsp">新增用户</a>Servlet代码(UserServlet.java):@WebServlet("/user") public class UserServlet extends HttpServlet { private static final String URL = "jdbc:mysql://localhost:3306/mydb?useSSL=false"; private static final String USER = "root"; private static final String PASS = "123456"; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getParameter("action"); Connection conn = null; try { conn = DriverManager.getConnection(URL, USER, PASS); if ("list".equals(action)) { listUsers(conn, request, response); } else if ("delete".equals(action)) { deleteUser(conn, request, response); } } catch (SQLException e) { throw new ServletException("数据库错误", e); } finally { if (conn != null) try catch (SQLException ignore) } } private void listUsers(Connection conn, HttpServletRequest request, HttpServletResponse response) throws SQLException, ServletException, IOException { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM users"); List<User> userList = new ArrayList<>(); while (rs.next()) { userList.add(new User( rs.getInt("id"), rs.getString("name"), rs.getInt("age") )); } request.setAttribute("userList", userList); request.getRequestDispatcher("list.jsp").forward(request, response); } // 其他方法(add/edit/delete)类似... }🛠️ 调试技巧:在catch块里打印完整异常堆栈:e.printStackTrace()使用IDEA的Database工具直接查看数据库变化在SQL语句前加SELECT NOW()测试连接是否成功用Postman测试RESTful接口🎯 性能优化建议:查询时使用SELECT id,name FROM users代替SELECT *对频繁查询的字段(如name)加索引使用连接池管理数据库连接考虑使用缓存(如Redis)存储热点数据结语:与数据库的"长久之计"通过JDBC连接数据库就像谈场细水长流的恋爱:开始时要小心翼翼建立连接,过程中要妥善处理各种异常,最后还要优雅地关闭资源。随着技术深入,你会遇到ORM框架(如MyBatis、Hibernate),就像给这场恋爱找个"红娘",让数据操作变得更优雅高效。但无论如何,理解JDBC原理都是打好JavaWeb基础的关键一课。快去动手实践吧!遇到问题记得回来看看这篇笔记,咱们下期聊聊Servlet~ 🚀
2025年03月18日
14 阅读
0 评论
3 点赞
2024-10-11
在Windows上的PHP+MySQL环境搭建与调试
前言近期由于需要完成一项数据库课程设计,无奈学校给出的大纲案例过于经典(图书馆借阅系统、学生信息管理系统...)对于这样过于经典和老套的项目完全提不起兴趣,那寻思就自己选一个项目吧;做高级的东西水平不够,即便现在是AI时代,选题AI应用是一个很不错的方向,如果只是制作一个壳子,那数据库依赖似乎不够高,似乎有点偏离初衷了;如果做大型数据分析处理那水平也就不够用了(毕竟短期还是要拿出成果的)于是思来想去,最终把目标定在了PHP+MySQL制作一个在线视频课程学习平台。 说到PHP+MySQL这套组合我可实在是太喜欢了,主打一个方便快捷,即便是在当今的2024年,这套技术栈依然广受欢迎,喜欢折腾建站的朋友们一定非常清楚这一点(当然未来就不好说了,毕竟现在Go、Node.js等越来越受欢迎了),我也一样,在早期接触建站时为了快捷大多数非专业玩家都会选择使用一些集成面板等平台来可视化管理服务器(大多数Linux上的)这就导致很多朋友在面对在Windows上开发与调试严重缺乏经验,还好这不算什么大问题,毕竟人都是在不断学习的,俺也一样,那么现在就讲讲在配置Windows上的PHP+MySQL上的步骤和经验吧~下载环境/依赖本套开发调试环境是WEB的PHP+MySQL,那么PHP和MySQL肯定是必须要下载的,除此之外还需要安装一个网页服务器,全球综合最受欢迎的是Apache,当然除此之外还可以选择NGINX等提供web服务,此处我们选择Apache作为web服务器来配置,相关链接如下: Apache下载(使用Apache Lounge):https://www.apachelounge.com/download/PHP7.2下载(windows专属php):https://windows.php.net/download/MySQL下载(分两种,社区版8.0以上可以使用安装器安装,但是低版本似乎只有二进制安装了):https://downloads.mysql.com/archives/community/VC环境下载(Apache依赖VC环境部分windows用户可能系统并没有安装,可以先装一下以便后期的测试):现在我们得到了除了VC之外的三个环境包zip文件,httpd是Apache、mysql、php,我们分别解压在不同的目录中,注意绝对路径中不要包含中文和空格以防其他的错误。接下来就是分别配置和启动啦!配置&启用MySQL我使用的版本是MySQL 5.7.44,解压压缩包后在根目录下创建一个 my.ini 文件:填入以下内容:[client] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] # 设置3306端口 port=3306 character_set_server=utf8 # 解压目录 basedir=D:\xxx\mysql-5.7.44-winx64 # 解压目录下data目录 datadir=D:\xxx\mysql-5.7.44-winx64\data default-storage-engine=INNODB sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES [WinMySQLAdmin] D:\xxx\mysql-5.7.44-winx64\bin\mysqld.exe 写好ini文件后保存,在系统环境变量中配置一下mysql的bin目录路径并保存(系统环境变量如何配置此处不赘述),接下来右键Windows徽标(开始按钮)开启一个Windows PowerShell(管理员),注意一定是要管理员权限的Shell!!!这里不用CMD管理员是因为部分Windows管理员CMD无法切换目录导致操作不便,而且powershell更贴近Linux操作风格,使用会更习惯。接下来我们使用管理员shell进行操作:我们使用cd进入mysql安装目录(注意powershell需要使用双引号包裹路径),使用 mysql -install 安装mysql,输出成功信息后,使用 mysql --initialize --console 初始化mysql,成功后会在最后输出root用户默认密码(注意最后一整串字符串都是密码包括“;”等特殊符号!!!)接着我们可以启动mysql服务了!,使用 net start mysql 启动服务,启动成功后通过 mysql -u root -p 登陆root用户可以看到登录成功:这里再提一嘴我在折腾时候遇到的问题吧,由于之前学java是时候使用过mysql,但已经过去一年多了早忘记了mysql密码了,按照网上的修改密码方法好像没折腾成功反而导致mysql服务异常了,后来干脆直接删掉重装,最后解决,所以如果你也曾经安装了mysql并且忘记了密码,并且没啥重要数据推荐也是直接重装就行。安装&配置Apache+PHP这里为什么会把Apache和PHP配置放一起,原因很简单,因为Apache的配置需要与PHP关联,所以就放一起说咯; 先进入PHP安装目录,复制一份 php.ini-development 文件,改名为 php.ini 保存在根目录,打开编辑:[PHP] engine = On # 启动引擎 short_open_tag = Off # 关闭短标签 max_input_time = 60 memory_limit = 128M error_reporting = E_ALL # 错误报告开启全部提示 post_max_size = 2048M # POST 最大文件大小 default_mimetype = "text/html" default_charset = "UTF-8" # 默认文件编码 extension_dir = "./" extension_dir = "D:/PHPEnv/PHP74/ext" # PHP 插件路径 enable_dl = Off upload_max_filesize = 2048M # 上传最大文件大小 max_file_uploads = 20 #启用常见扩展(包括项目需要是扩展记得也开启,一般默认ini已经有了但是默认是被注释的,删掉前面的“;”符号即可启用) extension=curl extension=fileinfo extension=gd2 extension=mbstring extension=mysqli extension=pdo_mysql extension=sockets [Date] date.timezone = Asia/Shanghai # 默认时区设置(中国上海) [mail function] SMTP = localhost smtp_port = 25 mail.add_x_header = Off [mbstring] mbstring.language = Chinese # 检查字数语言(中文) 这里只是列出了一些常用需要关注的地方,完整的INI文件有大量可配置数据,这些有需要时再去另外了解即可,php配置文件完成后进入Apache安装目录进行Apache配置,进入Apache安装目录下的conf目录下打开httpd.conf文件,同样我们只关注重点需要配置修改的项目:# Apache24.conf file # General Settings Define SRVROOT "D:/PHPEnv/Apache24" # 定义Apache 根目录 ServerRoot "$" ServerName localhost # 服务名 Define ENABLE_TLS13 "Yes" Listen 80 # 监听80端口,如果被占用可以使用 8080 端口 # PHP74 Config # PHP 8.0 修改为 php8apache2_4.dll LoadModule php_module "D:/PHPEnv/PHP74/php7apache2_4.dll" # 定义 PHP7 模块路径 AddType Application/x-httpd-php .php # 添加 PHP格式 PHPIniDir "D:/PHPEnv/PHP74" #定义 PHP 根目录 <Directory /> # 具体配置含义参考其他文章 AllowOverride all Options Indexes FollowSymLinks Require all granted </Directory> <Directory "H:/WWW"> # 定义网站根目录 AllowOverride all Options Indexes FollowSymLinks Require all granted </Directory> <IfModule dir_module> #默认解析执行的页面 DirectoryIndex index.html index.php index.htm </IfModule> <Files ".ht*"> Require all granted </Files> # Virtual hosts Include conf/extra/httpd-vhosts.conf # 启用虚拟主机文件,当然如果不是同时调试多站点其实也可以不需要这个 既然说到了虚拟主机配置,那就这里也贴一下虚拟主机配置吧(在Apache安装目录下的/extra/httpd-vhosts.conf):<VirtualHost *:80> ServerAdmin localhost DocumentRoot "H:/WWW" ServerName localhost <Directory "H:/WWW"> Options Indexes FollowSymLinks Includes ExecCGI </Directory> </VirtualHost> 配置完成后使用shell进入Apache的bin目录下,如果没有配置环境变量可以直接使用 ./httpd -t,显示 Syntax OK 说明配置无误,接着就可以安装启动Apache服务了,使用 ./httpd -k install -n Apache24 进行安 装,-n 后面跟服务名(可以自己定义),不填默认为 Apache2.4,成功后使用 net start Apache24 启动服务:接下来只需要在默认目录创建一个php文件内写入 <?php phpinfo(); ?> 后访问这个页面,出现phpinfo页面就大功告成啦!
2024年10月11日
268 阅读
0 评论
9 点赞
2023-04-23
【Java算法】新除法,不使用%、/运算符输出商和余数
NianSir小站很久不水文章了,寻思最近学习Java,有很多比较有意思的算法题可以练练思维,就果断开始制定自己的刷题计划,同时也可以水一点文章发发博客就顺便用博客的Java专题记录一下子咯。 温馨提示:NianSir的代码Java水平可能很一般,如果有更好的建议欢迎各位dalao指点指点 下面就来分享一下今天带来的第一个Java算法题——“新除法” Java算法题A-01 - “新除法” 顾名思义,作为“新除法”,那肯定是与传统的除法不同,要求我们不使用‘%’、‘/’运算符进行商和余数的运算(所有数据均为整数类型),很明显这类算法的实现并不复杂,并不需要深度的Java知识也能够完成,那直接开整吧! #1 算法设计 对于传统的÷,假设a为除数,b为被除数,我们可以理解为a中最多包含b的n倍,剩余的a-nb即为余数,那么我们不妨直接使用循环结构对a-b进行循环操作,直至a-b不小于0为止,其中循环次数即为n,a-nb就是余数啦,我们可以在循环结构里加入一个计数器得到n的数值。 当然细心一点不难发现,这个逻辑是在a>b的情况下成立的,当a小于b时,b应该直接为余数,而不需要循环判断,所以我们只需要在设定好的循环结构外层加一个if判断即可,先进行判断,再进行循环,最后print输出结果即可。 #2 代码 a、b为除数与被除数,shang存储商、yu存储余数,Java代码如下package day1_4_22; import java.util.Scanner; public class XinChuFa1 { public static void main(String[] args) { // 新除法-算法题 给定两个整数不使用/、%进行计算取商和余数 /* * 作者:NianSir * 时间:2023-4-22 * */ int a,b,n1,n2,shang=0,yu,i=0; Scanner sc=new Scanner(System.in); System.out.println("请输入除数与被除数(整数):"); n1=a=sc.nextInt(); n2=b=sc.nextInt(); if(a-b<0) { shang=0;yu=a; System.out.println(a+"÷"+b+" = "+shang+"···"+yu); }else { for(i=0;n1-n2>=0;i++) { n1-=n2; } yu=n1;shang=i; System.out.println(a+"÷"+b+" = "+shang+"···"+yu); } } } #3 运行结果 当a大于b时: 当a小于b时: 如有更好的思路欢迎各位留言交流(^▽^)
2023年04月23日
657 阅读
0 评论
3 点赞
2022-09-14
【C语言】给你的计算机利用MinGW快速部署GCC环境+Dev C++
近日学校发布课表了,寻思着周五就要上C语言程序设计了,作为一个C语言小白,当然得提前准备一下学习要用到环境了,无奈标准教材上并没有告诉我们该如何配置环境,尽管附录里面有一些说明,但是这对于我这样的C小白来说,这些说明并不友好,甚至不容易理解,接下来,NianSir会尽量的让这篇文章通俗易懂,那么,现在就开始吧!# 安装MinGW 我们可以利用MinGW为我们的计算机安装GCC环境,首先我们了解一下:GCC是什么?来看看百度百科的说法: GCC是以GPL许可证所发行的自由软件,也是GNU计划的关键部分。GCC的初衷是为GNU操作系统专门编写一款编译器,现已被大多数类Unix操作系统(如Linux、BSD、MacOS X等)采纳为标准的编译器,甚至在微软的Windows上也可以使用GCC。GCC支持多种计算机体系结构芯片,如x86、ARM、MIPS等,并已被移植到其他多种硬件平台 [1] 。GCC原名为GNU C语言编译器(GNU C Compiler),只能处理C语言。但其很快扩展,变得可处理C++,后来又扩展为能够支持更多编程语言,如Fortran、Pascal、Objective -C、Java、Ada、Go以及各类处理器架构上的汇编语言等,所以改名GNU编译器套件(GNU Compiler Collection) [1] 。 词条中的专业名称不了解也不需要强求,毕竟刚刚入门,我们只需要知道GCC环境下可以编译处理C语言、C++等就可以了,那么MinGW可以干什么呢? MinGW,是Minimalist GNU for Windows的缩写。它是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你在GNU/Linux和Windows平台生成本地的Windows程序而不需要第三方C运行时(C Runtime)库。MinGW 是一组包含文件和端口库,其功能是允许控制台模式的程序使用微软的标准C运行时(C Runtime)库(MSVCRT.DLL),该库在所有的 NT OS 上有效,在所有的 Windows 95发行版以上的 Windows OS 有效,使用基本运行时,你可以使用 GCC 写控制台模式的符合美国标准化组织(ANSI)程序,可以使用微软提供的 C 运行时(C Runtime)扩展,与基本运行时相结合,就可以有充分的权利既使用 CRT(C Runtime)又使用 WindowsAPI功能。 总而言之,就是一个便捷的GCC等环境的管理工具,可以更便捷的帮助我们配置需要的环境,接下来,我们就需要使用MinGW来配置我们的GCC环境,首先我们下载安装MinGW,可以选择去官网下载(国内访问较慢),NianSir也提供了便利的下载方式:https://pan.dcw.ink/?dl=4fbfbafe008ba75fd9ed0d5823113491 为了防止被恶意下载,需要输入访问密码:niansir 我们选择mingw-get-setup.exe下载并执行 点击Install开始安装 我们可以选择默认的安装路径(C盘下,不过不推荐,最好选择别的磁盘,例如D、E盘)点击Continue开始安装 稍等安装完成后,我们点击Continue,安装完成后,我们打开软件页面 鼠标右键图中两个选项,并且选择右键选项中的 “Mark for Installation”选项前出现了如图的转向箭头符号即表示选择成功,然后我们点击菜单栏的“Installation” 在弹出的窗口点击Apple开始安装我们选择的模块 注意,这个过程可能会很缓慢(资源从国外下载)并且部分网络可能会出现部分组件下载失败,例如这样的: 但根据亲身体验,大部分模块都在重试时勉强安装,但有个安装失败率很高的模块:gdb-7.6.1-1-mingw32-bin,为了更快的解决这个问题,NianSir也把这个安装包共享在了上面的链接中,下载对应压缩包并解压至MinGW所在的文件夹即可 完成模块安装后,我们就需要开始给系统添加环境变量,使命令提示符中可调用这些模块 注意,本演示中添加的位置是“D:\MinGW\bin”需要把这个位置换成自己安装MInGW的位置 接下来我们打开命令提示符测试是否成功 完成这些后,GCC环境配置就告一段落了,接下来我们还需要一个编辑工具 #安装Dev C++ C语言的编辑工具有很多,比如微软的VS code(功能强大,但对新手不友好),这里就不一一叙述了,NianSir给大家安利一款好友的编辑器:Dev C++,具体原因后面深入时自然会明白 同样,我们可以选择去官网下载(速度依旧是慢)也可以继续在上面的链接中下载(推荐),经过简单的安装后,我们就可以开始编写第一个测试程序了 至此教程就告一段落了,现在开始畅游在C的世界趴(*^▽^*) 有啥不明白的欢迎留言交流~ ※由于NianSir已经安装配置了GCC,为了更好地教程体验,本文部分图片来源于C语言中文网
2022年09月14日
701 阅读
0 评论
1 点赞