完整案例 || 一个简易博客的诞生

作为一个做技术,并身处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)

猜你喜欢

转载自blog.csdn.net/wangjunjun_0826/article/details/85130612