Java web项目结构目录
前言
Java web 是指用Java开发的web项目。Java web开发至今已有两年之久,期间项目都是在框架上开发,比如Spring MVC,对底层知之甚少。大学期间虽然已经走马观花似的学过了Servlet,但是那时候对web开发没有一个整体的概念,很多东西也没有彻底弄明白,而且到现在也遗忘的差不多了。重新开始学习Servlet,能够帮助我们了解web项目的基础,很好的回答“为什么要用spring mvc”这个问题。
目录结构图(maven)
- 一个最简单的Java web项目(maven)可以分为三个文件夹:java,resources,webapp和一个pom.xml文件
- java文件夹存放Java代码;resources存放与java代码相关的配置文件;webapp存放与web项目相关的文件(比如css,js,web.xml文件)
一个可以运行的web项目目录(web)
不管是我们用maven构建的web项目,还是纯手写的web项目,如果想在应用容器里面运行,最终都得转成以下的形式,因为像Tomcat,jetty这些java容器都只识别这样的项目。
- webapp根目录下的文件及文件夹会被放到这个tomcat上的运行包的根目录下面。
- WEB-INF包里面会多了一个classes和lib的文件夹,classes放的是java源码及java的配置文件
- lib放的是项目依赖的包
Servlet 了解
servlet有什么用
用户请求一个地址,比如xxx/oneservlet,请求到了服务器,然后依据web.xml中的设置调用对应的servlet,这个servlet可能会从数据库里面提取数据,然后结合生成对应的jsp返回到web容器,再由web容器返回给客户。
当有多个请求时,servlet会创建多个线程。
Servlet的生命周期
一般的生命周期都会有出生,运行,死亡几个步骤,servlet也不例外。与servlet生命周期相关的方法有以下几个:
- init()
Servlet创建的时候会调用init方法。那什么时候Servlet会被调用呢?可以根据web.xml中的servlet标签的<load-on-startup>来判断
- loadOnStartup < 0,servlet默认是这种情况,在这种情况下,web启动时不会创建Servlet类的,所以也不会调用init方法;只有当请求过来了,才会创建servlet类。
- loadOnStartup >= 0, web启动的时候就会创建servlet类,启动顺序根据load-on-startup的值来,值越小,创建的顺序越早,当值为0的时候最早被创建。
servlet的初始化,我们可以放一些参数到web.xml中,然后在init的时候提取。
- service()
当一个请求过来,容器就会开辟一个新的线程,然后执行service方法。如果我们覆盖了service的代码,那么程序会执行service的代码,如果我们没有覆盖service的代码,在httpservlet中,service是根据请求类型,然后选择是调用doget还是dopost。 - destroy()
当服务器被关闭的时候会调用该方法
成为servlet的三种方法
- 实现Servlet接口
- 继承HttpServlet类
- 继承GenericServlet类
HttpServlet extend GenericServlet implement Servlet
Servlet 项目搭建(结合maven)
- pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.huangzp.test</groupId>
<artifactId>testservlet</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/jstl/jstl -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>8.1.16.v20140903</version>
<configuration>
<stopKey>stop</stopKey>
<stopPort>8080</stopPort>
<webAppSourceDirectory>src/main/webapp</webAppSourceDirectory> <!-- 静态资源位置 -->
<scanIntervalSeconds>3</scanIntervalSeconds>
<webApp>
<contextPath>/</contextPath> <!-- webapp的上下文路径 -->
</webApp>
<connectors>
<connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
<port>80</port>
<maxIdleTime>60000</maxIdleTime>
</connector>
</connectors>
<contextHandlers>
<contextHandler implementation="org.eclipse.jetty.webapp.WebAppContext">
<resourceBase>/src/main/webapp</resourceBase>
<contextPath>/</contextPath>
</contextHandler>
</contextHandlers>
</configuration>
</plugin>
</plugins>
<finalName>testservlet-web</finalName>
</build>
</project>
只需要引入javax.servlet-api,jstl两个包,用的jetty来运行项目。
- web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>shooter</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>shooter.root</param-value>
</context-param>
<servlet>
<servlet-name>Hello Servlet</servlet-name>
<servlet-class>com.huangzp.test.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello Servlet</servlet-name>
<url-pattern>/Hello</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>15</session-timeout>
</session-config>
</web-app>
需要配置servlet,url-pattern表示匹配的url。
- TestServlet.java
package com.huangzp.test;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class TestServlet extends HttpServlet{
@Override
public void init() throws ServletException {
super.init();
System.out.println("--------init--------");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("--------service--------");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("application/json; charset=utf-8");
String jsonStr = "{\"name\":\"huangzp\",\"age\":\"24\"}";
//首先通过一个HttpServletResponse获取一个PrintWriter对象.
//PrintWriter是一个输出流,是以字符为单位对输出信息进行处理的一个类。
PrintWriter pw=resp.getWriter();
pw.println(jsonStr);
//既然是流对象,就必须要关闭流对象。
pw.close();
}
@Override
public void destroy() {
System.out.println("--------destroy--------");
super.destroy();
}
}
我们自己编写的Servlet类要继承HTTPServlet类,然后重写init,service,destroy的方法,Serlvet在service中处理请求。