java web学习笔记

主要参考YOUKU上李绪成老师的javaweb视频学习,感谢李绪成老师提供简单易懂的视频教程。

###1.MVC模式

a. M表示模型model,完成处理,如编写的Service、DAO、实体类。
b. V表示视图View,完成与用户的交互,输入界面和输出界面,编写jsp、freemarker或html文件。
c. C表示控制器Controller,协调输入、处理和输出之间的关系,使用Servlet实现。

###2.输入界面

有输入就需要form:

<form action="目标" method="post|get">
	......
</form>

输入框元素:<input type="text" name="userid" value="11"> 密码框:type="password"
单选按钮:type="radio" 用checked设置默认值
复选框:checkbox 用checked设置默认值
提交按钮:submit
重置按钮:reset
普通按钮:button
下拉框:

<select name="">
	<option value="值" selected>显示值1</option>
	.......
</select>

多行文本框:<textarea name="">默认值</textarea>
超链接:<a href="目标文件">显示出来的内容</a>, 超链接要传递参数格式如下:book?action=delete&bookId=11111

###3.输出界面

设置页面编码:<%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8" %>
声明标签库:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
输出变量:${info} 表示${sessionScope.info}③或${requestScope.info}②或 ${applicationScope.info} ④或当前页面定义的变量①。
输出集合:

<c:forEach var="book" items="${books}" varStatus="status">
	......
</c:forEach>

输出对象的属性:${user.userid} 如果出现userid属性不存在这个错误,应检查getUserid()方法是否存在。
判断集合是否为空:<c:if test="${empty users}">没有用户</c:if>
页面需要显示哪些值,就先假设该值存在,最后在Servlet中提供。

###4.模型处理

分为Service和DAO层,DAO负责对数据库的访问,Service完成具体的业务处理。
Service常用方法:

List<Entity> list(),得到列表,如学生列表、课程列表等.
List<Entity> list(条件),得到指定条件的列表,例如得到某个类型的图书
List<Entity> findBy.. (条件),例如根据书名查询图书
add(Entity),添加对象
add(List<Entity>),添加多个对象
delete(String id),根据id删除对象
delete(List<String> ids),批量删除对象
update(Book),修改信息
setProperty(String id, String value),根据id修改某个属性的值

###5.控制器

获取输入:

获取输入:String sid = request.getParameter("sid");
得到复选框值:getParameterValues("");
编码转换:

request.setCharacterEncoding("utf-8");
sid = new String(sid.getBytes("88591_1"),"utf-8");

验证、转换: int age = Integer.parseInt(“sage”);

调用Service方法:定义service对象,调用service方法,必要的是使用定义变量接收方法的返回值,通常会把输入作为参数。
传值:根据界面的输出需求来确定怎么传值,通过调用service得到这些值。
request.setAttribute("AttributeName","AttributeValue"); AttributeName需要与界面一致。
选择界面对用户响应:

response.sendRedirect("target file");

RequestDispatcher rd = request.getRequestDispatcher("target file"); 增删改的时候尽量不要用这种方式,因为在地址栏中仍然是对增删改的调用,在刷新的时候会重复执行。
Servlet和请求路径关联起来:在类中使用@WebServlet

###6.JDBC

JDBC是Java应用程序连接各种数据库管理系统的标准的API,通过这组API可以连接到数据库,并且对数据库进行增删改查操作。
使用JDBC需要做哪些准备工作:

得到对应数据库的驱动程序,放到WEB-INF/lib下.
知道驱动程序的名字以及URL的格式.
数据库基本信息:服务器地址、端口、数据库实例、用户名以及口令.

主要的API:

java.sql.Driver 其它驱动程序要实现的接口。
Java.sql.DriverManager 驱动程序管理器,对驱动程序管理,连接数据库
java.sql.Connection 表示与数据库之间的连接
java.sql.Statementjava.sql.PreparedStatementjava.sql.CallableStatement(执行存储过程)
java.sql.ResultSet执行查询的结果集
java.sql.SQLException 异常类型

对数据库进行操作的基本过程:加载驱动、创建连接、创建语句对象、执行sql语句、异常处理和对象关闭.

代码:

加载驱动Class.forName("com.mysql.jdbc.Driver");
创建连接Connection con = DriverManager.getConnection(url, user, pass);	
创建语句对象
	Statement stmt = con.createStatement();
	PreparedStatement pstmt = con.prepareStatement(sql);
	CallableStatement cstmt = con.prepareCall(sql);
执行sql语句
	有结果集:
		ResultSet rs = stmt.executeQuery(sql);	
		ResultSet rs = pstmt.executeQuery();
	无结果集:
		int n = stmt.executeUpdate(sql);
		int n = pstmt.executeUpdate();
	使用preparedStatement的时候需要对sql语句中的变量赋值
		pstmt.setInt(1, n);
		pstmt.setString(2, str);
		pstmt.setObject(3, object)
	对结果集处理
		只有一个数字:(得到总记录数目)
			rs.next();
			int count = rs.getInt(1);
		只有一个对象:
			if(rs.next())
			{
			封装对象;
			返回对象;
			}
		得到多个对象:
			List<Book> books = new ArrayList<Book>();
			While(rs.next)
			{
			Book book = new Book();
			book.setSid = (rs.getString(1));
			
			Books.add(book);
			}

使用Map对象表示对象(学生、图书), Map 中的元素表示某个属性。

Map<String,Object> student = new HashMap<String, Object>();
student.put("sid","11111");
student.put("sname","zhangsan");

异常处理

Connection con = null;
PreparedStatement pstmt= null;
ResultSet rs = null;
try{
	//执行数据库操作的正常代码
	}catch(Exception e){
	//异常处理代码
	}finally{
		//关闭对象
		if(rs!=null) 
		{
		try{rs.close();
		} 
		catch(Exception e)
		{}
		同样方式关闭语句对象pstmt和连接对象con
	} 
}

###7.JSP完成控制

<jsp:forward page="target"/> 转向某个文件target,和RequestDispatcherforward()方法作用相同。
<jsp:include page="target"/> 把目标文件target的执行结果合并到当前位置。
<%@ include file=" target"%> 把目标文件target的内容复制到当前文件,在运行的时候这个标签被替换了,和<jsp:include page="target"/>不同(把运行结果合并)。
<jsp:useBean id="" class=""> 创建某个类的实例
<jsp:setProperty> 对某个对象的属性赋值
<jsp:getProperty> 获取对象的属性值

###8.Servlet中显示信息

response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<html><head><title>test</title></head>");
out.println("<body>Hello!</body></html>");
out.flush();
out.close();

###9.连接池(Connection Pool)

提前创建若干数据库连接,当用户需要访问数据库的时候,从连接池中得到一个连接,访问结束之后重新放回连接池。
通过共享连接,减少了创建连接和释放所占用的时间,从而提高了效率。另外,可以通过对连接池中连接的数量进行控制,来合理使用服务器的资源。 如何配置连接池:把连接数据库的基本信息配置到服务器,服务器根据这些信息连接数据库。
配置信息包括:数据库的基本信息、连接池数量相关信息。Tomcat下的配置见其参考文档http://localhost:8080/docs/jndi-datasource-examples-howto.html.

###10.事务处理

默认的情况下,是执行完之后自动commit。
可以在程序中使用con.setAutoCommit(false),然后使用con.commit().