本文旨在介绍如何使用NetBeans开发一个Web服务。
OS:windows Xp
java IDE:NetBeans 7.0.1
日志记录:log4j
数据库:sqlserver2000
一、建立Web项目
1,新建JAVA Web项目
如图-1所示,选择“下一步”
图-1
2,在图-2中填入项目名称,选择正确的项目位置,然后点击下一步。
图-2
3,选择java EE版本、服务器
(服务器需要提前在服务器视图中进行定义,我使用的tomcat6.0),如图-3所示,选择“完成”,
图-3
4,图-4显示已经建立一个web项目,META-INF中的context.xml文件中可以编写数据库连接信息。
如果在tomcat中部署Web项目并且使用了context文件存放数据库连接信息,那么有两种方法
(1)程序会首先在META-INF文件夹中去寻找context.xml文件
(2)如果此文件不存在,那么程序将会到TOMCAT_HOME/conf/context.xml中去寻找相关信息。
建议大家在使用META_INF中的context.xml文件,这是被推荐的方法,但这种方法需要在web.xml中添加相关配置信息,下面将会讲到。
图-4
5,建立源文件包com.boss
(悲催,这个图也被截取下来了??好吧,那就写上吧)
图-5
6,在Web项目的基础上建立Web服务,在项目上右键--新建--Web服务,弹出图-7所示
图-6
7,填写Web服务类,选择服务类存在的包位置,点击“完成”
图-7
8,tomcat不支持JSR-109部署方式(至于这是个什么方式我也不清楚,既然不支持那就点击“是吧”)
图-8
9,建立了Web服务的总体显示图,服务类和服务方法都采用了注释的方法。
图-9
10,可以点击类的“设计”按钮,然后添加你需要添加的服务方法。
图-10
二、添加日志服务
(1)下载log4j的jar包,加入项目中。
(2)在com.boss包中加入日志服务类,代码如下:
- package com.boss;
- import java.io.File;
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.log4j.PropertyConfigurator;
- public class InitLog4j extends HttpServlet implements IConstStr {
- private static final long serialVersionUID = 1L;
- public void destroy() {
- super.destroy();
- }
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- }
- public void init() throws ServletException {
- String basePath = getServletContext().getRealPath("/");
- String confFile = getInitParameter("log4j");
- String logPathName = basePath + "log";
- File f = new File(logPathName);
- if (!f.isDirectory()) {
- f.mkdir();
- }
- if (confFile != null) {
- PropertyConfigurator.configure(basePath + confFile);
- } else {
- System.out.println(LOGCONFFILENOTEXISTS);
- }
- }
- }
(3)在WEB-INF文件夹中建立log4j.properties文件(此文件可以在web.xml进行配置),加入下列信息
- log4j.rootLogger=INFO,Rolling_file,console
- #表示console的输出是控制台输出
- log4j.appender.console=org.apache.log4j.ConsoleAppender
- log4j.appender.console.layout=org.apache.log4j.PatternLayout
- log4j.appender.console.ConversionPattern=%d - %c -%-4r [%t] %-5p %c %x - %m%n
- #表示Rolling_file输出是滚动文件输出
- Rolling_filelog4j.appender.Rolling_file=org.apache.log4j.RollingFileAppender
- log4j.appender.Rolling_file.File=d:/TedaPortalService_log.html
- log4j.appender.Rolling_file.MaxFileSize=100KB
- log4j.appender.Rolling_file.MaxBackupIndex=1
- log4j.appender.Rolling_file.layout=org.apache.log4j.HTMLLayout
- log4j.appender.Rolling_file.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
- #表示日志输出级别是INFO级别,也就是优先级大约INFO的可以输出,包括INFO,WARN,ERROR,FATAL
- log4j.logger.com.foo=INFO
- <servlet>
- <servlet-name>InitLog4j</servlet-name>
- <servlet-class>com.boss.InitLog4j</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>
- <!--
- InitLog4j是起一个servlet名字,和提供日志服务的类名一致。
- com.boss.InitLog4j,这个要根据你日志服务类的完整限定名进行更改.
- <param-name>log4j</param-name>这个参数名和代码中String confFile = getInitParameter("log4j")一致,也就是代码中要寻找xml文件中名称log4j的信息,所以二者要一致
- <param-value>WEB-INF/log4j.properties</param-value>,这个参数列出log4j配置文件的位置
- -->
(5)至此,log4j配置就完成,在代码中声明,然后调用即可
三、数据库连接信息配置
(1)连接sqlserver2000,在context.xml文件中加入如下的代码:
- <?xml version="1.0" encoding="UTF-8"?>
- <Context docBase="Test" path="/Test" reloadable="true">
- <WatchedResource>WEB-INF/web.xml</WatchedResource>
- <Resource name="jdbc/Test" auth="Container" type="javax.sql.DataSource"
- maxActive="100" maxIdle="30" maxWait="10000"
- username="sa" password="sa" driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
- url="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=Test" />
- </Context>
(2)在java源代码中加入数据库建立连接和关闭连接的相关类
- package com.boss.configuration;
- import java.sql.Connection;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- import javax.naming.Context;
- import javax.naming.InitialContext;
- import javax.naming.NamingException;
- import javax.sql.DataSource;
- import org.apache.log4j.Logger;
- public final class JdbcUtilsSing implements IConstStr {
- private static Logger logger = Logger.getLogger(JdbcUtilsSing.class);
- private Connection conn = null;
- private static JdbcUtilsSing instance = null;
- private JdbcUtilsSing() {
- }
- public static JdbcUtilsSing getInstance() {
- if (instance == null) {
- synchronized (JdbcUtilsSing.class) {
- if (instance == null) {
- instance = new JdbcUtilsSing();
- }
- }
- }
- return instance;
- }
- public Connection getConnection() throws SQLException {
- Context ctx = null;
- DataSource ds = null;
- Context envctx = null;
- try {
- ctx = new InitialContext();
- logger.info(DBINITIALCONTEXTSUCC);
- } catch (NamingException e) {
- logger.info(DBINITIALCONTEXTFAIL);
- throw new DaoException(e.getMessage(), e);
- }
- try {
- envctx = (Context) ctx.lookup("java:comp/env");
- logger.info(DBJAVAENVSUCC);
- } catch (NamingException e) {
- logger.info(DBJAVAENVFAIL);
- throw new DaoException(e.getMessage(), e);
- }
- try {
- ds = (DataSource) envctx.lookup("jdbc/Test");//这里的jdbc/Test名字和context.xml文件中写的Resource name是一致的。
- logger.info(DBJNDISUCC);
- } catch (NamingException e) {
- logger.info(DBJNDIFAIL);
- throw new DaoException(e.getMessage(), e);
- }
- try {
- conn = ds.getConnection();
- logger.info(DBCONNSUCC);
- } catch (SQLException e) {
- logger.info(DBCONNFAIL);
- throw new DaoException(e.getMessage(), e);
- }
- return conn;
- }
- public void dbFree(ResultSet rs, Statement st, Connection conn) {
- try {
- if (rs != null)
- try {
- rs.close();
- logger.info(RSCLOSESUCC);
- } catch (SQLException e) {
- logger.info(RSCLOSEFAIL);
- throw new DaoException(e.getMessage(), e);
- }
- } finally {
- try {
- if (st != null)
- try {
- st.close();
- logger.info(STCLOSESUCC);
- } catch (SQLException e) {
- logger.info(STCLOSEFAIL);
- throw new DaoException(e.getMessage(), e);
- }
- } finally {
- if (conn != null)
- try {
- conn.close();
- logger.info(DBCONNCLOSESUCC);
- } catch (SQLException e) {
- logger.info(DBCONNCLOSEFAIL);
- throw new DaoException(e.getMessage(), e);
- }
- }
- }
- }
- }
(3)加入其他类(属于自定义的,不一定按照此种写法)
- package com.boss.configuration;
- public class DaoException extends RuntimeException {
- private static final long serialVersionUID = 1L;
- public DaoException() {
- }
- public DaoException(String message) {
- super(message);
- }
- public DaoException(Throwable cause) {
- super(cause);
- }
- public DaoException(String message, Throwable cause) {
- super(message, cause);
- }
- }
- package com.boss.configuration;
- public interface IConstStr {
- String DBINITIALCONTEXTSUCC = "初始化Context文件成功\n";
- String DBINITIALCONTEXTFAIL = "初始化Context文件失败\n";
- String DBJAVAENVSUCC = "系统提取comp/env成功\n";
- String DBJAVAENVFAIL = "系统提取comp/env失败\n";
- String DBJNDISUCC = "初始化JNDI成功";
- String DBJNDIFAIL = "初始化JNDI失败";
- String DBCONNSUCC = "数据库连接建立成功\n";
- String DBCONNFAIL = "数据库连接建立失败\n";
- String FUNINVOKESUCC = "函数%s调用成功\n";
- String FUNINVOKEFAIL = "函数%s调用失败\n";
- String RSCLOSESUCC = "数据集关闭成功\n";
- String RSCLOSEFAIL = "数据集关闭失败\n";
- String STCLOSESUCC = "SQL语句关闭成功\n";
- String STCLOSEFAIL = "SQL语句关闭失败\n";
- String DBCONNCLOSESUCC = "数据库连接关闭成功\n";
- String DBCONNCLOSEFAIL = "数据库连接关闭失败\n";
- String LOGCONFFILELOADSUCC = "Log4j配置文件载入成功";
- String LOGCONFFILELOADFAIL = "Log4j配置文件载入失败";
- String LOGCONFFILENOTEXISTS = "Log4j配置文件不存在";
- }
一个带有日志输出的web服务已经建立,下一步部署在web服务容器中即可