第04項目:淘淘商城(SpringMvc+Spring+Mybatis) 的學習實踐總結【第三天】

淘淘商城(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) 的學習實踐總結【第三天】

03.第三天(實現商品添加)

 

//商品分類管理

@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;
    }
    
}

 1、使用Eclipse的Search功能檢索

 

 

 2、使用Eclipse的快捷鍵插入get/set方法

 

 3、教學視頻和淘淘商城-day03教案中代碼的方法名稱不一致性

 

     4、圖片上傳服務器的搭建

 

      

 Windows10操做系統下安裝並使用VMware-workstation-full-15.5.0加載安裝CentOS7後檢查是否已安裝GCC、PCRE、Zlib等實現nginx的運行環境

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

 

5、Linux系統下的基本操做與Nginx的安裝配置

文件夾的新建能夠用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目錄

選中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

VMware運行CentOS重啓虛擬機後,啓動Nginx報錯"/var/run/nginx/nginx.pid" failed (2: No such file or directory)解決方法

 注意:執行./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;
        }

文件夾的訪問權限不夠,因此用ip或者域名訪問是訪問不到的

用命令進入你的站點根目錄

cd /home/ftpuser/www 

而後輸入指令

chmod a+w .

四種解決Nginx出現403 forbidden 報錯的方法

在訪問的根目錄下要有index.html不然會報403錯誤

6、 vsftpd服務在CentOS 7中的安裝、配置、使用

在VMware14虛擬機的CentOS 7系統中,安裝與配置vsftpd【Linux安裝ftp組件】

FileZilla Client 成功的鏈接到Linux主機的vsftpd服務如圖所示:

 

 

 七 、SELinux 全稱是Security Enhanced Linux,關掉SELinux,並重啓系統讓其生效。

 修改/etc/selinux/config配置文件,設置SELINUX=disabled

vim /etc/selinux/config

查看SELINUX狀態的命令:

sestatus

 

 8、 關閉CentOS 7的默認防火牆或者切換到iptables防火牆 

先進行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


 

九 、FTPclient上傳組件的使用

        <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);

    }

   

10、PictureServiceImpl 的視頻和筆記代碼變量名不一致的小細節

 

package 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;
    }


}
public static PictureResult

 

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配置多部件解析器:

<?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>
sprinmvc.xml

 

end

================================================

參考資料:

CentOS7 Failed to start LSB: Bring up/down解決方法

end

相關文章
相關標籤/搜索