淘淘商城(SpringMVC+Spring+Mybatis) 是傳智播客在2015年9月份錄製的,幾年過去了。因爲視頻裏課上老師敲的代碼和項目筆記有些細節上存在出入,只有根據日誌報錯信息做出適當的調整變動才能跑通項目。爲了方便廣大自學Java同仁的共同進步,我將持續更新這個網絡實戰項目練習的內容,着重指出符合當下開發環境下的內容勘誤修訂。css
https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040html
第04項目:淘淘商城(SpringMVC+Spring+Mybatis) 的學習實踐總結【次日】node
第04項目:淘淘商城(SpringMVC+Spring+Mybatis) 的學習實踐總結【第三天】
//商品分類管理 @Service public class ItemCatServiceImpl implements ItemCatService { @Autowired private TbItemCatMapper itemCatMapper; @Override public List<EUTreeNode> getItemCatList(long parentId) { //使用mybatis的逆向工程生成的mapper接口和XML文件 //由於單表查詢而且非主鍵字段,因此用example查詢 //1.建立查詢條件 TbItemCatExample example = new TbItemCatExample(); Criteria criteria = example.createCriteria(); criteria.andParentIdEqualTo(parentId); //2.根據條件查詢 List<TbItemCat> list = itemCatMapper.selectByExample(example); List<EUTreeNode> resultList = new ArrayList<>(); //把列表轉換成treeNodeist for (TbItemCat tbItemCat : list) { EUTreeNode node = new EUTreeNode(); node.setId(tbItemCat.getId()); node.setText(tbItemCat.getName()); node.setState(tbItemCat.getIsParent()?"closed":"open"); resultList.add(node); } //返回最終結果 return resultList; } }
/** * 商品分類管理controller * */ @Controller @RequestMapping("/item/cat") public class ItemCatController { @Autowired private ItemCatService itemCatService; @RequestMapping("/list") @ResponseBody //此行底下的private和public均可以,不影響功能實現 public List<EUTreeNode> getItemCatList(@RequestParam(value="id",defaultValue = "0")Long parentId){ List<EUTreeNode> list = itemCatService.getItemCatList(parentId); return list; } }
yum install gcc-c++安裝gcc編譯器linux
大部分Linux發行版的默認帳戶是普通用戶,而更改系統文件或者執行某些命令,須要root身份才能進行,這就須要從當前用戶切換到root用戶,Linux中切換用戶的命令是su -nginx
nginx的http模塊使用pcre來解析正則表達式c++
yum install -y pcre pcre-devel
zlib庫提供了不少種壓縮和解壓縮的方式,nginx使用zlib對http包的內容進行gzipweb
yum install -y zlib zlib-devel
nginx不只支持http協議,還支持https(即在ssl協議上傳輸http),因此須要在linux安裝openssl庫。正則表達式
yum install -y openssl openssl-devel
文件夾的新建能夠用GUI實現,nginx-1.16.1.tar的解壓能夠命令行也能夠用圖形化界面操做完成。spring
tar -zxvf nginx-1.16.1.tar.gz cd nginx-1.16.1把nginx-1.16.1.tar.gz複製到Downloads目錄下,解壓該壓縮文件到默認的當前目錄,點擊Extract執行。vim
注意:下邊將臨時文件目錄指定爲/var/temp/nginx,須要在/var下建立temp及nginx目錄
cd /var mkdir temp cd /var/temp mkdir nginx
參考技術博客: Linux系統下文件夾的新建與刪除操做
選中nginx-1.16.1文件夾,右鍵單擊在彈出菜單上選擇open in Terminal
su -
cd /home/kangmianfeng/Downloads/nginx-1.16.1
在命令行裏複製下面的nginx安裝默認配置信息以下:
./configure \ --prefix=/usr/local/nginx \ --pid-path=/var/run/nginx/nginx.pid \ --lock-path=/var/lock/nginx.lock \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --with-http_gzip_static_module \ --http-client-body-temp-path=/var/temp/nginx/client \ --http-proxy-temp-path=/var/temp/nginx/proxy \ --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \ --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \ --http-scgi-temp-path=/var/temp/nginx/scgi編譯安裝
make make install
安裝成功查看安裝目錄 :
cd /usr/local/nginx
ls
SecureCRT用來在Windows環境下遠程登陸Linux服務器的SSH鏈接配置
nginx安裝成功,啓動nginx,便可訪問虛擬機上的nginx:
本教程中的nginx安裝位置
cd /usr/local/nginx/sbin/
./nginx
注意:執行./nginx啓動nginx,這裏能夠-c指定加載的nginx配置文件,以下:
./nginx -c /usr/local/nginx/conf/nginx.conf
#複製一份默認的配置文件從新命名爲:taotao-nginx.conf
cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/taotao-nginx.conf#在taotao-nginx.conf定義圖片HTTP服務器的反向代理路由規則,修改文件須要root權限
#chmod 777使得全部用戶能夠讀寫和執行該文件
chmod777 /usr/local/nginx/conf/taotao-nginx.conf
location / { root /home/ftpuser/www; index index.html index.htm; }用命令進入你的站點根目錄
cd /home/ftpuser/www
而後輸入指令
chmod a+w .四種解決Nginx出現403 forbidden 報錯的方法
在訪問的根目錄下要有index.html不然會報403錯誤
在VMware14虛擬機的CentOS 7系統中,安裝與配置vsftpd【Linux安裝ftp組件】
FileZilla Client 成功的鏈接到Linux主機的vsftpd服務如圖所示:
修改/etc/selinux/config配置文件,設置SELINUX=disabled
vim /etc/selinux/config
查看SELINUX狀態的命令:
sestatus
先進行Linux防火牆設置
CentOS7默認使用的是firewall做爲防火牆,這裏改成iptables防火牆
一、關閉firewall:
systemctl stop firewalld.service #中止firewall
systemctl disable firewalld.service #禁止firewall開機啓動
二、安裝iptables防火牆
yum install iptables-services #安裝
三、修改文件配置容許80端口
vi /etc/sysconfig/iptables #編輯防火牆配置文件
按i進入文本編輯 在原文檔中找到
-A INPUT -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT
在該行下面添加
-A INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT
:wq! #保存退出
systemctl restart iptables.service #最後重啓防火牆使配置生效
systemctl enable iptables.service #設置防火牆開機啓動
systemctl restart network
systemctl stop NetworkManager
systemctl disable NetworkManager
systemctl start network.service
<dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> </dependency>
@Test public void testFtpClient() throws Exception { //建立一個FtpClient對象 FTPClient ftpClient = new FTPClient(); //1.建立FTP鏈接。 ftpClient.connect("192.168.179.128", 21); //2.登陸FTP服務器,使用用戶名和密碼 ftpClient.login("ftpuser", "taotaoftp"); //讀取本地文件 File file = new File("F:\\aky.png"); FileInputStream inputStream = new FileInputStream(file); //3.設置上傳的路徑 ftpClient.changeWorkingDirectory("/home/ftpuser/www/images"); //4.修改上傳文件的格式、方法的形參是枚舉enum ftpClient.setFileType(FTP.BINARY_FILE_TYPE); //5.執行上傳文件 //第一個參數:服務器端文件名 //第二個參數:上傳文件的inputStream ftpClient.storeFile("hello.png", inputStream); //關閉鏈接 ftpClient.logout(); }
//測試FtpUtil工具類的使用 @Test public void testFtpUtil() throws Exception { // 讀取本地文件 FileInputStream inputStream = new FileInputStream(new File("F:\\aky.png")); // 實用工具類 FtpUtil.uploadFile("192.168.179.128", 21, "ftpuser", "taotaoftp", "/home/ftpuser/www/images", "/2019", "hello2.png", inputStream); }
public static PictureResultpackage com.taotao.common.pojo; /** * 上傳圖片的返回結果 */ public class PictureResult { private int error; private String url; private String message; private PictureResult(int error, String url, String message) { this.error = error; this.url = url; this.message = message; } //成功時調用的方法 public static PictureResult ok(String url) { return new PictureResult(0, url, null); } //失敗時調用的方法 public static PictureResult error(String message) { return new PictureResult(1, null, message); } public int getError() { return error; } public void setError(int error) { this.error = error; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
import com.taotao.common.pojo.PictureResult; import com.taotao.common.utils.FtpUtil; import com.taotao.common.utils.IDUtils; import com.taotao.service.PictureService; @Service public class PictureServiceImpl implements PictureService { //用@Value註解取出.properties配置文件中的值 @Value("${FTP_ADDRESS}") private String FTP_ADDRESS; @Value("${FTP_PORT}") private Integer FTP_PORT; @Value("${FTP_USER_NAME}") private String FTP_USER_NAME; @Value("${FTP_PASSWORD}") private String FTP_PASSWORD; @Value("${FTP_BASE_PATH}") private String FTP_BASE_PATH; @Value("${IMAGE_BASE_URL}") private String IMAGE_BASE_URL; @Override public PictureResult uploadPicture(MultipartFile uploadFile) { //判斷上傳圖片是否爲空 if (null == uploadFile || uploadFile.isEmpty()) { return PictureResult.error("上傳圖片爲空"); } //取文件擴展名 String originalFilename = uploadFile.getOriginalFilename(); String ext = originalFilename.substring(originalFilename.lastIndexOf(".")); //生成新文件名能夠是時間+隨機數生成 // 取原始文件名 String oldName = uploadFile.getOriginalFilename(); // 生成新文件名 String newName = IDUtils.genImageName(); newName = newName + oldName.substring(oldName.lastIndexOf(".")); // 圖片上傳到FTP服務器 //文件在服務器的存放路徑,應該使用日期分隔的目錄結構 DateTime dateTime = new DateTime(); String imagePath = dateTime.toString("/yyyy/MM/dd"); try { FtpUtil.uploadFile(FTP_ADDRESS, FTP_PORT, FTP_USER_NAME, FTP_PASSWORD, FTP_BASE_PATH, imagePath,newName, uploadFile.getInputStream()); } catch (Exception e) { e.printStackTrace(); return PictureResult.error("上傳圖片失敗"); } //返回結果,生成一個能夠訪問到圖片的url返回 return PictureResult.ok (IMAGE_BASE_URL+ imagePath +"/"+ newName); } }
<!-- 文件上傳組件 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> </dependency>
還須要在springmvc.xml配置多部件解析器:
sprinmvc.xml<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 掃描controller的註解,別的不掃描 --> <context:component-scan base-package="com.taotao.controller" /> <!--開啓對SpringMVC註解的支持:處理器映射器,處理器適配器 --> <mvc:annotation-driven /> <!-- 配置視圖解析器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> <!-- 不攔截釋放靜態資源的映射 --> <mvc:resources location="/WEB-INF/js/" mapping="/js/**" /> <mvc:resources location="/WEB-INF/css/" mapping="/css/**" /> <mvc:resources location="/WEB-INF/img/" mapping="/img/**" /> <mvc:resources location="/WEB-INF/plugins/" mapping="/plugins/**" /> <!-- 定義文件上傳解析器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 設定默認編碼 --> <property name="defaultEncoding" value="UTF-8"></property> <!-- 設定文件上傳的最大值5MB,5*1024*1024 --> <property name="maxUploadSize" value="5242880"></property> </bean> </beans>
end
================================================
參考資料:
CentOS7 Failed to start LSB: Bring up/down解決方法
end