完整案例 || 一個簡易部落格的誕生
作為一個做技術,並身處IT行業的職業控,新技術每天更新換代已是司空見慣。而如何用最短的時間學會並運用,才是你與別人拉開差距的關鍵。
專案簡介
我們都知道,對80%的人來說,如果在工作中遇到問題,很多人的第一選擇便是百度尋找答案,而事實證明,這種方法也確實很有效果。但如果是一個IT問題,那恐怕會讓你失望了,百度的答案90%都是部落格中的內容。
既然部落格那麼受歡迎,所以今天給大家介紹一款個人部落格系統的搭建,雖然比不上CSDN
、部落格園
那些大站,但是功能尚全,用於個人學習
及畢業設計
還是綽綽有餘的。
系統介紹
該系統用Eclipse
開發,採用SpringMVC
框架,並結合MyBatis
MySql
,前臺採用流行的BootStrap
開發。
首頁效果圖:
專案結構:
MySql中涉及的表
環境搭建
SpringMvc
是一個表現層框架,從請求中接收傳入的引數,將處理後的結果資料返回給頁面展示。
配置結構:
其中ApplicationContext-dao.xml
是Spring
在dao
層的配置:
<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.xml
是Mybatis
核心配置檔案:
<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
物件中的屬性名和表單中input
的name
屬性一致,如果引數複雜,可以考慮使用包裝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
中方法返回值
推薦使用ModelAndView
:controller
方法中定義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)。