简单Web开发流程全解——下

接着简单Web开发流程全解——上 没说完的地方接着写,现在来讲一讲关于后端实现和开发流程的东西。

后端实现

一、环境配置与链接
Eclipse JSP/Servlet 环境搭建 这个是用eclipse搭建jsp和servlet环境的,这样就可以在eclipse上进行Web的开发和调试。
按照上述搭建好环境以后
文件列表
应该有如上列表。
如果有想要我们团队开发的demo的朋友可以私信联系我,不过我一般上的比较少,除非是有新的东西学完了记录一下才会上,所以还请见谅。
有些同学在使用我的demo的时候遇到了找不到声明之类的问题,这是因为每个人默认配置的jdk和jre不完全一样,所以应该在build path里面进行修改。如下图:
修改配置界面
要是修改使用的jre,可以在下图所示界面修改,我目前就配置了一个jre
选择使用的包

二、代码编写
关于后端代码编写,首先要接收前端页面传回来的get和post或者其他访问,然后是处理之后和数据库进行连接进行获取数据或者修改数据或者查询数据的操作。
所以第一步应当就是链接数据库。
1.链接数据库

/**
 * 
 */
package utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * @author ly
 *
 */
public class DBhelper {

	public String url = "jdbc:mysql://localhost:3306/dreamnight?useUnicode=true&characterEncoding=UTF-8";
	public String username = "root";
	public String password = "root";
	public static DBhelper instance = null;

	// 通过静态代码块注册数据库驱动,保证注册只执行一次
	static {
		try {
			Class.forName("com.mysql.jdbc.Driver").newInstance();
		} catch (InstantiationException | IllegalAccessException
				| ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	private DBhelper() {
	}

	/**
	 * 获得类实例
	 * 
	 * @return
	 */
	public static DBhelper getInstance() {
		// 给类加锁,防止线程并发
		synchronized (DBhelper.class) {
			if (instance == null) {
				instance = new DBhelper();
			}
		}
		return instance;
	}

	/**
	 * 获得连接
	 * 
	 * @return
	 * @throws SQLException
	 */
	public Connection getConnection() throws SQLException {
		return DriverManager.getConnection(url, username, password);
	}

	/**
	 * 关闭连接
	 * 
	 * @param conn
	 * @param st
	 * @param rs
	 */
	public static void closeConnection(Connection conn, Statement st,
			ResultSet rs) {
		try {
			if (rs != null) {
				rs.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (st != null) {
					st.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				try {
					if (conn != null) {
						conn.close();
					}
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

每一部分的功能可以参见注释,这里只提醒一下,这个写法因为用了单一实例模型所以保证了一次只能由一个访问链接数据库,实现了串行化访问数据库,虽然很安全,但是对于并行处理极为不利。还要注意url链接的时候附带的参数,也是为了实现中文字符的传递。
2.处理前方返回的request

protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
			}

一般是继承原有的HttpServlet类,通过复写原有的doGet等函数从而将需要的功能加入到我们写的servlet中。
3.在访问请求以后,一般就需要和数据库进行交互,存取数据了,可以在jdbc的帮助下执行需要的sql语句。例如一个简单的统计相同id的项数可以用如下所示代码实现:

public int getTotal(int s1) {
		int total = 0;
		try {

			Connection c = DBhelper.getInstance().getConnection();

			Statement s = c.createStatement();

			String sql = "select count(*) from Commit where threadID = "+String.valueOf(s1);

			ResultSet rs = s.executeQuery(sql);
			while (rs.next()) {
				total = rs.getInt(1);
			}

			System.out.println("total:" + total);

			DBhelper.closeConnection(c, s, rs);

		} catch (Exception e) {
			e.printStackTrace();
		}
		return total;
	}

4.为了管理我们的数据类型,我们还需要创建数据类型的类,用以统一定义接口
5.放一张刚写完的项目的截图
项目截图
上图中,entity只放置数据类型,servlet放置处理方法,updateTo放置链接数据库的方法,utils放置数据库链接配置,各部分各司其职,即使某一部分修改也不会影响其他模块。
最后提醒一下,在写sql语句时,要注意sql语句中字符串的单引号,有时候需要单独添加。
三、其他注意事项和遇到的问题
1.在第一次登陆的时候,可以通过Session变量保存一些本次链接的全局信息,这种信息可以在前端页面和后端servlet直接调用。

request.getSession().setAttribute("USER", user);
//第一次登陆将user对象保存在名字为“USER”的变量里面
User USER=(User)request.getSession().getAttribute("USER");
//之后想要获得变量“USER”的值就可以用这种直接调用的方式

2.注意参数的传回

request.setAttribute("Threads", threads);
//这一句代码是将threads变量以Threads的名字传到前端

之后在前端的调用如下:

<c:forEach items="${threads}" var="thread" varStatus="st">
  <tr>
    <td><div class="well" ><strong> <img src = "./images/person2.JPG" alt="user_pic" style= "float: left; height:40px; width:60px;padding-left: 20px">
        <p style= "float:left;padding-left: 20px;padding-top:10px">:</p>
        <a href="threadDetails?threadID=${thread.getThreadID()}&start=0&ifclick=1" style = "float:left;padding-left: 5px;padding-top:1px;font-size:17px"> ${thread.getThreadName()}</a></strong> <br>
        <br>
        <div> </div>
        <div class="text-center col-md-1" > <a style= "float:center;">${thread.getFromAccount()}</a> </div>
        <hr class="hr1">
        <a style = "float:center;padding-left:5px;font-size: 20px;color:#3A3A3A">${thread.getText()}</a>
        <ul class="nav navbar-nav navbar-right">
          <li><a href="#" style="font-weight:bold;">点击数目:${thread.getNumReading()}</a></li>
          <li><a href="#">评论数目:${thread.getNumCommit()}</a></li>
        </ul>
        <br>
      </div></td>
  </tr>
  <div> </div>
</c:forEach>

即通过jsp的变量引用就可以获得servlet传回来的变量值,而且这个值可以是字符串,数字,以及其他比较复杂的数据类型和列表。

3.servlet页面跳转

request.getRequestDispatcher("***.jsp").forward(request, response);

上述语句可以实现servlet向某一确定jsp的跳转,如果想要跳转到另一个servlet的话,可以先在web.xml中进行定义,再把目标文件路径改为定义的"url-pattern"就可以从一个servlet不经过前端直接跳到下一个servlet。

4.字符传递乱码问题
字符串传递可以有三个地方出问题,前端,servlet,数据库。前面已经说过了,前端要在页面上设置utf-8编码,数据库在创建的时候也要用utf-8字符集,至于后端servlet,也要用uft-8的方式编码请求和相应信息

response.setContentType("text/html; charset=UTF-8");
request.setCharacterEncoding("utf-8");

5.知道servlet的朋友们都知道,servlet语法并不是这样的,那么为什么这样写就可以获得servlet的功能呢?那是因为java可以帮助我们自动生成servlet语法格式的文件,并在建立服务器被访问时自动执行这些文件。
我电脑上的路径是这样的
\eclipse\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\dreamnight\org\apache\jsp
打开以后,就会发现如下界面:
在这里插入图片描述
可以发现,servlet的代码由java语句输出生成。

开发流程

软件工程的开发过程是一个很好的减少推诿抵赖的方法,前面确定的东西都会成为后面的依据。需求分析,流程图和业务逻辑,数据流图和关系模型,看起来冗余,但是真正在使用的时候还是十分方便必要的。

  • 5
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值