Java Web的编写
来源:互联网 发布:java jasperreports 编辑:程序博客网 时间:2024/05/20 14:42
前提
在索引文章中我提到过,我们用Java Web来写服务器程序,这篇文章我们真正的进入到编码的环节。
如果你是直接来到这篇文章,没见到我所谓的“索引文章”,那么请移步:
http://blog.csdn.net/mr_megamind/article/details/71404618
IDE的选择
市面上能编写Java Web项目的IDE应该说数不胜数了,但是最主流的IDE当属Eclipse——在Android Studio发布后被Google放弃支持的IDE。之所以最主流,是因为它具有体积小……这一个优点。
因为用它编写代码的时候很多事情都需要手动来做,因此我选择了一个“非主流”的IDE——NetBeans
NetBeans的安装
本来这里我想一句话带过的,但是发现有两个步骤必须说一下:
1.下载按钮在主页右边,如果没看到,你可能会点上面导航栏的“NetBeans IDE”,在看到一堆介绍之后不知所措;
2.下载页面为我们提供了多个版本,我们选择第二个,带有Java EE的版本(至于Java EE是什么,自己查吧,不懂也没关系,你知道这个版本能写Java Web服务器程序就行了)。
下载下来之后的安装我就不赘述了。
创建并配置项目
1.新建项目
打开IDE,文件->新建项目
在弹出的窗口中,左边选择Java Web,右边选择Web应用程序,点击下一步
在这一步中,输入你的项目名称,选择项目位置(可以和我一样,建一个WorkSpace 文件夹),点击下一步
在这一步中,默认设置应该和下图一样,否则你需要添加一下服务器,然后点击下一步
在这一步中,我们任何框架都不用(那些都是优化用的,我们先把基础的流程跑通),然后点击完成
2.编写前的配置
新建项目完成后,右边应该会自动打开默认的index.jsp,我们不需要它,那是写网站用的默认页面,因此点右上角的“X”关闭。
现在我们来给自己的项目添加配置文件(不清楚为什么新建项目的时候不直接生成)
选中我们的项目,然后右键,在弹出菜单里选择新建->标准部署描述符(web.xml)
在弹出的窗口中我们点击完成(因为都是默认的不能更改)
之后我们会看见左边自动打开了配置文件目录,里面有一个web.xml文件,右边自动打开了这个文件,可以看到里面的内容
3.导入外部包
这是相当重要的一步,如果不做,编程的时候会报各种找不到类、找不到文件的错误。
我们要用到的是下面的8个 .JAR文件
前6个是JSONObject包,是一个集合,6个在同一个压缩包里,去以下地址下载,
http://download.csdn.net/detail/liujiescu/6503917
第7个是MySQL的驱动包,去以下地址下载
http://download.csdn.net/detail/lzhlinzh/1912896
第8个是Servlet API包,去以下地址下载
http://download.csdn.net/detail/jiuyueguang/5745209
ok,下载完这些包,我们在项目路径下建立一个lib文件夹,把刚刚下载到的8个 .JAR文件放进去
这还不算完,我们还需要去项目里把他们引进去。
右键点击库->添加JAR/文件夹
在弹出的窗口中,找到lib文件夹,选中所有的JAR文件,然后再右边选择相对路径,最后点击打开
完成之后,我们点击库文件夹,可以看到,所有的外部依赖包都已导入库中
4.创建包
点开源包我们可以看见,里面有一个灰色的默认包,不推荐使用默认包,我们建立自己的包。右键源包->新建->Java 包
在弹出的窗口中,修改包名,不一定要像我这样,但是格式一般是:net/com . [公司名] . 组名 . 应用名
此时,我们看到源包中的默认包消失,换成了我们刚刚创建的包,灰色是因为它是空的,一会儿创建个类进去就变成正常的颜色了。
开始撸码!
为了方便说明,我们以写一个用户登录的功能为目标来讲。
要实现用户登录,我们需要写四个类,下面我会分别讲解。
1.DBManager
这是一个数据库连接管理类,负责数据库连接的创建、管理和销毁。这个类可以说在任何项目中都是是通用的,直接新建一个类把代码复制进去就行,下面贴出代码:
package net.Implementist.MyFirstWebApp;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.Statement;import java.sql.ResultSet;import java.util.logging.Level;import java.util.logging.Logger;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;/** * 数据库管理类,提供连接数据库和拆解链接功能 * * @author Implementist */public class DBManager extends HttpServlet { ServletConfig config; //定义一个ServletConfig对象 private static String username; //定义的数据库用户名 private static String password; //定义的数据库连接密码 private static String url; //定义数据库连接URL private static Connection connection; //定义连接 @Override public void init(ServletConfig config) throws ServletException { super.init(config); //继承父类的init()方法 this.config = config; //获取配置信息 username = config.getInitParameter("username"); //获取数据库用户名 password = config.getInitParameter("password"); //获取数据库连接密码 } /** * 获得数据库连接对象 * * @return 数据库连接对象 */ public static Connection getConnection() { //myfirstapp是数据库的名字 url = "jdbc:mysql://localhost:3306/myfirstapp"; try { Class.forName("com.mysql.jdbc.Driver").newInstance(); connection = DriverManager.getConnection(url, username, password); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | SQLException ex) { Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex); } return connection; } /** * 关闭所有的数据库连接资源 * * @param connection Connection 链接 * @param statement Statement 资源 * @param resultSet ResultSet 结果集合 */ public static void closeAll(Connection connection, Statement statement, ResultSet resultSet) { try { if (resultSet != null) { resultSet.close(); } if (statement != null) { statement.close(); } if (connection != null) { connection.close(); } } catch (SQLException ex) { Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex); } }}
2.User
用户类,这种类一般叫Java Bean,就是定义用户的各种字段,然后封装好就行了,下面贴出代码:
package net.Implementist.MyFirstWebApp;/** * * @author Implementist */public class User { /** * 用户姓名 */ private String userName; /** * 用户密码 */ private String password; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }}
3.UserDAO
这个类我需要重点讲一下,DAO的意思是数据访问对象(Data Access Object),可以理解为对数据库中User表进行增删改查用的类,我只写一个查询函数,其他函数类推即可,下面贴出代码:
package net.Implementist.MyFirstWebApp;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.logging.Level;import java.util.logging.Logger;/** * * @author Administrator */public class UserDAO { /** * 查询给定用户名的用户的详细信息 * * @param userName 给定的用户名 * @return 查询到的封装了详细信息的User对象 */ public static User queryUser(String userName) { //获得数据库的连接对象 Connection connection = DBManager.getConnection(); PreparedStatement preparedStatement = null; ResultSet resultSet = null; //生成SQL代码 StringBuilder sqlStatement = new StringBuilder(); sqlStatement.append("SELECT * FROM user WHERE UserName=?"); //设置数据库的字段值 try { preparedStatement = connection.prepareStatement(sqlStatement.toString()); preparedStatement.setString(1, userName); resultSet = preparedStatement.executeQuery(); User user = new User(); if (resultSet.next()) { user.setUserName(resultSet.getString("UserName")); user.setPassword(resultSet.getString("Password")); return user; } else { return null; } } catch (SQLException ex) { Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex); return null; } finally { DBManager.closeAll(connection, preparedStatement, resultSet); } }}
注意下面两行代码,这种形式的传值是为了避免传统的拼字符串方式造成的SQL注入攻击。
sqlStatement.append("SELECT * FROM user WHERE UserName=?");preparedStatement.setInt(1, userName);
再举个类子,在写插入User的函数时,这里就写成下面几行这样:
sqlStatement.append("INSERT INTO user(UserName,Password) VALUES(?,?)");preparedStatement.setString(1, user.getUserName());preparedStatement.setString(2, user.getPassword());
这样就能明白这种形式的用法了。
4.LoginServlet
这个类是我们的重中之重,它就是处理来自客户端的请求,并发回响应的类。
①创建Servlet
它的创建和前三个类不一样,看图↓
②更改Servlet名字
在弹出的界面修改Servlet名字,然后
点击下一步,不要点完成!!!
③配置Servlet部署
上一步如果点了完成会跳过这一步,然后需要手动部署,如果忘了部署,你的请求得不到响应,你连错误都找不到!
选中 将信息添加到部署描述符(web.xml) 复选框,然后点完成。
这时打开我们之前创建的web.xml,你会看见它里面新增了这些东西
ok,回到LoginServlet中,验证请求中的账户密码是否正确,然后返回验证结果作为响应,下面给出代码
package net.Implementist.MyFirstWebApp;import java.io.IOException;import java.io.PrintWriter;import java.util.HashMap;import java.util.Map;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import net.sf.json.JSONObject;/** * 测试登录Servlet * * @author Implementist */public class LoginServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应内容类型 response.setContentType("text/html;charset=utf-8"); request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); try (PrintWriter out = response.getWriter()) { //获得请求中传来的用户名和密码 String accountNumber = request.getParameter("AccountNumber").trim(); String password = request.getParameter("Password").trim(); //密码验证结果 Boolean verifyResult = verifyLogin(accountNumber, password); Map<String, String> params = new HashMap<>(); JSONObject jsonObject = new JSONObject(); if (verifyResult) { params.put("Result", "success"); } else { params.put("Result", "failed"); } jsonObject.put("params", params); out.write(jsonObject.toString()); } } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } /** * 验证用户名密码是否正确 * * @param userName * @param password */ private Boolean verifyLogin(String userName, String password) { User user = UserDAO.queryUser(userName); //账户密码验证 return null != user && password.equals(user.getPassword()); }}
ok,写完这些,服务器端的登录功能请求响应就实现了,记得按Ctrl+S保存,不过这还不算完,我们需要把这个项目打包一下,然后放在Tomcat的路径下,以下是步骤
①打包
右键点击我们的项目->清理并构建
②部署
去WorkSpace中找到这个项目生成的 .WAR 文件,然后复制到Tomcat的指定目录下去,见下面两张图↓
ok,完事!
后记
1.今天写着写着我突然想到,可能JSONObject还需要写一篇单独的博文来讲,但是直接照猫画虎应该也不会出啥问题,闲了再说;
2.每次修改完程序,记得保存->清理并构建->部署,然后在XAMPP控制面板中关闭再重启Tomcat,就能生效了。
3.今天终于写完了,这篇帖子写了好几天,好像也比较长,诸君就这么看吧。
- Java Web的编写
- Java编写一个简单的Web爬虫
- JAVA编写WEB服务器
- [JAVA web服务端]用wsdl2java简化服务端的编写
- java邮件开发--心得6-web email的编写
- 编写一个简单的JAVA WEB Servlet页面
- Java编写高仿tomcat的web服务器Joncat
- 基于servlet+jdbc编写的java版多人聊天室WEB版
- Java web留言板项目part1:数据类的编写
- java web的验证码编写和运用
- 关于java web项目编写数据库连接的方法
- JAVA 编写一个多线程的简单Web服务器
- java web学习总结40:编写自己的JDBC框架
- Eclipse编写java web注意事项
- WebServer.java 用JAVA编写Web服务器
- 编写简单的WEB服务器
- 编写Web页面的注意事项
- 编写Java web定时器任务2
- 对于JAVA中访问权限修饰符的理解
- 一种在windows平台下实现自动操作应用的方法,附带源码地址及使用方法
- Tomcat配置文件修改无效自动恢复还原的解决办法总结
- @RequestMapping 用法详解之地址映射
- linux新建weblogic服务流程
- Java Web的编写
- tomcat配置https以及nginx使用ssl模块配置HTTPS
- windows+VS2013+CUDA7.5配置
- Windows多线程指南
- oracle数据库作业
- cef3 学习总结
- 利用webSocket进行服务器推送,并发起桌面通知
- Android图片压缩(质量压缩和尺寸压缩)&Bitmap转成字符串上传
- weblogic的默认端口是7001