阅读这一篇文章,你至少需要掌握的技术有:servlet,jsp,javaban(java基础);
所需要的jar包:
1,封装表单的jar包:commons-beanutils-1.8.3.jar;
commons-logging-1.1.1.jar;
2,jdbc数据库的jar包(这里用的mysql数据库):mysql-connector-java-5.0.8-bin.jar;
3,jstl标签库的jst包:jstl.jar;
Standard.jar;
4,json的jar包:
commons-collections-3.2.1.jar;
commons-lang-2.5.jar;
ezmorph-1.0.6.jar;
json-lib-2.4-jdk15.jar;
(下面这两个jar包前面已经加载过,不需要重复加载,额外写一遍是因为有可能单独使用json的时候需要用到,故此在这里备注一下)
commons-logging-1.1.1.jar;
commons-beanutils-1.8.3.jar;
本文主要对jsp的开发模式,mvc模式进行学习
1 ,Jsp的开发模式;
1,1 主要开发模式:
1.1.1,模型一
使用的技术:jsp+javaBean
这种技术有一个很明显的缺点,jsp虽然能很方便的向页面输出内容,但是当我在一个jsp页面中嵌入了大量的java代码时候,页面结构非常混乱,java代码和html代码相互交替,在后期维护的时候十分麻烦(哭);
1.1.2模型二(主要用这个)
使用的技术:jsp+servlet+javaBean
主要特点:分工合作,负责自己的功能范围,
Jsp:用来显示数据;
Servlet:控制中心,管理操作,在javaBean和jsp中建立联系;
javaBean:封装数据,处理数据;
2, 使用模型二模拟登陆操作(就不写代码了,代码简单,好理解,逻辑步骤明确即可);
2.1 实现步骤
①创建一个jsp登陆页面,提交信息到控制中心servlet页面;
②创建控制中心servlet调用业务逻辑层,实现登陆功能的判断;
③创建Service实现功能(这里先不用持久层,直接在Service中处理结果);
④控制中心从业务逻辑层获取获取结果,反馈信息给登陆页面(失败),或其它页面;
- mvc开发模式(这个模式思想很多地方都有用到,不要局限与web之中);
3.1 mvc:;
M:模型;
V:视图;
C:控制器;
特点:使用控制器,控制模型与视图之间的关系;
3.2 在javaweb开发中的具体分工;
3.1.1 M:使用javaBean技术,处理数据;
3.1.2 V:使用jsp技术,显示数据;
3.1.3 C:使用servlet技术,控制管理功能;
- javaee的三层结构;
4.1 web 层 (jsp,servlet);
4.2 商业逻辑层(业务逻辑层);
4.3 持久化层(jdbc 数据库操作);
4.4 dao模式:用在持久化层的模式,专注于对数据操作的模式,数据封装成对象;
注意事项:①第一步,创建一个接口,定义要使用的功能(制定对外的规则);
②第二步,创建一个类,实现接口的所有方法(之后可以通过该类实现功能);
③第三步:参数用对象进行封装(方便传输);
//dao模式使用的参数传递,全部是用的封装过的对象传递
5, mvc+dao模式的练习: 实现登陆功能的操作;
5.1 实现步骤(主要难点在于参数如何传递,步骤如何实现):
①创建一个jsp页面(V),from表单提交参数到servlet(C)中;
②创建一个servlet(C)来获取数据请求,并进行封装调用service(M)中的方法实现功能;
③创建一个servlet(M)来实现功能,调用dao模式中的方法;
④创建dao模式相关接口和类,与数据库挂接;
⑤servlet(M)返回结果给servlet(C),servlet(C)根据结果把信息反馈给jsp页面(V);
6,mvc+dao 模式的练习:实现注册功能的步骤:
6.1实现步骤:
①创建一个注册页面(V),表单数据提交到servlet(C)中
②创建一个servlet(C)来获取请求数据,并封装, 然后调用service(M)的方法实现功能
③创建一个servlet(M)来实现功能,调用 dao模式中的方法
④在dao模式的接口和实现类中创建方法,实现效果
⑤反馈结果,显示在jsp页面上(v);
6.2功能完善:ID值唯一
实现方法:
①创建表的时候设定id为主键并且自动增长:id int primary key atuo_increment,
②使用uuid类随机生成id
//生成一个随机的唯一的id值
String id = UUID.randomUUID().toString();
id = id.replace("-", "");
6.3 其它练习:增加,删除(挺简单的,就不一一累赘了,重点在于掌握mvc+dao这一种开发模式,同时对之前的知识点进行复习);
7 JSON插件的使用(好东西,可以把集合或者对象转换成JSON,算是间接的与js搭建了桥梁)
JSON是一个轻量级的数据储存格式,方便使用(在安卓开发中用的很多)
需要的jar包在本文开头已经提到了,就不再这里重复说明了
使用方式:
对象转JSON
JSONObject jsonobject =JSONObject.fromObject(对象);
集合转JSON
JSONArray jsonarray=JSONObjectfromArray(集合);
整理时间 2016.5.14
最后贴一下 mvc+dao模式代码,写的比较简单,见笑了.
MVC
控制中心(C)
package com.zzx.control; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.swing.text.StyledEditorKit.BoldAction; import org.apache.commons.beanutils.BeanUtils; import com.zzx.bean.Player; import com.zzx.service.PlayerService; public class Control extends HttpServlet { //这里是登陆控制中心 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //0,考虑到用户名会有中文的可能 request.setCharacterEncoding("utf-8"); //1,封装数据 Player p =new Player(); Map map = request.getParameterMap(); try { BeanUtils.populate(p, map); } catch (Exception e) { e.printStackTrace(); } //2,调用商业逻辑层实现效果 boolean flag =PlayerService.Login(p); if(flag){ response.getWriter().write("Login sucess"); }else{ request.setAttribute("msg", "用户名或密码错误"); request.getRequestDispatcher("/Login.jsp").forward(request, response); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
下面是 业务逻辑层
package com.zzx.service; import java.util.List; import com.zzx.bean.Player; import com.zzx.dao.SQLControl; import com.zzx.dao.SQLControlIn; public class PlayerService { //这里是业务综合处理处 //1登陆功能 public static boolean Login(Player p) { //调用 sql数据操作 SQLControl sc =new SQLControlIn(); boolean flag = sc.Login(p); if(flag){ return true; }else{ return false; } } //注册操作 public static boolean reg(Player p) { //调用 Dao模式下方法创建 SQLControl sc =new SQLControlIn(); boolean flag= sc.reg(p); if(flag){ return true; }else{ return false; } } //判断姓名是否重复 public static boolean OnlyName(Player p) { SQLControl sc =new SQLControlIn(); boolean flag=sc.OnlyName(p); if(flag){ return true; }else{ return false; } } public static List<Player> AllPlayer() { SQLControl sc =new SQLControlIn(); List<Player>list =sc.AllPlayer(); return list; } }
下面是持久层
package com.zzx.dao; import java.util.List; import com.zzx.bean.Player; public interface SQLControl { //这里是对外提供的数据库控制中心 //登录操作 public boolean Login(Player p); //注册操作 public boolean reg(Player p); public boolean OnlyName(Player p); public List<Player> AllPlayer(); }
package com.zzx.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.LinkedList; import java.util.List; import com.zzx.bean.Player; import com.zzx.utils.JdbcTools; public class SQLControlIn implements SQLControl{ private Connection conn; private PreparedStatement ps; private ResultSet rs; //1,这里是登陆操作 public boolean Login(Player p) { String username=p.getUsername(); String password=p.getPassword(); try{ //1,获取链接 conn = JdbcTools.loadDriver(); //2,创建sql语句 String sql ="select * from player where username=? and password=?"; //3,获取预编译对象并设置参数 ps = conn.prepareStatement(sql); ps.setString(1, username); ps.setString(2, password); //4,获取执行结果 rs = ps.executeQuery(); if(rs.next()){ return true; }else{ return false; } }catch (Exception e) { e.printStackTrace(); }finally{ JdbcTools.clearAll(conn, ps, rs); } return false; } //注册功能 public boolean reg(Player p) { try{ conn = JdbcTools.loadDriver(); //创建sql语句 String sql = "insert into player values(?,?,?,?)"; //获取预编译对象 ps = conn.prepareStatement(sql); //设置参数 String id = p.getId(); String username = p.getUsername(); String password = p.getPassword(); String addr = p.getAddr(); ps.setString(1, id); ps.setString(2, username); ps.setString(3, password); ps.setString(4, addr); //执行sql ps.executeUpdate(); //返回结果 return true; }catch (Exception e) { e.printStackTrace(); }finally{ JdbcTools.clearAll(conn, ps, rs); } return false; } //判断名字是否唯一 public boolean OnlyName(Player p) { String username=p.getUsername(); try{ //1,获取链接 conn = JdbcTools.loadDriver(); //2,创建sql语句 String sql ="select * from player where username=?"; //3,获取预编译对象并设置参数 ps = conn.prepareStatement(sql); ps.setString(1, username); //4,获取执行结果 rs = ps.executeQuery(); if(rs.next()){ return true; }else{ return false; } }catch (Exception e) { e.printStackTrace(); }finally{ JdbcTools.clearAll(conn, ps, rs); } return false; } //获取所有用户 public List<Player> AllPlayer() { List<Player> list =new LinkedList<Player>(); Player p ; try{ //1,获取链接 conn = JdbcTools.loadDriver(); //2,创建sql语句 String sql ="select * from player"; //3,获取预编译对象并设置参数 ps = conn.prepareStatement(sql); //4,获取执行结果 rs = ps.executeQuery(); while(rs.next()){ //创建对象,封装数据 p=new Player(); String id =rs.getString("id"); String username = rs.getString("username"); String password = rs.getString("password"); String addr = rs.getString("addr"); p.setId(id); p.setUsername(username); p.setPassword(password); p.setAddr(addr); //添加到集合中去 list.add(p); } return list; }catch (Exception e) { e.printStackTrace(); }finally{ JdbcTools.clearAll(conn, ps, rs); } return null; } }
下面是JDBC工具类(手头上只有MySQL就用的MySQL了)
package com.zzx.utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ResourceBundle; //这里是操作数据库的工具类 /* * 工具类功能:1,加载驱动,获取链接 * 2,释放资源 */ public class JdbcTools { //定义参数获取配置文件中的信息 private static String driverName; private static String username; private static String password; private static String url; static{ driverName=ResourceBundle.getBundle("config").getString("driverName"); username=ResourceBundle.getBundle("config").getString("username"); password=ResourceBundle.getBundle("config").getString("password"); url=ResourceBundle.getBundle("config").getString("url"); } //功能1,加载驱动,获取链接 public static Connection loadDriver(){ //1,通过反射获取字节码文件加载驱动 try { Class.forName(driverName); Connection conn = DriverManager.getConnection(url,username,password); return conn; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } //功能2,释放资源 public static void clearAll(Connection conn,Statement state,ResultSet rs){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } rs=null; if(state!=null){ try { state.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } state=null; if(conn!=null){ try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } conn=null; } }
下面是V web页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>请输入用户名跟密码登陆</h1> <h2><font color="red">${msg }</font></h2> <form action="${pageContext.request.contextPath }/servlet/Control" method="post"> 用户名:<input type="text" name="username"/><br/> 密码:<input type="password" name="password"/><br/> <input type="submit" value="登陆"/> </form> <hr/> <a href="${pageContext.request.contextPath }/servlet/ShowAll">点我显示所有用户</a> </body> </html>