0%

走进JAVA-Web

企业级的Java开发目前都趋于成熟,如果一开始就着手基于框架的Java web开发,虽然开发日常需求CURD没有什么困难,但是在研究项目搭建时就会相对迷茫,为什么这样配置就可以达到效果呢?

框架帮我们做了很多时间,让我们只需要关注业务开发,而不需要了解具体项目搭建过程;

为了能让自己具备从项目创建到稳定业务需求开发的能力,就有必要了解下最原始的Java web 项目是怎么运作的;

工程结构

Java Web 演变过程

Servlet –> Spring MVC –> Spring Boot –> Sping Cloud

Servlet:最开始的Java工程师应该都是全栈工程师,因为其不仅需要负责后台业务需求,还要负责前端界面开发,如JSP等,后台开发是一定要的;我将这个时候的Java web 理解为模式最简单的Java web ;

这个时候的Java web 一般都包括:前端JSP, 后端Listener,filter, servlet,以及Service,DAO等;

Spring MVC :Spring MVC 是一个专为Java web 开发打造的框架;提供了依赖注入,AOP 等重要技术简化开发;

随着互联网的发展,分工越来越细,伴随着移动互联网的发展,Java Web 不仅仅为浏览器的客户端提供服务,也为APP客户端提供接口服务;
后台开发就从之前的全栈解放出来,单纯的做后台开发;

Spring Boot : Spring MVC 的升级,虽然使用Spring MVC 已经简化了Java web的开发,但是还是有很多不方便的地方,比如web.xml的配置等,Spring boot 在Spring mvc 的基础上解决了xml配置等问题,也更加切合新的互联网后台开发模式。

工程结构

在解释后台开发开始之前,有必要了解下,项目的大概结构:

工程结构

区别于普通的java项目 ,Java Web 项目目录下面有一个webapp的文件夹;

1
2
3
4
-|webapp
-|resources // 用于存放资源文件,如 js ,css ,images 等
-|WEB-INF // 用于存放只用于服务器访问的资源
-|web.xml // webapp 的 配置文件

web.xml 可以用于配置icon?, display-name?, description?, distributable?,
context-param*, filter*, filter-mapping*, listener*, servlet*,
servlet-mapping*, session-config?, mime-mapping*, welcome-file-list?,
error-page*, taglib*, resource-env-ref*, resource-ref*, security-constraint*,
login-config?, security-role*, env-entry*, ejb-ref*, ejb-local-ref*;

其中配置的顺序最好也是上面这个顺序,不然会有一个红色的报错,虽然不影响运行;

我们这里重点关注listener , filter ,servelet。

Listener

Listener 监听器:根据类型的不同可以分为三类:监听服务器的ServletContextListener,监听session的SessionListener,以及监听Request的RequestListener;

ServletContextListener

1
2
3
4
5
6
7
8
9
10
11
12
13
public interface ServletContextListener extends EventListener {
void contextInitialized(ServletContextEvent var1);

void contextDestroyed(ServletContextEvent var1);
}

<listener>
<listener-class>com.conan.listener.ApplicationListener</listener-class>
</listener>
<listener>
<listener-class>com.conan.listener.ApplicationListener2</listener-class>
</listener>

contextInitialized :监听服务,服务启动的时候会调用该方法;可以在该方法中做一些初始化操作,比如数据库驱动等;

contextDestroyed: 服务关闭调用该方法,用来释放资源;

可以有多个ServletContextListener的实现,执行的顺序,是web.xml配置的顺序。

SessionListener

1
2
3
4
5
public interface HttpSessionListener extends EventListener {
void sessionCreated(HttpSessionEvent var1);

void sessionDestroyed(HttpSessionEvent var1);
}

sessionCreated:监听会话Session创建

sessionDestroyed:监听会话Session销毁

SessionListener 主要作用用于记录页面访问量,当前访问人数。

RequestListener

1
2
3
4
5
public interface ServletRequestListener extends EventListener {
void requestDestroyed(ServletRequestEvent var1);

void requestInitialized(ServletRequestEvent var1);
}

requestInitialized: 监听Request的创建

requestDestroyed: 监听Request的销毁

Filter

Filter :我这里将其过滤器,但是我在晚上查询到的资源有将其描述为“拦截器”;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public interface Filter {
void init(FilterConfig var1) throws ServletException;

void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;

void destroy();
}

<filter>
<filter-name>filter</filter-name>
<filter-class>com.conan.filter.HttpRequestFilter</filter-class>
<init-param>
<param-name>namespace</param-name>
<param-value>xxxx</param-value>
</init-param>
</filter>


<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/List.action</url-pattern>
</filter-mapping>

<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/InitTalk</url-pattern>
</filter-mapping>

Filter 不具备直接中断请求并返回响应给客户端的能力;通常最后将请求响应参数做一系列操作之后,执行FilterChain的doFilter(),放行请求,但是可以转发forward请教;

如果想起到拦截的作用,必须是在doFilter 不执行FilterChain的doFilter()方法;

可以设置匹配规则,不需要严格匹配;可以利用 “*” ,“.”去定义匹配规则;

Servlet

HttpServlet 请求最终被处理的地方,更加请求协议类型,复写相应的方法(doGet,doPost,doDelete等),并做相应的逻辑操作。

HttpServlet生命周期

init() :HttpServlet的实例,在第一次访问,被加载的时候会执行一次,后面再有请求访问,也不会在执行该方法;

doXxx():每次请求都将执行,用于编写业务需求;

destroy():服务器关闭时执行,不管服务器是正常关闭,还是强制关闭;

1
2
3
4
5
6
7
8
9
10
<servlet>
<servlet-name>ListServlet</servlet-name>
<servlet-class>com.conan.servlet.ListServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>ListServlet</servlet-name>
<url-pattern>/List.action</url-pattern>
</servlet-mapping>

GitHub登录不了?信任该网站之后再登录。