最近老师让我们给大二的学弟学妹们讲解jsp+javabean+servlet,很头疼,不知道从哪里下手,感觉自己好像也不是太懂得样子哈哈哈,那就写一篇博文来发表一下自己的看法,顺便理清思路,不能被大二的学弟学妹嘲笑,对吧!
那么什么是servlet?
Servlet 是在服务器上运行的小程序,用来动态的显示 Web 内容。这个流程大概就是
-
客户端发送请求至服务器端;
-
服务器将请求信息发送至 Servlet;
-
Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;
-
服务器将响应返回给客户端。
什么是Javabean呢?
说白了就是类而已,只不过现在改了一个名字而已,之前写的时候都是一堆类混在一起,现在就是把他们拆开,按照不同的功能放在一起,一般我们用四个包来区分。
- com.Bean包:这个包里面放的都是一些属性类,一般数据库里面有什么表,相应的就要有什么bean,当然表里面的数据在bean里面也要全有,比如有一个Student表,表里面有id,name那么在该包下就要建立相应的Studentbean(Studentbean只是一个名字,你自己可以随便取)类,有私有变量id和name,与之对应的get和set函数。
- com.Dao包:这个包就是放一些类,类里面的函数就是用来对数据库进行操作的,例如增删改查。
- com.DBUtil:这包里面放的就是用来连接数据库的函数,在Dao函数里面直接调用这个就能连接数据库,代码复用。
- com.Servlet:这个包放置的就是servlet类,用来网页与后台数据的交互,下面讲解一个简单的登录界面JSP+javabean+Servlet.
让我们用程序来实现一下吧.这样更能很好的理解他到底是干嘛的。
一:首先我们需要建立一个登录界面,很简单只需要一个用户名username和password的文本输入框就可以了。
Login.jsp
<%@ page language="java" isErrorPage="true" pageEncoding="utf-8"%> <!DOCTYPE html> <head> <meta charset="utf-8"> <title></title> <link rel="stylesheet" type="text/css" href="style.css" /> </head> <body> <div class="container"> <section id="content"> <form action="" method="post"><!---这里action的地址我们先不写,一会配置完servlet再回来补充。---> <h1>登录 界面</h1> <div> <input type="text" placeholder="登录名" required="" id="username" name="username1"/> </div> <div> <input type="password" placeholder="密码" required="" id="password" name="password1" /> </div> <div> <input type="submit" value="登 录" /> <a href="#">注册</a> </div> </form><!-- form --> <div class="button"> </div><!-- button --> </section><!-- content --> </div><!-- container --> </body> </html>
二:我们需要建立与之匹配的数据库,下面我们建立一个servlet的数据库建立一个user的表,当然只需要用户名和密码就行,类型为varchar类型就行,值都为123.
三:接下来我们需要建立一个com.Bean的包,上面说了这个里面的数据与数据库都是一一对应的,我们给包取名为bean,将类取名为Userbean
package bean; public class Userbean { private String username;//用户名 private String password;//密码都是与数据库匹配的,下面是set和get函数 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; } }
四:接下来我们需要建立数据库的连接com.DBUtl,类名取名为DBUtil。
package com.DBUtil; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DBUtil { public static String db_url="jdbc:mysql://localhost:3306/servlet?uerUnicode=true&characterEncoding=UTF-8"; //这是连接数据库,servlet是数据库的名称,uerUnicode=true&characterEncoding=UTF-8是将字符集设置为utf-8,避免乱码。 public static String db_user="root";//数据的用户名 public static String db_password="20153246";//数据库的密码 public static Connection getConn()//获取连接,返回Connection类型,必须设置为static这样才能在其他类中使用 { Connection conn=null; try { Class.forName("com.mysql.jdbc.Driver");//加载驱动 conn=DriverManager.getConnection(db_url,db_user,db_password);//连接数据库 } catch(Exception e) { e.printStackTrace(); } return conn; } public static void close(Statement state,Connection conn)//关闭函数 { if(state!=null)//只有状态和连接时,先关闭状态 { try { state.close(); } catch(SQLException e) { e.printStackTrace(); } } if(conn!=null) { try { conn.close(); } catch(SQLException e) { e.printStackTrace(); } } } public static void close(ResultSet rs,Statement state,Connection conn) { if(rs!=null)//有结果集,状态和连接时,先关闭结果集,在关闭状态,在关闭连接 { try { rs.close(); } catch(SQLException e) { e.printStackTrace(); } } if(state!=null) { try { state.close(); } catch(SQLException e) { e.printStackTrace(); } } if(conn!=null) { try { conn.close(); } catch(SQLException e) { e.printStackTrace(); } } } }
五:然后我们就要建立servlet类,建立一个com.servlet的包,建立一个Userservlet的servlet类
package com.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import dao.Userdao; @SuppressWarnings("serial") public class Userservlet extends HttpServlet { //当从jsp跳转到servlet类时,首先执行service函数(这是定理) protected void service(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException { req.setCharacterEncoding("utf-8");//设置字符集,避免乱码 //获取jsp界面需要进行的操作, String method = req.getParameter("method"); if(method.equals("login"))//转到login函数 { login(req,resp); } } protected void login(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException { req.setCharacterEncoding("utf-8"); String username = req.getParameter("username1");//获取jsp界面的username1和password1的值 String password = req.getParameter("password1"); } }
六:配置servlet文件,用来实现从jsp界面跳转到servlet的操作。在WEB-INF下面建立.xml文件,取名必须为web,
<?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <servlet-name>Userservlet</servlet-name><!--servlet的别名,随便取 --> <!--servlet的包路径,后面再加上.servlet类名 ,这里的类名必须是包下面的servlet类名,目的是让找到该servlet的路径 --> <servlet-class>com.servlet.Userservlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Userservlet</servlet-name><!--servlet的别名,和上面保持一致就行 --> <!--jsp跳转到servlet的路径名,自己取,用来从jsp界面跳转到servlet的路径,程序会根据路径找到servlet的位置 --> <url-pattern>/Servlet/Userservlet</url-pattern><!-- --> </servlet-mapping> </web-app>
七:建立Dao,用来执行sql语句,判断是否登录成功。类名取为Userdao,
package dao; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import db.DBUtil; public class Userdao { public int login(String username,String password) { Connection conn = DBUtil.getConn();//这里就是从DBUtil类里面得到连接 Statement state =null; ResultSet rs = null; int flag=0; try { String sql = "select * from user where name = '"+username+"'";//SQL语句, state = conn.createStatement(); rs=state.executeQuery(sql); if(rs.next()) { if(rs.getString("password").equals(password)) { flag=1; } } } catch(Exception e) { e.printStackTrace(); } finally { DBUtil.close(rs, state, conn); } return flag; } }
八:修改servlet下面的代码,红色的为添加的代码
package servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import dao.Userdao; @SuppressWarnings("serial") public class Userservlet extends HttpServlet { //当从jsp跳转到servlet类时,首先执行service函数(这是定理) protected void service(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException { req.setCharacterEncoding("utf-8");//设置字符集,避免乱码 //获取jsp界面需要进行的操作, String method = req.getParameter("method"); if(method.equals("login"))//转到login函数 { login(req,resp); } } protected void login(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException { req.setCharacterEncoding("utf-8"); String username = req.getParameter("username1");//获取jsp界面的username1和password1的值 String password = req.getParameter("password1"); Userdao userdao = new Userdao();//创建Userdao的实例 int flag = userdao.login(username, password);//用来判断是否登陆成功 if(flag==1) { System.out.println("登录成功!"); resp.sendRedirect(req.getContextPath()+"/index.jsp"); } else { System.out.println("登录失败!"); } } }
九:在login.jsp界面我们刚刚没有添加action的路径,现在将他加上,路径就是在web.xml文件下刚刚配置的路径,
<%@ page language="java" isErrorPage="true" pageEncoding="utf-8"%> <!DOCTYPE html> <head> <meta charset="utf-8"> <title></title> <link rel="stylesheet" type="text/css" href="style.css" /> </head> <body> <div class="container"> <section id="content"> <form action="${pageContext.request.contextPath}/Servlet/Userservlet?method=login" method="post">
<!---${pageContext.request.contextPath}的目的是找到主工程的名字,/Servlet/Userservlet就是web.xml下面配置的路径,也就是servlet的路径--->
<h1>登录 界面</h1> <div> <input type="text" placeholder="登录名" required="" id="username" name="username1"/> </div> <div> <input type="password" placeholder="密码" required="" id="password" name="password1" /> </div> <div> <input type="submit" value="登 录" /> <a href="#">注册</a> </div> </form><!-- form --> <div class="button"> </div><!-- button --> </section><!-- content --> </div><!-- container --> </body> </html>
十:执行一下login.jsp,有一个成功登陆的界面index.jsp上面就写着这是主页,另外在控制台输出了一句话登陆成功,这里我就不粘贴代码了,
结尾:我们发现上面的代码里面我们没有用的Userbean这个类,是不是他就没有用呢,显然不是,这里我们做登陆的时候不需要这个,但是我们要进行将数据库的数据传递到jsp界面时,我们就需要这个类了。
如果有什么问题,欢迎提问。