主要参考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.Statement、java.sql.PreparedStatement、java.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,和RequestDispatcher的forward()方法作用相同。
<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().