今天试图在服务器上搭建一个web服务器,顺便回顾了java web项目的入门,使用Servlet处理HTTP请求,并记录日志等操作。当很久没有做过web项目时,有些东西还是很容易忘记的。

Maven配置

使用maven进行整个项目的构建,使用intellij idea IDE,填写完groupId和artifactId之后,声明packaging元素为war包,在build中注意需要设置war-plugin的webResources:

<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<webResources>
<resource>
<directory>web</directory>
</resource>
</webResources>
</configuration>
</plugin>
</plugins>

其中的dependency项中除了要包含的依赖jar包外,有些编译期依赖的jar包也需要填写(scope=provided),比如javaee-api。

Servlet编写和配置

Java Web项目中使用Servlet来处理具体的http请求,请求url的处理是配置在webResources目录下的web.xml文件中的:

<servlet>
<servlet-name>monitor</servlet-name>
<servlet-class>具体的ServletClass</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>monitor</servlet-name>
<url-pattern>/monitor</url-pattern>
</servlet-mapping>

其中servlet-mapping中的/monitor就是对应的处理URL,也即http://主机名称:web服务器端口/web项目的Context/url-pattern。

在Servlet中通常继承javax.servlet.http.HttpServlet类,重写其中的doGet和doPost方法(分别处理GET和POST请求)。事实上,Servlet中包含HTTP的所有请求方式的相关方法(PUT, DELETE等)一般情况下,我们对于数据量稍微比较大的数据都使用POST方式提交HTTP请求(GET方式一般用于查询资源,会限制提交数据长度,GET请求的参数数据会显示在浏览器的地址栏URL中)。

通过HttpServletRequest.getParameter(parameterName)来获取请求中提交的参数数据,这里指的仅仅是Request范围的参数名。

Servlet的数据返回

如何返回Servlet中的数据,这需要我们使用参数中的HttpServletResponse的相关方法了,其中getWriter()方法提供了一个输出流,可以将html中的数据写入到这个输出流中,这样在浏览器就能以页面到形式查看到这个html页面。

Servlet可以以Java程序的方式对请求进行处理并返回,可以说,Servlet是Java代码中包含html页面,如果生成的html页面比较大,其中的getWriter().print()的代码会非常恐怖而且难以理解。JSP正是基于这个原因出现的,JSP使用的方式是html页面加入java代码(scriptlet),在html页面较大而java逻辑较少的情况下比较适用。

在Servlet中也可以根据处理逻辑来forword到对应的jsp页面,使用如下的方法:

   getServletConfig().getServletContext().getRequestDispatcher(jsp的相对路径).forward(request,response);

我们知道HTTP返回的代码代表这不同的含义,比如

1xx-信息提示;
2xx-成功;
3xx-重定向;
4xx-客户端错误;
5xx-服务器错误;

我们可以手动在HttpServletResponse.setStatus()方法中指定返回的HTTP Code,给客户端对应的提示。

在Web项目处理逻辑中,经常需要处理本地资源,比如读取本地(Web项目中)的配置文件。这就需要使用ServletContext中的getResource系列方法, getResource和getResourceAsStream方法以“/”开头的字符串为参数,它指定上下文根路径的资源相对路径。文档的层级可能存在于服务器的文件系统,war文件,远程服务器或者在一些其它位置中,注意在使用完成后,需要将流关闭。

日志(log4j)配置

在进行任何项目开发都需要记录必要的日志,尤其是对应web项目的开发,你需要能够查询到对应的处理错误,这里使用了log4j来进行日志的处理。

日志的配置需要进行初始化,这个初始化的时机需要在web项目启动时做。这里就需要为log4j单独创建一个Servlet,用于初始化。在web.xml中建立对应的Servlet,并不需要声明servlet-mapping,因为它并不负责真正处理HTTP请求。

<servlet>
<servlet-name>log4j-init</servlet-name>
<servlet-class>com.xxx.monitor.servlet.Log4jInitServlet</servlet-class>
<init-param>
<param-name>log4j</param-name>
<param-value>WEB-INF/log4j.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

将其load-on-startup声明的顺序改成1,这样就能保证在其他Servlet初始化之前,Log4j已经初始化完毕。其中的init-param参数指定了log4j配置文件对应WebResources的位置,这在ServletConfig中可以通过getInitParameter来进行获取。

在Log4jInitServlet中,由于不需要处理HTTP的各种类型请求,只需要重写初始化方法init:

@Override
public void init(ServletConfig servletConfig) throws ServletException {
String prefix = servletConfig.getServletContext().getRealPath("/");
String filePath = String.format("%s/%s", prefix, servletConfig.getInitParameter("log4j"));
FileInputStream inputStream = null;
Properties properties = new Properties();
try {
inputStream = new FileInputStream(new File(filePath));
properties.load(inputStream);
String logFilePath = String.format("%s%s", prefix, properties.getProperty("log4j.appender.R.File"));
properties.setProperty("log4j.appender.R.File", logFilePath); PropertyConfigurator.configure(properties);
} catch (IOException e) {
throw new ServletException("log4j module initialized failed!");
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
}
}
}
}

这里log4j.properties中的log4j.appender.R.File参数只是指定输出log文件的相对地址,这就需要我们使用servletConfig.getServletContext().getRealPath("/")将其拼接成运行时的绝对地址。

HTTP请求测试

在编写代码完后,我们都需要对其正确性进行测试。Java中提供了对于HTTP请求发送的相关API,在这个基础上,我们进行测试代码的编写:

URL postUrl = null;
try {
postUrl = new URL(url);
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
HttpURLConnection connection = null;
DataOutputStream dataOutputStream = null;
BufferedReader reader = null;
try {
connection = (HttpURLConnection) postUrl.openConnection();
//Read from the connection
connection.setDoInput(true);
//http body is in the content
connection.setDoOutput(true);
//we use post method
connection.setRequestMethod("POST");
//post can't use caches
connection.setUseCaches(false);
connection.setInstanceFollowRedirects(true); connection.connect();
dataOutputStream = new DataOutputStream(connection.getOutputStream());
String content = "userName=clamaa&password=bbb&json=jsonstring";
dataOutputStream.writeBytes(content);
dataOutputStream.flush();
dataOutputStream.close(); reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8")); System.out.println("====================");
System.out.println("read line started...");
StringBuilder result = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
result.append(line).append(System.getProperty("line.separator"));
}
System.out.println("====================");
return result.toString();
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (connection != null) {
connection.disconnect();
}
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
}
}
}

至此,一个基本的Java项目就已经编写完毕,由于整个项目使用maven来构建的,只要在项目目录下,执行maven clean install命令,将生成的target/下的war包部署到tomcat的webapp目录下即可。

一个简单的Java Web项目搭建流程的更多相关文章

  1. 一个简单的java web项目 仅实现添加

    连接数据库已经进行判断 要求: 1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分) 2登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母.数字组成.(1分 ...

  2. Intellij IDEA Java web 项目搭建

    Java web 项目搭建 简介 在上一节java web环境搭建中,我们配置了开发java web项目最基本的环境,现在我们将采用Spring MVC+Spring+Hibernate的架构搭建一个 ...

  3. Java web 项目搭建

    Java web 项目搭建 简介 在上一节java web环境搭建中,我们配置了开发java web项目最基本的环境,现在我们将采用Spring MVC+Spring+Hibernate的架构搭建一个 ...

  4. 使用eclipse创建一个简单的Java Web应用程序

    关于Java JDK/JRE.Tomcat的配置等等都没什么好说的,主要记录一下使用Eclipse创建web工程时的一些点以及说一说自己用IDEA的创建失败的过程(IDEA没运行成功...暂时不想弄了 ...

  5. 一个简单的Java web服务器实现

    前言 一个简单的Java web服务器实现,比较简单,基于java.net.Socket和java.net.ServerSocket实现: 程序执行步骤 创建一个ServerSocket对象: 调用S ...

  6. 做一个完整的Java Web项目需要掌握的技能[转]

    转自:http://blog.csdn.net/JasonLiuLJX/article/details/51494048 最近自己做了几个Java Web项目,有公司的商业项目,也有个人做着玩的小项目 ...

  7. 做一个完整的Java Web项目需要掌握的技能

    最近自己做了几个JavaWeb项目,有公司的商业项目,也有个人做着玩的小项目,写篇文章记录总结一下收获,列举出在做项目的整个过程中,所需要用到的技能和知识点,带给还没有真正接触过完整Java Web项 ...

  8. 带领技术小白入门——基于java的微信公众号开发(包括服务器配置、java web项目搭建、tomcat手动发布web项目、微信开发所需的url和token验证)

    微信公众号对于每个人来说都不陌生,但是许多人都不清楚是怎么开发的.身为技术小白的我,在闲暇之余研究了一下基于java的微信公众号开发.下面就是我的实现步骤,写的略显粗糙,希望大家多多提议! 一.申请服 ...

  9. 在cmd命令行使用Maven Archetype插件 generate命令创建简单的java web项目

    前提: 1.下载apache-maven:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache ...

随机推荐

  1. APUE学习笔记——5缓冲Buffering、流、文件对象

    缓冲的几个基本概念     缓冲的作用:减少系统read和write的次数. 全缓冲         系统标准I/O缓冲区被写满时才进行真正的I/O操作.         磁盘文件一般使用全缓冲   ...

  2. L158

    It started out modestly enough: David Hertz, having learned that under the right conditions you real ...

  3. 一个好工具-everything-可以找到浏览器的所有缓存

    下载路径http://www.voidtools.com/downloads/ 我用它来寻找浏览器缓存的google瓦片.

  4. modprobe lsmod

    modprobe是linux的一个命令,可载入指定的个别模块,或是载入一组相依的模块.modprobe会根据depmod所产生的相依关系,决定要载入哪些模块.若在载入过程中发生错误,在modprobe ...

  5. Android Studio单独生成apk

    /********************************************************************* * Android Studio单独生成apk * 说明: ...

  6. 类的初始化__init__使用

    初始化方法: 作用: 对新创建的对象添加属性 语法: class 类名(继承列表): def __init__(self [, 形参列表]): 语句块 [] 代表中的内容可省略 说明: 1. 实始化方 ...

  7. native 方法列表说明

    方法列表说明 关于static const JNINativeMethod method_table[]方法列表的原型如下: typedef struct { const char* name; co ...

  8. Django博客开发实践,初学者开发经验

    python,Django初学者,开发简易博客,做了一下笔记,记录了开发的过程,功力浅薄,仅供初学者互相 交流,欢迎意见建议.具体链接:Django博客开发实践(一)--分析需求并创建项目 地址:ht ...

  9. CodeForces - 321E:Ciel and Gondolas (四边形不等式优化DP)

    题意:N个人排成一行,分成K组,要求每组的不和谐值之和最小. 思路:开始以为是斜率优化DP,但是每个区间的值其实已经知道了,即是没有和下标有关的未知数了,所以没必要用斜率. 四边形优化. dp[i][ ...

  10. 关于FreeMarker自定义TemplateDirectiveModel

    [转载来源:http://zwllxs.iteye.com/blog/2036826] java代码如下: import freemarker.core.Environment; import fre ...