内容有点乱,有兴趣的同伙可依照后面的案例结构结合文章进行阅读 

 和网上购买东西一样,你可以在不登录的状态下去浏览商品,但是当你想把自己中意的东西加入购物车或是收藏起来就需要你拥有自己的账号然后登录后才可以进一步操作,上次我们的翻页操作也就是可以供大家进行商品的浏览,所以这次我们先完成登录操作(具体登录所需我们直接插入数据表,不再对注册做处理)。

关于登录操作的具体操作步骤

  • 向数据表 userinfo 中插入数据(user_id,user_name,Account_id)
  • 在翻页操作页面我们已经将登录的超链接加入,点击 Login 超链接跳转到登录页面(login.jsp)
  • 在登录页面输入我们提前插入数据库的信息完成登录并会提示你登录成功
  • 登录成功后点击“开始购物”到商品展示页面将会显示欢迎信息 “欢迎您,xxx”

关于登录操作的具体思路

  • login.jsp 页面点击登录发送请求到 Servlet 处理
  • Servlet 方法获取输入框内容,并根据用户所输入的内容新建 UserInfo 对象
  • 根据 UserInfo 对象查询数据库进行匹配(所有需要在 Servlet 中进行逻辑处理的代码我们都将之封装到 BookService 类中,本方法为 Long login(Userinfo userinfo))
  • 若匹配所得到的个数为 1,则表明用户输入的信息正确,跳转到登陆成功页面,否则提示错误信息

关于登录操作的代码展示

  • login.jsp
 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Login</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/login.do" method="post">
UserName: <input type="text" name="userName"/><br><br>
AccountId: <input type="text" name="accountId"/><br><br> <button type="submit">Submit</button>
</form>
</body>
</html>

  如代码所示我们根据用户名和其所对应的 accountId 进行判别

  • Servlet 中对应的 login() 方法
 /*
* 用户登录操作(只需用户名和账户号,没有密码)
* */
protected void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取 session 对象
HttpSession session = getSession(request);
// 获取所登录账户的用户名
String userName = request.getParameter("userName");
// 获得该用户所对应的 accountId
String accountIdStr = request.getParameter("accountId");
int accountId = -1;
try {
accountId = Integer.parseInt(accountIdStr);
} catch (NumberFormatException e) {
}
// 利用登录名和 accountId 新建 UserInfo 对象
Userinfo userinfo = new Userinfo(userName, accountId);
// 从数据库中判断是否存在和登录账户所匹配的账户
long count = bookService.login(userinfo);
// 若匹配则 count 为 1
if (count == 1) {
// 若匹配则将用户信息存入 session,在后面购物车操作中会用到
session.setAttribute("userInfo", userinfo);
// 并重定向到登录成功页面
response.sendRedirect(request.getContextPath() + "/success/successLogin.jsp");
} else {
// 否则转发到登录失败页面
response.sendRedirect(request.getContextPath() + "/error/errorLogin.jsp");
}
}

  和上面所表述的一样我们根据匹配数进行判断信息是否正确(我只是为了写案例练习,以简单为主)

  • BookService 的 login(UserInfo userInfo) 方法
     /*
* 登录操作
* */
public long login(Userinfo userinfo) {
Integer userId = userinfoDao.getUserId(userinfo);
userinfo.setUserId(userId);
return userinfoDao.login(userinfo);
}

  在此 login 方法中,我们调用了数据表 userInfo 对应的实现类的 login(UserInfo userInfo) 方法,并为传入的 userinfo 对象的 userId 进行了赋值操作,在后面所说的 login 方法中我们和数据库进行互动返回匹配数

  • UserInfo 接口实现类 UserInfoImpl 的 login(UserInfo userInfo) 方法
     /*
* 登录操作,根据请求参数获取登录账户在数据库中是否存在,根据匹配数判断
* */
@Override
public long login(Userinfo userinfo) {
String sql = "SELECT COUNT(user_id) FROM userinfo WHERE user_name = ? AND account_id = ?";
long count = (Long) getCount(sql, userinfo.getUserName(), userinfo.getAccountId());
return count;
}

  登录操作也到此为止,接下来为有关购物车的操作(以下操作均以已登录为基础)。

关于购物车操作的具体步骤

  • 商品展示页面上对自己中意的商品点击加入购物车,商品展示页面顶部显示提示信息 
  • 点击查看购物车根据所登录用户进入对应的购物车中
  • 如上图所示,我们进入对应的购物车后将显示我们已经添加的商品的详细信息
  • 点击删除我们可以直接将该商品从购物车中清除
  • 在 BookCount 栏中我们可以对购物车中该商品的数量进行更改,若输入 0 则等同于从购物车中清除该商品
  • 点击继续购物我们将回到商品展示页面
  • 点击清空购物车则删除所有购物车中的商品,并提示删除成功(在清空以及删除之前我们可以为之加上一个确认框以防止误点)
  • 点击上一步所示的返回继续购物将回到商品展示页面
  • 有关结账操作我们下次继续

关于购物车操作的具体思路

  • 点击加入购物车发送请求到 Servlet 方法 addToCart,并附带参数查询条件和页码以及对应商品的 id
  • 在 Servlet 的 addToCart 方法中获取商品 id 以及 session (在登录的时候我们将用户信息保存到了 session 中,就为了现在用)
  • 从 session 中获取到 userInfo 对象,根据商品 id 获取到 Book 对象
  • 调用 Service 类的  void addToCart(Books books, Integer userId) 方法将对应的商品加入购物车,在此方法中调用购物车数据表对应的实现类(ShoppingCartImpl)的方法将对应的商品信息以及用户信息插入数据表中
  • 将 Book 对象存入 request 域对象中以便在商品展示页面显示提示信息 “你已将XXX加入购物车”
  • 点击查看购物车发送请求到 Servlet 方法 showCart,并附带参数查询条件和页码
  • 在执行 showCart 方法之前我们把购物车显示页面进行封装为一个类 ShoppingCartPage,包括属性 List<ShoppingCartItem> shoppingCartItemList, Integer totalBookCount, Integer totalBookMoney,便于操作
  • 在 showCart 方法中我们首先获取到购物车页面 ShoppingCartPage 对象(在 Service 方法中填充 ShoppingCartPage 对象)以及 totalBookCount 属性
  • 根据获取到的 totalBookCount 属性判断购物车中是否有商品,若有则显示购物车页面,否则提示错误信息
  • 我们在 ShoppingCart 接口实现类中去填充 ShoppingCartPage 页面,避免在 ShoppingCartPage 中填充可以降低耦合度
  • 将获取到的 shoppingCartPage 对象添加到 session 域中,以便在购物车页面进行显示
  • 在 shoppingCart.jsp 页面利用 session 域对象中的 shoppingCartPage 对象显示购物车中所有商品信息
  • 点击删除发送请求到 Servlet 的 deleteItem 方法进行处理
  • 调用 Service 方法的 delete,从数据库中删除该条数据,删除后返回购物车页面
  • 点击清空购物车发送请求到 Servlet 的 truncated 方法进行处理,也就是执行 SQL 语句清空 shoppingCart 数据表
  • 点击后提示清空成功,并可选择继续购物
  • 点击继续购物返回商品展示页面
  • 若你在查看购物车的时候你正在浏览特定条件下的第几页那么从购物车中返回商品展示页面你依旧在你原来的页面,这个依赖于每次点击超链接都将页码以及查询条件加在 URL 后

关于购物车操作的代码展示

  • Servlet 的方法 addTocart (加入购物车操作)
 /*
* 将商品添加至购物车
* */
protected void addToCart(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取到要添加到购物车中的商品的 id
String idStr = request.getParameter("id");
// 获取 session 对象
HttpSession session = getSession(request);
// 获取到登录时存入的 UserInfo 对象
Userinfo userinfo = (Userinfo) session.getAttribute("userInfo");
// 如果 UserInfo 对象为空,则表明用户没有登录进行加入购物车操作
if (userinfo == null) {
// 若为空那么就重定向到错误页面提示用户需要登录
response.sendRedirect(request.getContextPath() + "/error/emptyAccount.jsp");
// 并结束本方法的执行
return;
} int id = -1;
try {
id = Integer.parseInt(idStr);
} catch (NumberFormatException e) {}
// 若用户登录了,则利用 id 获取到该商品所对应的对象
Books books = bookService.getBook(id);
// 执行加入购物车操作,即加入购物车所对应的数据表
bookService.addToCart(books, userinfo.getUserId());
// 并将加入购物车的商品对象存入 request 中
request.setAttribute("books", books);
// 转发回页面,在页面利用 request 域中的对象显示信息“你已经将 XXX 加入购物车”
request.getRequestDispatcher("/query.do").forward(request, response);
}
  • Service 的方法 getBook(int id)
     /*
* 获得 book 对象
* */
public Books getBook(int id) {
return booksDao.getBook(id);
}
  • BookDao 实现类的 getBook(int id) 方法
     /*
* 根据 id 获取某书籍对应的对象
* */
@Override
public Books getBook(int id) {
String sql = "SELECT id, author, title, price, publish_date publishDate, sales_count salesCount, store_number storeNumber, remark " +
"FROM books WHERE id=?";
Books books = getValue(sql, id);
return books;
}
  • Service 的 addTocart 方法
   /*
* 加入购物车操作
* */
public void addToCart(Books books, Integer userId) {
// 获取某一商品的数量
Integer count = shoppingCart.getBookCount(books.getTitle());
if (count != null) {
// 若购物车中存在则更新数量即加 1
shoppingCart.updateBookCount(books.getTitle());
} else {
// 若不存在则加入数据表
shoppingCart.insertData(books, userId);
}
}
  • ShoppingCart 实现类中相关方法
     /*
* 根据 cart_name 获取该商品的数量
* */
@Override
public Integer getBookCount(String cart_name) {
String sql = "SELECT cart_count cartCount FROM shoppingcart WHERE cart_name=?";
Integer count = (Integer) getCount(sql, cart_name);
return count;
}
     /*
* 更新购物车中某商品的数量加 1,每次点击加入购物车使其对应的数量加 1
* */
@Override
public void updateBookCount(String cart_name) {
String sql = "UPDATE shoppingcart SET cart_count = cart_count + 1 WHERE cart_name=?";
update(sql, cart_name);
}
     /*
* 将某商品加入购物车,点击加入购物车,若购物车中没有此商品则将其加入数据表并设其数量为 1
* */
@Override
public void insertData(Books books, Integer userId) {
String sql = "INSERT INTO shoppingcart (user_id, cart_count, cart_name, cart_price) VALUES(?, 1, ?, ?)";
insert(sql, userId, books.getTitle(), books.getPrice());
}
  • 商品展示页面显示欢迎信息和提示将某本书加入购物车的信息 bookList.jsp
     <c:if test="${!empty requestScope.books}" var="books">
<br>你已经把 ${requestScope.books.title} 加入购物车<br><br>
</c:if>
<c:choose>
<c:when test="${empty sessionScope.userInfo}">
<a href="${pageContext.request.contextPath}/loginPage/login.jsp?pageNo=${requestScope.page.pageNo}">LoGin</a></c:when>
<c:otherwise>
欢迎您,${sessionScope.userInfo.userName}&nbsp;&nbsp;&nbsp;
<a href="${pageContext.request.contextPath}/showCart.do?pageNo=${requestScope.page.pageNo}">查看购物车</a>&nbsp;&nbsp;&nbsp;
</c:otherwise>
</c:choose>
  • Servlet 的方法 showCart(查看购物车操作)
  /*
* 点击查看购物车所执行的方法
* */
protected void showCart(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 从数据中获取属性以新建购物车页面对象
ShoppingCartPage shoppingCartPage = bookService.getShoppingCartPage();
// 获取购物车中总的商品数量
int totalNum = shoppingCartPage.getTotalBookCount();
// 判断总数量是否合法
if (totalNum > 0) {
// 将购物车页面对象存入 session中,以便在页面进行显示
getSession(request).setAttribute("shoppingCartPage", shoppingCartPage);
// 转发到购物车页面,在页面进行显示
request.getRequestDispatcher("/showView/shoppingCart.jsp").forward(request, response);
// 结束执行该方法
return;
}
// 若购物车中没有商品则重定向到错误页面提示购物车中没有商品
response.sendRedirect(request.getContextPath() + "/error/empty.jsp");
}
  • Service 的方法 getShoppingCartPage
     /*
* 获取购物车显示页面
* */
public ShoppingCartPage getShoppingCartPage() {
return shoppingCart.getShoppingCartPage();
}
  • ShoppingCart 实现类相关方法
     /*
* 获取购物车页面显示的信息所构成的页面对象
* */
@Override
public ShoppingCartPage getShoppingCartPage() {
ShoppingCartPage shoppingCartPage = new ShoppingCartPage();
// 设置显示页面的 list
shoppingCartPage.setShoppingCartItemList(getCartItemList());
// 设置购物车中所有商品的总数量
shoppingCartPage.setTotalBookCount(getTotalCount());
// 设置购物车中所有商品的总价钱
shoppingCartPage.setTotalBookMoney(getTotalMoney());
return shoppingCartPage;
}
     /*
* 获取购物车表中所有的商品并构建为 list
* */
@Override
public List<ShoppingCartItem> getCartItemList() {
String sql = "SELECT cart_id cartId, user_id userId, cart_name cartName, cart_price cartPrice, cart_count cartCount FROM shoppingcart";
List<ShoppingCartItem> shoppingCartItems = getList(sql, null);
return shoppingCartItems;
}
    /*
* 获取购物车中所有商品的总数量
* */
public Integer getTotalCount() {
Integer totalCount = 0;
List<ShoppingCartItem> shoppingCartItemList = getCartItemList();
for (ShoppingCartItem shoppingCartItem : shoppingCartItemList) {
totalCount = shoppingCartItem.getCartCount() + totalCount;
}
return totalCount;
}
     /*
* 获取购物车中所有商品的总价钱
* */
public Integer getTotalMoney() {
Integer totalMoney = 0;
List<ShoppingCartItem> shoppingCartItemList = getCartItemList();
for (ShoppingCartItem shoppingCartItem : shoppingCartItemList) {
totalMoney = shoppingCartItem.getCartCount() * shoppingCartItem.getCartPrice() + totalMoney;
}
return totalMoney;
}
  • ShoppingCartPage
 package com.book.store.web;

 import com.book.store.domain.ShoppingCartItem;

 import java.util.List;

 /**
* Created by shkstart on 2017/12/13.
*/
public class ShoppingCartPage { private List<ShoppingCartItem> shoppingCartItemList;
private Integer totalBookCount;
private Integer totalBookMoney; public List<ShoppingCartItem> getShoppingCartItemList() {
return shoppingCartItemList;
} public void setShoppingCartItemList(List<ShoppingCartItem> shoppingCartItemList) {
this.shoppingCartItemList = shoppingCartItemList;
} public Integer getTotalBookCount() {
return totalBookCount;
} public void setTotalBookCount(Integer totalBookCount) {
this.totalBookCount = totalBookCount;
} public Integer getTotalBookMoney() {
return totalBookMoney;
} public void setTotalBookMoney(Integer totalBookMoney) {
this.totalBookMoney = totalBookMoney;
} @Override
public String toString() {
return "ShoppingCartPage{" +
"shoppingCartItemList=" + shoppingCartItemList +
", totalBookCount=" + totalBookCount +
", totalBookMoney=" + totalBookMoney +
'}';
}
}
  • Servlet 的 deleteItem 方法 (删除购物车某商品)
    /*
* 购物车操作之删除某一商品
* */
protected void deleteItem(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取当前操作的商品
String cartIdStr = request.getParameter("cartId"); Integer cartId = -1;
try {
cartId = Integer.valueOf(cartIdStr);
} catch (NumberFormatException e) {
}
// 将删除方法(操作数据库)封装在数据库中
bookService.deleteItem(cartId);
// 删除成功后转发到购物车页面
request.getRequestDispatcher("/showCart.do").forward(request, response);
}
  • Service 的 deleteItem 方法
     /*
* 删除购物车中的商品
* */
public void deleteItem(Integer cartId) {
shoppingCart.delete(cartId);
}
  • ShoppingCart 实现类的 delete 方法,从数据库中删除
     /*
* 执行删除操作,删除某一个商品
* */
@Override
public void delete(Integer cartId) {
String sql = "DELETE FROM shoppingcart WHERE cart_id = ?";
update(sql, cartId);
}
  • Servlet 的 truncated 方法
     /*
* 清空购物车
* */
protected void truncated(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 在 bookService 中执行清空
bookService.truncated();
// 转发到清空成功的页面
request.getRequestDispatcher("/success/success.jsp").forward(request, response);
}
  • bookService 的 truncated 方法
     /*
* 清空购物车
* */
public void truncated() {
shoppingCart.deleteAll();
}
  • shoppingCart 实现类的 deleteAll 方法
     /*
* 清空购物车
* */
@Override
public void deleteAll() {
String sql = "TRUNCATE shoppingcart";
update(sql, null);
}
  • shoppingCart.jsp
 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>ShoppingCart</title>
<script type="text/javascript" src="${pageContext.request.contextPath}/jquery-1.7.2.js"></script>
<%@ include file="/commons/queryCondition.jsp" %>
<script type="text/javascript">
$(function () {
$("input").change(function () {
var count = $(this).val();
var cartId = $(this).parent().parent().find("input").val(); var url = "${pageContext.request.contextPath}/updateCount.do"; if (count == 0) {
var aTag = $(this).parent().parent().find("a");
// 触发
aTag.trigger("click");
return;
} var args = {"time": new Date, "count": count, "cartId": cartId}; $.getJSON(url, args, function (data) {
window.location.reload();
$("#totalMoney").text(data);
})
})
})
</script>
</head>
<body>
<div>
<c:forEach items="${requestScope.messageList}" var="message">
${message}&nbsp;&nbsp;&nbsp;&nbsp;
</c:forEach>
<c:if test="${!empty requestScope.messageList}">库存不足!</c:if>
${requestScope.moneyMessage }
<table cellpadding="7">
<tr>
<th>BookName</th>
<th>BookCount</th>
<th>BookPrice</th>
<th></th>
</tr>
<c:forEach items="${sessionScope.shoppingCartPage.shoppingCartItemList}" var="shoppingCart">
<tr>
<input type="hidden" value="${shoppingCart.cartId}">
<td>${shoppingCart.cartName}</td>
<td><input type="text" size="1" value="${shoppingCart.cartCount }"></td>
<td>${shoppingCart.cartPrice}</td>
<td><a href="${pageContext.request.contextPath}/deleteItem.do?cartId=${shoppingCart.cartId}">删除</a></td>
</tr>
</c:forEach>
<tr>
<td>总价钱</td>
<td id="totalMoney">${sessionScope.shoppingCartPage.totalBookMoney}</td>
</tr>
<tr>
<td><a href="${pageContext.request.contextPath}/query.do?pageNo=${param.pageNo}">继续购物</a></td>
<td><a href="${pageContext.request.contextPath}/truncated.do?pageNo=${param.pageNo}">清空购物车</a></td>
<td>
<a href="${pageContext.request.contextPath}/check.do?pageNo=${param.pageNo}">结账</a></td>
</tr>
</table>
</div>
</body>
</html>

  其中的 JSON 处理为修改购物车中某商品的数量,当修改为 0 的时候等同于删除操作(利用 trrigger 函数)

  • 保留查询条件的操作是每次点击超链接之后将对应的查询条件加到 URL 之后便可,我们将点击超链接并添加 URL 部分提取出来为每个需要的加入(

    <%@ include file="/commons/queryCondition.jsp" %>

    ),可使代码更加简洁。

  • 共同部分(queryCondition.jsp)
 <%@ page contentType="text/html;charset=UTF-8" language="java" %>

 <script type="text/javascript">
$(function () {
$("a").click(function () {
var hrefVal = $(":hidden").serialize();
var href = this.href + "&" + hrefVal;
window.location.href = href;
return false;
})
})
</script> <input type="hidden" name="minPrice" value="${param.minPrice}">
<input type="hidden" name="maxPrice" value="${param.maxPrice}">

案例结构

  在此感谢您的阅读,希望你可以提出宝贵的意见,若有错的地方还望指出,谢谢!!!

Web 小案例 -- 网上书城(三)的更多相关文章

  1. WEB 小案例 -- 网上书城(一)

    距离上次写博客有两周了吧,最多的原因就是自己期末考试了,上课没听就只能在期末狠狠的复习了,毕竟已经挂科了.当然还是因为自己懒吧!!!废话不多说开始我们今天的正题,网上书城! 一. 新建数据表(MySQ ...

  2. WEB 小案例 -- 网上书城(四)

    针对于这个小案例我们今天讲解结账操作,也是有关这个案例的最后一次博文,说实话这个案例的博文写的很糟糕,不知道该如何去表述自己的思路,所以内容有点水,其实说到底还是功力不够. 处理思路 点击结账,发送结 ...

  3. WEB 小案例 -- 网上书城(二)

    寒假结束了,自己的颓废时间同样结束了,早该继续写博客了,尽管我的格式以及内容由于各种原因老被卡,但必须坚持写下去!!! 上次我们对于本案例的数据库部分进行了阐述,这次主要接着上次的内容分享本案例的翻页 ...

  4. Vue.js小案例、生命周期函数及axios的使用

    一.调色框小案例: 随着三个滑动框的变化,颜色框的颜色随之改变 1.1.实例代码 <!DOCTYPE html> <html lang="en" xmlns:v- ...

  5. 数据库的小案例(三):用递归实现TreeView层级显示

    从这个小案例我学到了不少知识.这些无论如何无法从书里得来.正所谓实践出真知,学习编程需要大量实践这句话永不过时. 首先:好的代码和坏的代码带来的性能上的差异很明显.好的策略可以让你的程序运行速度大大加 ...

  6. 02SpringMvc_springmvc快速入门小案例(XML版本)

    这篇文章中,我们要写一个入门案例,去整体了解整个SpringMVC. 先给出整个项目的结构图:

  7. Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例

    Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例 继上篇json解析,我用了原生的json解析,但是在有些情况下我们不得不承认,一些优秀的json解析框架确实十分的 ...

  8. 黑马day14 踢人小案例

    本案例介绍: 使用监听器来实现踢人小案例,仅仅有管理员才有踢人的功能. 1.搭建开发环境,导入本案例须要的jar包.以及一个准备好的数据库工具类:提供数据源的方法...当中我已经在数据库中加入了三个用 ...

  9. JavaWeb_(Struts2框架)Ognl小案例查询帖子

    此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...

随机推荐

  1. Android 进程间通信

    什么鬼!单例居然失效了,一个地方设置值,另个地方居然取不到,这怎么可能?没道理啊!排查半天,发现这两就不在一个进程里,才恍然大悟-- 什么是进程 按照操作系统中的描述:进程一般指一个执行单元,在 PC ...

  2. CentOS安装EPEL Remi

    EPEL,Remi 因为Centos官方源很多软件都没有,编译安装又比较麻烦,可以安装EPEL源Remi源解决此问题. CentOS 5.x : wget http://dl.fedoraprojec ...

  3. [Python Study Notes]CS架构远程访问获取信息--Client端v2.0

    更新内容: 1.增加内存信息获取 2.增加电池信息获取 3.增加磁盘信息获取 4.重新布局窗体 5.增加窗体名称 6.增加连接成功之前,不可按压 效果图: '''''''''''''''''''''' ...

  4. iOS 关于文件的操作

    最近做东西,遇到了使用文件方面的问题,花了点时间把文件研究了一下! 一  关于文件路径的生成 我用的方法是: -(NSString*)dataFilePath { NSArray * paths = ...

  5. Linux 6.4 设置yum 为centOS源

    一. 删除Redhat 自带的yum // root 用户执行 rpm -aq|grep yum|xargs rpm -e --nodeps 二 .下载CentOS 的 yum 安装文件 wget h ...

  6. php提供的sapi有哪些?CGI、FastCGI、php-fpm、php-cgi解释

    一.前言 一直对PHP的sapi是什么东西好奇,在网上一查都是各种说fpm cgi fastcgi php-cgi 直到看了鸟哥的这篇文章介绍戳这里,看到源码下的sapi目录才有所了解. 二.sapi ...

  7. Visual Studio 2017 Enterprise 发布 15.3.2 版,附离线安装包下载。

    Visual Studio 2017 Enterprise 更新至 15.3.2 ,本安装包使用微软原版安装文件,配合layout指令全量下载后制作,内置中文语言包,包含 Visual Studio ...

  8. 函数重载overload

    与void show(int a, char b, double c){}构成重载的有: a) void show(int x, char y, double z){} //no b) int sho ...

  9. Mac下VirtualBox共享文件夹设置

    环境:CentOS7.2最小化安装 步骤: 先安装必要软件包 yum install -y gcc gcc-devel gcc-c++ gcc-c++-devel make kernel kernel ...

  10. ubuntu设置网络

    二 .设置无线网络 1.首先确认一下你的无线驱动已经安装 方法一,查看一下ubuntu右上角的网络设置中有无线连接,如果有说明已经驱动了,ubuntu自带的就会驱动无线网卡. 方法二,iwconfig ...