传统java web工程简介

java

记录一下java web工程的熟悉过程.

工程结构

首先从工程结构,应用分层开始.

一个好的工程可以最大程度复用已有代码.从而保证效率.这也是一个好的工程结构需要做到的事情.

经典的工程结构如下图所示, 分为5层, 每层处理不同业务逻辑. 通常下层代码不能调用上层代码. 通过manager的组合封装 可以更好地复用代码.


具体细节可以在中看到[阿里java开发手册]

(https://github.com/alibaba/p3c/blob/master/阿里巴巴Java开发手册(详尽版).pdf)

web.xml 文件作用

在最初的java web 工程中, 使用web.xml作为项目的配置文件, 用来配置Filter,Listener,Servlet等.

web容器的加载顺序ServletContext -> context-param -> listener -> filter -> servlet。

其中值得注意的点是:

  1. servlet配置中通过1 来控制servlet启动顺序.
  2. 不同开发/部署环境可以通过jar包外web.xml对配置属性进行覆盖.避免重复修改. 当然机器多了web.xml修改也是一件非常头痛的问题.这也是我理解的为什么需要对他进行优化的原因之一.

具体细节可以参考这篇博文这里就不细讲了 https://www.jianshu.com/p/285ad45f60d1

但是由于种种原因web.xml并不是非常理想的项目配置方式. 例如随着项目扩大而变得巨大的特性等等.

,随着servlet3.0规范, 通过注解, 取代了web.xml中对servlet, filter等的配置. 再到后来springboot利用注解完全不再需要web.xml进行配置.

当然,在只使用的情况下我们并不需要知道具体细节.

代码细节

Servlet层(请求及响应)

servlet层负责解析请求, 并将请求结果返回到client端. 在不使用任何框架情况下. 使用javax.servlet中的类来进行解析请求. 将协定好的字符串(通常是json)写入到ServletOutputStream中返回到请求端.

public class XXServlet extends HttpServlet{

public static final ObjectMapper OBJ_MAPPER = new ObjectMapper();

static {

OBJ_MAPPER.configure(Feature.ALLOW_SINGLE_QUOTES, true);

OBJ_MAPPER.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);

}

// 使用xml中的参数初始化servlet

@Override

public void init(ServletConfig config) throws ServletException

{

super.init(config);

}

@Override

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

request.setCharacterEncoding(DEF_CHARSET);

String xx = request.getParameter("xx");

xx= new String(xx.getBytes("ISO-8859-1"),"utf-8");

Result result = new result();

String json = OBJ_MAPPER.writeValueAsString(result);

writeResponse(response, json);

}

@Override

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{

....same as doGet;

}

private void writeResponse(HttpServletResponse response, String str)

throws IOException {

response.setContentType("text/json; charset=utf-8");

ServletOutputStream os = response.getOutputStream();

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os,

DEF_CHARSET));

bw.write(str);

bw.close();

}

}

Service, Manager层

这里通常是java业务代码. 值得注意的是tomcat等服务器会自动启用多线程调用servlet类.因此Service, manager, dao层通常都采用单例的写法, 以保证线程安全.

Dao层

以mysql为例. 采用jdbc连接池的方式进行连接.具体细节也不展开说了.

使用时可能会存在的一些问题(不止是数据库, 也可能是其他数据源).

  1. try catch后结果没有clear. 导致数据出问题.
  2. getConnection后没有关闭导致线程超时.

接下来会简要介绍一下springboot 的使用.

以上是 传统java web工程简介 的全部内容, 来源链接: utcz.com/z/392744.html

回到顶部