• 近期将进行后台系统升级,如有访问不畅,请稍后再试!
  • 极客文库-知识库上线!
  • 极客文库小编@勤劳的小蚂蚁,为您推荐每日资讯,欢迎关注!
  • 每日更新优质编程文章!
  • 更多功能模块开发中。。。

从零开发一个Java Web项目要点

前言
本文章详细的列出了开发一个传统 JavaWeb 项目需要注意的要点,从环境准备开始到三层架构搭建,需要注意的地方全部罗列出来。

第一部分:环境准备

1.  Maven 命令创建 web 骨架
mvn archetype:create -DgroupId=net.rocketa -DartifactId=mywebapp -DarchetypeArtifactId=maven-archetype-webapp
注意 web servlet 版本(web.xml,3.1),Junit 版本指定为 4.X(这样 Spring 好通过注解的方式来运行单元测试)
2. 注意在 IDEA 中需要设置好 MAVEN 工程的Sources/Tests/Resources/Test Resources属性。
3. 日志依赖
slf4j:规范和接口
具体的日志实现有:
log4j、logback、common-logging
因此我们一般是使用 slf4j 接口+一种具体的日志实现+slf4j 和这个具体日志实现的依赖整合
4. 数据库依赖
有 2 个依赖,需要注意,一个是驱动,一个是数据库连接池(C3P0,DBCP…)。
驱动 JAR 包是运行期需要包含,编译期不需要的。
5. 持久层框架依赖
说白了,DAO 层的框架依赖:MyBatis or Hibernate or ….
比如除 MyBatis 本身的依赖需要引入之外,还需要引入 MyBatis 和 Spring 的整合依赖。
6. Web 层依赖
比如,JSP 中使用到的一些JSTL、标签、Ajax 访问 JSON等,还有需要注意的是,在编译期需要引入servlet-api。
7. Spring 核心依赖
spring-core、spring-beans、spring-context
8. Spring 和 DB 之间的整合依赖
Spring 是需要介入 DB 的管理的,比如它的声明式事务。
spring-jdbc、spring-tx
9. Spring 对 Web 的一些整合依赖
spring-web、spring-webmvc
10. Spring 对 Junit 的支持依赖
spring-test
NOSQL 对事务的支持不是很好,它主要追求的是性能、高可用、分布式。
MySQL 等关系型数据库对事务的支持是很成熟的,也是很可靠的落地方案。

第二部分:DAO 层

NOSQL 对事务的支持不是很好,它主要追求的是性能、高可用、分布式。
MySQL 等关系型数据库对事务的支持是很成熟的,也是很可靠的落地方案。
1. 
可以在项目中建立一个 SQL 文件,便于 SQL 的管理。
注意,表的存储引擎(事务的支持:innodb)、自动增长的特性、编码、主键和索引。
一个良好的习惯是:为所有的表都添加一个创建时间字段,用于记录,方便排查。
应该为表名、列名添加注释,方便其他工程师查阅。
应该注意 SQL 技巧,比如插入存在唯一约束的表中,如果出现冲突不想报错的话,可以:insert ignore into ….(可以通过返回的影响行数来进行判断)
2Dao 层实体
一些业务对象的建立,setter/getter/toString 等就不说了,需要特别注意的是,除了表的字段之外,还需要什么属性?这里涉及到一个一对一、一对多,多对多的概念!
3. Dao 层接口和 mapper sql
MyBatis 的特点从 SQL(参数+sql)映射到 Entity/List(定制 SQL、自由传递参数、结果集自动赋值)
使用 MyBatis 的方式SQL 写在 XML 中,或者注解提供 SQL。更加推荐的是 XML,因为更加灵活,XML 提供的动态拼接功能也是比注解简单的多。
一个全局的 mybatis 配置文件+具体的 SQL 文件+DAO 接口:让我们只需要设计接口,关注业务逻辑,解放出来。
在全局 mybatis 配置文件中重点注意是否开启驼峰转换,获取数据库自增主键,列别名替换列名等。
注意 DAO 接口和具体的 SQL 文件之间的对应关系。
具体 SQL 写法中,比如#{},<![CDATA[…]]>等需要引起注意。
输入参数类型 parameterType,如果是多个基本类型,那么不用给出来。
即便返回的是 List 对象,我们的 resultType 依然指定的是集合中的对象类型。
在 Mybatis 的 SQL 文件中是可以通过 OGNL 表达式来对对象中的一些对象类型的属性进行赋值的!
表名.xxx  或者 表名.xxx as yyy 对于 Mybatis 而言,会忽略表名.前缀,也会忽略 as。
另外,注意在 Dao 接口中,如果方法有多个基本类型参数,别忘了通过@Param 来进行运行期参数标记!
总结:Dao 层的工作逐渐演变成接口设计和 SQL 编写了,这种代码和 SQL 的分离方式,便于我们进行 review,而 Dao 的拼接将在 Service 层完成。
4. 一些优化配置
比如,对带包路径的类型进行简化,通过配置扫描包。
比如,批量扫描 SQL 文件,通过自动扫描配置文件。
5. mybatis 和 spring 需要整合
spring 需要接管数据库
JDBC 的一些连接信息,数据库连接池的一些配置信息,就是配置 DataSource 的过程。
spring 和 mybatis 整合的核心
SqlSessionFactory 是 MyBatis 的配置核心,把 DataSource 注入,并指明 MyBatis 的全局配置文件位置,typeAliasesPackage 扫描,mapper 文件位置扫描等。
spring 通过动态代理帮助生成 Dao 的代理实现类(MapperScannerConfigurer)
注入 SqlSessionFactory(通过 sqlSessionFactoryBeanName),指明 Dao 接口的包路径 basePackage
总之,配置的一项原则是:约定优于配置!!!
第三部分:进行 Spring Junit 单元测试
当我们进行了一些配置,写了一些 SQL,Dao 接口后,应该要进行 Spring Junit 单元测试,可以通过 IDEA 快速的生成测试用例(很好用的一个功能,因为 IDEA 可以帮助我们快速在 test 下建立与 dao/service 接口的同级目录下生成用例)
在用例中,我们只需要在类上打上注解:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({“classpath:spring 配置文件”})
加载 Spring 容器后,我们就可以在用例中注入对象,开始测试了!!!
第四部分:Service 层
Service 层需要关注几个要点:
业务对象的封装、web 和 service 之间进行数据传递的 DTO、异常的处理(业务异常)
注意 Spring 事务回退的默认机制是:运行时异常。
因此,我们在 service 层默认定义的业务异常一般 extends RuntimeException。
一般而言,通过:
try{

}catch(业务异常1 e1){

}catch(业务异常2 e2){

}catch(Exception e){

thrownew 业务异常(…);

}

要知道,service 层可能会发生业务异常,也可能发生一些其他异常,为了Spring 都可以感知到,这里会把 Exception 异常转化成运行时异常
第五部分:Controller 层
1. Restful
一种优雅的 URI 表述方式;资源的状态;状态的转移
Restful 示例:
GET     /product/list   查询操作
GET    /product/{productId}/detail
GET     /product/time/now
POST    /product/{productId}/execution 添加、修改操作【非幂等性】
POST    /product/{productId}/{userId}/order
DELETE  /product/{productId}/delete  删除操作
PUT       修改操作【幂等性】
URL 设计:
/模块/资源/{标示}/集合 1/…
2.Controller 中请求方法的细节处理
考虑几个方面:请求参数绑定、请求方式限制、转发与重定向、数据模型赋值、JSON 数据返回、Cookie 访问
@RequestMapping(value=“/{productId:\d+}/detail”,method=RequestMethod.GET,produces={“application/json;charset=UTF-8”})
@ResponseBody
publicString detail(
@PathVariable(“productId”) Long  productId,@CookieValue(value=“userId”,required=false) Long userId,Model model){
# return“rediect:/xxx/yyy”
# return“forward:/xxx/yyy”
# return“view”
}
3.整合配置 Spring MVC
在 web.xml 中配置 DispatcherServlet 拦截请求,并指出 Spring 相关的配置文件。
开启 Spring MVC 的注解模式:
<mvc:annotation-driven/>
静态资源请求采用默认的 servlet 配置
<mvc:default-servlet-handler/>
配置 JSP、ViewResolver 的 prefix「如/WEB-INF/jsp」suffix如.jsp
扫描 web 相关的 Controller:
<context:component-scan base-package=””>
OK,先整理到这里。

丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:从零开发一个 Java Web 项目要点
喜欢 (0)
[247507792@qq.com]
分享 (0)
勤劳的小蚂蚁
关于作者:
温馨提示:本文来源于网络,转载文章皆标明了出处,如果您发现侵权文章,请及时向站长反馈删除。

欢迎 注册账号 登录 发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00