1. 程式人生 > >完整案例 || 一個簡易部落格的誕生

完整案例 || 一個簡易部落格的誕生

作為一個做技術,並身處IT行業的職業控,新技術每天更新換代已是司空見慣。而如何用最短的時間學會並運用,才是你與別人拉開差距的關鍵。

專案簡介

我們都知道,對80%的人來說,如果在工作中遇到問題,很多人的第一選擇便是百度尋找答案,而事實證明,這種方法也確實很有效果。但如果是一個IT問題,那恐怕會讓你失望了,百度的答案90%都是部落格中的內容。

既然部落格那麼受歡迎,所以今天給大家介紹一款個人部落格系統的搭建,雖然比不上CSDN部落格園那些大站,但是功能尚全,用於個人學習畢業設計還是綽綽有餘的。

系統介紹

該系統用Eclipse開發,採用SpringMVC框架,並結合MyBatis

技術,資料庫採用MySql,前臺採用流行的BootStrap開發。

首頁效果圖:

專案結構:

MySql中涉及的表

環境搭建

SpringMvc是一個表現層框架,從請求中接收傳入的引數,將處理後的結果資料返回給頁面展示。

配置結構:

其中ApplicationContext-dao.xmlSpringdao層的配置:

<beans>
    <!-- 載入配置檔案 -->
    <context:property-placeholder location="classpath:db.properties" />
    <!-- 資料庫連線池 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="maxActive" value="10" />
        <property name="maxIdle" value="5" />
    </bean>
    <!-- mapper配置 -->
    <!-- 讓spring管理sqlsessionfactory 使用mybatis和spring整合包中的 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 資料庫連線池 -->
        <property name="dataSource" ref="dataSource" />
        <!-- 載入mybatis的全域性配置檔案 -->
        <property name="configLocation" value="classpath:SqlMapConfig.xml" />
    </bean>
    <!-- 配置Mapper掃描器 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="cn.sl.dao"/>
    </bean>
</beans>

ApplicationContext-service.xml配置@Service註解掃描:

<beans >
<!-- @Service掃描 -->
<context:component-scan base-package="cn.sl.service"></context:component-scan>
</beans>

ApplicationContext-trans.xml配置事務:

<beans>
    <!-- 事務管理器 -->
    <bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 資料來源 -->
        <property name="dataSource" ref="dataSource" />
    </bean>
    <!-- 通知 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- 傳播行為 -->
            <tx:method name="save*" propagation="REQUIRED" />
            <tx:method name="insert*" propagation="REQUIRED" />
            <tx:method name="delete*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="find*" propagation="SUPPORTS" read-only="true" />
            <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
        </tx:attributes>
    </tx:advice>
    <aop:config>
        <aop:advisor advice-ref="txAdvice"
            pointcut="execution(* cn.sl.service.*.*(..))" />
    </aop:config>   
</beans>

SpringMvc.xml配置註解掃描,註解驅動,檢視解析器:

<beans>  
    <!-- @Controller註解掃描 -->
    <context:component-scan base-package="cn.sl.controller"></context:component-scan>  
    <!-- 表示當訪問主頁時自動轉發到index控制器 --> 
    <mvc:view-controller path="/" view-name="forward:/index"/>   
    <!-- 註解驅動 -->
    <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
    <!-- WEB-INF下頁面訪問js,css資源解決方法 --> 
    <mvc:default-servlet-handler></mvc:default-servlet-handler>
    <!-- 配置檢視解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">                
        <property name="prefix" value="/WEB-INF/"></property>   
        <property name="suffix" value=".jsp"></property>
    </bean>
    <!-- 配置自定義轉換器   
    -->
    <bean id="conversionService"
    class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="cn.sl.converter.CustomGlobalStrToDateConverter"/>
            </set>
        </property>
    </bean>
    <!-- 配置全域性異常處理器 -->
    <bean class="cn.sl.exception.CustomGlobalExceptionResolver"></bean> 
</beans>

SqlMapConfig.xmlMybatis核心配置檔案:

<configuration>
   <plugins>
        <!-- com.github.pagehelper為PageHelper類所在包名 -->
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <property name="dialect" value="mysql"/>
            </plugin>
    </plugins>
</configuration>

log4j.properties配置日誌,一般固定寫法:

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

db.properties配置資料庫連線:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/slblog?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root

以上配置好後,在web.xml中配置springMvc前端控制器spring監聽

<!-- 載入spring容器 -->
<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:ApplicationContext-*.xml</param-value>
</context-param>
<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> 
  <!-- springmvc前端控制器 -->
<servlet>
      <servlet-name>springMvc</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:SpringMvc.xml</param-value>
      </init-param>
</servlet>

該專案使用逆向工程,通過資料庫中的表來自動生成Mapper介面和對映檔案(單表增刪改查)和Po類。

通過以上配置,環境搭建完成。

專案深化

(1)路徑窄化。新建Controller,在class上新增@RequestMapping(url)指定通用請求字首,限制此類下的所有方法請求url必須以請求字首開頭,通過此方法對url進行分類管理。

//舉例說明
@RequestMapping放在類名上邊,設定請求字首: 
@Controller
@RequestMapping("/article")

//方法名上邊設定請求對映url:
@RequestMapping放在方法名上邊,如下:
@RequestMapping("/queryArticle")

//訪問地址為:/article/queryArticle

(2)引數繫結

簡單引數繫結,適用於引數較少。

public ModelAndView userSubmit(String email, String password,HttpServletRequest request) throws Exception{
        HttpSession session = request.getSession();
        ModelAndView modelAndView = new ModelAndView();
        List<User> list = userService.selectEmail(email);
        ...
}    

如果前臺提交的引數很多,可以考慮使用pojo接收資料。但是要求pojo物件中的屬性名和表單中inputname屬性一致,如果引數複雜,可以考慮使用包裝pojo

//jsp介面
<div class="container" style="margin-top: 80px">
   <form class="form-signin" id="register" action="${pageContext.request.contextPath }/login/regisSub" method="post">
     <h2 class="form-signin-heading">Please sign in</h2>
     <label for="inputEmail" class="sr-only">Email address</label>
     <input type="email" name="email" id="inputEmail">    
     <label for="inputPassword" class="sr-only">Password</label>
     <input type="password" name="password" id="inputPassword"> 
     <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
   </form>
</div>
//controller
public String regisSub(User user) throws Exception{
        ...         
}    

(3)controller中方法返回值

推薦使用ModelAndViewcontroller方法中定義ModelAndView物件並返回,物件中可以新增model資料、指定view

@RequestMapping("/queryuse")
public ModelAndView queryuse(Model model) throws Exception{
    ModelAndView mv = new ModelAndView();
    List<User> list = userService.query();
    int total = list.size();
    model.addAttribute("list", list);//新增資料
    mv.setViewName("admin/userquery");//返回指定前臺頁面        
    return mv; 
}

返回字串:這裡可以指定邏輯檢視名,通過檢視解析器解析為物理檢視地址。

@RequestMapping("/userdetail")
public String userdetail(User user,Model model) throws Exception{
    int n = userService.update(user);
    ...
    return "front/userInfo"; //返回指定前臺路徑
}

(4)對資料庫操作

使用逆向工程自動生成Mapper,簡單快捷操作資料庫進行增刪改查。

@Override
public List<Admin> queryList() throws Exception {
    AdminExample adminExample = new AdminExample();
    Criteria createCriteria = adminExample.createCriteria();
    createCriteria.andSuperidIsNotNull();
    List<Admin> list = adminMapper.selectByExample(adminExample);
    return list;        
}

以上就是今天內容,主要介紹關鍵注意事項,至於各種功能按照以上方法延伸即可。

如果你有任何問題,歡迎留言,我們共同交流討論。需要原始碼的請關注微信公眾號“SL社群”獲取。

更多內容:微信關注和置頂公眾號“SL社群”(slshequ)