Filter

Filter(过滤器)

其实就是对客户端发出来的请求进行过滤。 浏览器发出,然后服务器派servlet处理。 在中间就可以过滤,其实过滤器起到的是拦截的作用。

  • 作用
1
2
3
1. 对一些敏感词汇进行过滤(敏感词汇)
2. 统一设置编码(不用繁琐的设置utf-8)
3. 自动登录

Filter使用

定义一个类实现Filter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  //构造方法
public FilterDemo() {

}

public void destroy() {

}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("到过滤器了");
chain.doFilter(request, response); //放行通过的代码
}

public void init(FilterConfig fConfig) throws ServletException {
// FilterConfig可以用于获取filter在注册的名字 以及初始化参数
}

new注册过滤器(url-pattern可以更改)

web.xml里面注册,注册的手法与servlet基本一样。

1
2
3
4
5
6
7
8
9
<filter>
<display-name>FilterDemo</display-name>
<filter-name>FilterDemo</filter-name>
<filter-class>guolvqi.FilterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

url-pattern 写法格式

1. 全路径匹配  以 /  开始 

    /LoginServlet

2. 以目录匹配 以 / 开始  以 * 结束

    /demo01/*  

3. 以后缀名匹配  以 * 开始 以后缀名结束
    *.jsp  *.html *.do 

dispatcher 设置

REQUEST : 只要是请求过来,都拦截,默认就是REQUEST 
FORWARD : 只要是转发都拦截。 
ERROR : 页面出错发生跳转 
INCLUDE : 包含页面的时候就拦截。

Filter生命周期

  • 创建

在服务器启动的时候就创建。

  • 销毁

服务器停止的时候。


Filter执行顺序

  1. 客户端发出请求,先经过过滤器,如果过滤器放行,那么才能到servlet。

  2. 如果有多个过滤器, 那么他们会按照注册的映射顺序 来 排队。只要有一个过滤器,不放行,那么后面排队的过滤器以及咱们的servlet都不会收到请求。


JQuery省市联动

一、搭建环境(在仿百度的环境下)

1.在之前仿百度的数据库中新建city表

2.准备jsp页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<body>

省份: <select name="province" id ="province">
<option value="" >-请选择 -
<option value="1" >广东
<option value="2" >湖南
<option value="3" >湖北
<option value="4" >四川
</select>

城市: <select name="city" id="city">
<option value="" >-请选择 -
</select>

</body>

页面结果:

最终框架:


二、dao和impl层实现(需要添加CityBean和list集合)

dao接口写方法:

1
2
3
public interface CityDao {
List<CityBean> findCity(int pid) throws SQLException;
}

daoImpl具体实现接口方法:

1
2
3
4
5
6
7
8
9
10
public class CityDaoImpl implements CityDao{
@Override
public List<CityBean> findCity(int pid) throws SQLException {
//1.使用DBUtils的对象
QueryRunner runner=new QueryRunner(JDBCUtil02.getDataSource());
//2.调用方法
String sql="select * from city where pid=?";
return runner.query(sql, new BeanListHandler<CityBean>(CityBean.class),pid);
}
}

三、Servlet实现(使用XStream框架)

Servlet三步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//1.获取省份id  (pid)
int pid=Integer.parseInt(request.getParameter("pid"));

//2.dao实现 找到所有符合的城市
CityDao dao=new CityDaoImpl();
List<CityBean> list = dao.findCity(pid);

//3.返回数据 手动拼 ---> XStream转bean对象成xml
XStream xStream=new XStream();

//想把id做成属性
// xStream.useAttributeFor(CityBean.class,"id");

//设置别名
xStream.alias("city",CityBean.class);

//一个对象 ---> xml字符串
String xml=xStream.toXML(list);

response.setContentType("text/xml;charset=utf-8"); //返回的是一份有中文的xml文件(小心坑)!!!!!!!
response.getWriter().write(xml);

第三步需要用Xstream–将bean对象为xml(导入jar包)

尝试手动添加pid,然后看看转换出来的样子:


四、 完善jsp页面和功能#

city.jsp页面引入jq的包和功能实现文件city.js(单独写)

city.jsp页面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>

<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script> <!-- 调用jq包 -->
<script type="text/javascript" src="js/city.js"></script> <!-- 具体的jq代码去city.js找 -->
</head>
<body>

省份: <select name="province" id ="province">
<option value="" >-请选择 -
<option value="1" >广东
<option value="2" >湖南
<option value="3" >湖北
<option value="4" >四川
</select>

城市: <select name="city" id="city">
<option value="" >-请选择 -
</select>
</body>

完成功能的city.js文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$(function(){
//1.找到省份元素
$("#province").change(function(){

//2.一旦里面的值改变---去找城市数据
//获取值
var pid=$(this).val();

$.post("CityServlet",{pid:pid},function(data,status){ //pid:pid(省份id值)
//先清空以前的值
$("#city").html("<option value=''> -请选择-");

//遍历:
$(data).find("city").each(function(){ // 从data里面使用find找到xml文件所有city标签---each迭代
//取city的孩子chidren
var id=$(this).children("id").text(); //val是取值 text是转成文本
var cname=$(this).children("cname").text(); //val是取值 text是转成文本

$("#city").append("<option value='"+id+"'>"+cname);
});
});
});
});

city.js文件步骤分析:

1
2
3
4
5
6
7
1. 先要通过province的id值change获取省份元素
2. 获取pid的值
2.1 使用post来响应
2.1.1 通过html()来赋值为0(清空)
2.1.2 循环取出xml文件内的cname值
通过find()来找到所有的cname标---然后each迭代--通过children找到所属的cname值
找到之后通过append()添加

五、代码框架

代码框架:


六、Json

服务器和客户端数据传输方式:

  • xml
1
2
3
4
5
6
7
8
9
10
11
12
<list>
<city>
<id>1<id>
<pid>1</pid>
<cname>深圳</cname>
</city>
<city >
<id>2<id>
<pid>1</pid>
<cname>东莞</cname>
</city>
</list>
  • json
1
2
3
4
5
6
7
8
9
10
11
12
13
 [
{
"cname": "深圳",
"id": 1,
"pid": 1
},
{
"cname": "东莞",
"id": 2,
"pid": 1
}
...
]

使用json格式数据显示省市联动效果

1. 导入jar包

2. 编写servlet代码(第三步不同)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

//1. 获取参数
int pid = Integer.parseInt(request.getParameter("pid"));

//2 dao实现--找出所有的城市
CityDao dao = new CityDaoImpl();
List<CityBean> list = dao.findCity(pid);

//3. 把list ---> json数据
//JSONArray ---> 变成数组 , 集合 []
//JSONObject ---> 变成简单的数据 { name : zhangsan , age:18}

JSONArray jsonArray = JSONArray.fromObject(list); //转成对象
String json = jsonArray.toString(); //弄成字符串

response.setContentType("text/html;charset=utf-8");
response.getWriter().write(json);

3. 编写页面

还是原来的主页面只不过跳转现在的json.js代码:

1
2
3
4
5
6
7
8
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>

<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script> <!-- 调用jq包 -->
<!-- <script type="text/javascript" src="js/city.js"></script> 具体的jq代码去city.js找 -->
<script type="text/javascript" src="js/json.js"></script> <!-- 具体的jq代码去json.js找 -->
</head>

json.js代码(只是each不同)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$(function() {
//1.找到省份的元素
$("#province").change(function() {
//2. 一旦里面的值发生了改变,那么就去请求该省份的城市数据
//$("#province").varl();
var pid = $(this).val();

$.post( "CityServlet02",{pid:pid} ,function(data,status){

//先清空
$("#city").html("<option value='' >-请选择-");
//再遍历,追加
$(data).each(function(index , c) {
$("#city").append("<option value='"+c.id+"' >"+c.cname)
});
},"json" );

});
});

两者展示的js文件区别(each迭代方式不同)


Listener

一、Listener(监听器)

监听某一个事件发生、状态改变

监听器内部机制接口回调

接口回调

  • 需求

A在执行循环,当循环到5的时候,通知B。

事先先把一个对象传递给A—当A执行到5的时候,通过这个对象,来调用B中的方法。 但是注意,不是直接传递B的实例,而是传递一个接口的实例过去。(所以叫接口回调)

就相当于我现在有个A类,但是具体循环之后怎么走的类我现在没有,保不准以后会有,所以我需要写一个接口传给a类一个对象,然后有B类的时候就可以实现接口,然后传递接口实例对象

test类调用a,a去找b(继承接口):


二、8个Web监听器(JSP四个作用域)#

其中三个作用域(JSP共四个)

  request     ---httpServletRequest
  session     ---httpSession
aapplication  ---ServletContext

监听器三种类型

1
2
3
1. 监听三个作用域创建和销毁(3个)
2. 监听三个作用域属性状态变更(3个)
3. 监听httpSession里面存值的状态变更(2个)

使用步骤

  • 1. 定义类,实现对应接口(自动给两个方法)

  • 2. 注册 | 配置监听器


三、 监听三个作用域创建和销毁

1. ServletContextListener

servletcontext创建:

    1. 启动服务器的时候

servletContext销毁:

    2. 关闭服务器. 从服务器移除项目
  • 1. 定义一个类,实现ServletContextListener接口(自动给两个方法)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MyServletContextListener implements ServletContextListener {

//初始化调用
@Override
public void contextInitialized(ServletContextEvent sce) {
// TODO 自动生成的方法存根
System.out.println("初始化了");
}

//销毁调用
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO 自动生成的方法存根
System.out.println("销毁了");
}

}
  • 2. Web.xml文件中注册 | 配置监听器
1
2
3
<listener>
<listener-class>Listener.MyServletContextListener</listener-class>
</listener>

点击控制栏Servers中红框

控制台输出结果:

2. ServletRequestListener

request创建:

      访问服务器上的任意资源都会有请求出现。

      访问 html: 会
      访问 jsp:    会
      访问 servlet : 会 

request销毁:

      服务器已经对这次请求作出了响应。(打开页面并且刷新一次)
  • 1. 定义类,实现对应接口(自动给两个方法)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class MyRequestListener implements ServletRequestListener {

@Override
public void requestDestroyed(ServletRequestEvent sre) {
// TODO 自动生成的方法存根
System.out.println("初始化了");
}

@Override
public void requestInitialized(ServletRequestEvent sre) {
// TODO 自动生成的方法存根
System.out.println("销毁了");
}

}
  • 2. web.xml文件内注册 | 配置监听器
1
2
3
<listener>
<listener-class>Listener.MyRequestListener</listener-class>
</listener>
  • 3.分别建立jsp、h5、servlet文件打开浏览器刷新
1
之后就会在控制台输出初始化和销毁的提示!

3. HttpSessionListener

session的创建:        
   只要调用getSession
     html:        不会
     jsp:        会      getSession();
     servlet:     会

session的销毁:
     1.超时  30分钟(默认时间)        
     2.非正常关闭 销毁
     3.正常关闭服务器(序列化)
  • 1. 定义类,实现对应接口(自动给两个方法)
1
2
3
4
5
6
7
8
9
10
11
12
public class MySessionListener implements HttpSessionListener {

@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("创建session了");
}

@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("销毁session了");
}
}
  • 2. web.xml文件内注册 | 配置监听器
1
2
3
<listener>
<listener-class>Listener.MySessionListener</listener-class>
</listener>

##4. 三个监听器作用 ##

1.ServletContextListener

    利用它来,在servletcontext创建的时候, 

    1. 完成自己想要的初始化工作

    2. 执行自定义任务调度。 执行某一个任务。 Timer  

2.HttpSessionListener

    统计在线人数(一个回合就是session)

四、 监听三个作用域属性状态变更

可以监听在作用域中值—添加|替换|移除动作。

1. ServletContextAttributeListener

2. ServletRequestAttributeListener

3. HttpSessionAttributeListener

4. 以HttpSessionAttributeListener为例#

  • 1. 建立类实现对应接口(自动三个方法)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MyHttpSession implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
System.out.println("属性被添加了");
}
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
System.out.println("属性被移除了");
}
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
System.out.println("属性被替换了");
}
}
  • 2. web.xml文件配置
1
2
3
 <listener>
<listener-class>Listener02.MyHttpSession</listener-class>
</listener>
  • 3. 新建jsp页面
1
2
3
4
5
<%
session.setAttribute("name","abobama");
session.setAttribute("name","zhangsan");
session.removeAttribute("name");
%>

运行jsp页面 然后刷新:


五、 监听httpSession里面存值的状态变更

这一类监听器不用注册。(直接继承即可)

1. HttpSessionBindingListener

  • 1.让javaBean 实现该接口即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Bean01 implements HttpSessionBindingListener{

//自定义属性--可以被修改
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

@Override
public void valueBound(HttpSessionBindingEvent event) {
// TODO 自动生成的方法存根
System.out.println("值被绑定进来了");
}

@Override
public void valueUnbound(HttpSessionBindingEvent event) {
// TODO 自动生成的方法存根
System.out.println("解绑了");
}

}

2. HttpSessionActivationListener(激活)

用于监听session的值

  • 1.钝化 (序列化)

把内存中的数据 存储 到硬盘

  • 2.活化 (反序列化)

把硬盘中的数据 读取 到内存

  • 1.让javaBean 实现该接口即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Bean01 implements HttpSessionActivationListener{
//钝化
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
// TODO 自动生成的方法存根
System.out.println("session被钝化了...");
}

//活化
@Override
public void sessionDidActivate(HttpSessionEvent se) {
// TODO 自动生成的方法存根
System.out.println("session被活化了...");
}
}

3. 钝化活化作用

session中的值可能会很多,并且我们有很长一段时间不使用这个内存中的值,那么可以考虑把session的值可以存储到硬盘上【钝化】,等下一次在使用的时候,在从硬盘上提取出来。 【活化】

4. 设置钝化时间(配置)

  • 1.在tomcat里面 conf/context.xml 里面配置

    对所有的运行在这个服务器的项目生效  
  • 2.在conf/Catalina/localhost/context.xml 配置

    对 localhost生效。  localhost:8080
  • 3.在自己的web工程项目中的 META-INF/context.xml

    只对当前的工程生效。(一般在这设置,因为项目的目录不同)

配置代码:

1
2
3
4
5
<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="itheima"/>
</Manager>
</Context>
   **maxIdleSwap** : 1分钟不用就钝化
   **directory**:  钝化后的那个文件存放的目录位置。 
例如:F:\tomcat\apache-tomcat-7.0.52\work\Catalina\localhost\项目名\文件名

JQuery仿百度搜索

一、建数据库和jsp页面

新建的jsp页面:写一个输入框一个按钮一个下拉div表

1
2
3
4
5
<body>
<input type="text" name="word" id="word" style="width:700px ; height:50px">
<input type="button" value="查询" style="width:100px ; height:50px">
<div id="div01" style="width:700px ; height:200px ; border:1px solid blue ; display:none"></div>
</body>

新建的数据库


二、 前期准备#

1.导入jar文件

2.导入数据池的xml配置文件并且更改数据库名字

3.导入所需要的的JDBCUtil02类

4.导入之前ajax写验证用户名时候的dao和impl类进行修改


三、 书写Servlet的前两步操作#

1
2
3
4
5
6
7
8
//1.获取参数
String word=request.getParameter("word");

//2.让dao实现
WordsDao dao=new WordsDaoImpl();
List<WordBean> list = dao.findWords(word);

//3.返回数据

四、 写jsp页面代码

导入jq包和heima.js文件(所有操作放里面写)

1
2
<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script>
<script type="text/javascript" src="js/heima.js"></script>

五、写heima.js文件

要使用固定格式和JSTL格式(导入jar包)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//捕捉弹起事件  对一个元素进行onkeyup事件监听
// 格式:$(document).reday(function(){})

$(function(){
$("#word").keyup(function(){
//2. 获取输入框的值
//var word=$("#word").val();
var word=$(this).val();

if(word == "") //查询的为0
{
$("#div01").hide();
}
else //查询东西要匹配
{
//3. 请求数据。
$.post("/day16_02/FindWordsServlet",{word:word},function(data,status){
//alert(data);
$("#div01").show();
$("#div01").html(data);
});
}
})
});

六、书写servlet第三步

让servlet跳到list.jsp页面:

1
2
3
4
5
6
//数据存到作用域(因为list.jsp用了JSTL)
request.setAttribute("list",list);

//3.返回数据
response.setContentType("text/html;charset=utf-8");
request.getRequestDispatcher("list.jsp").forward(request, response); //跳转到list.jsp页面

list.jsp页面(用JSTL去遍历出来):

1
2
3
4
5
6
7
8
9
 <%@ taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>

<table style="width: 100%">
<c:forEach items="${list}" var="wordBean"> <!--一定要去servlet里面将数据存到作用域-->
<tr>
<td>${wordBean.words}</td>
</tr>
</c:forEach>
</table>

七、代码分析

代码框架:

分析代码流程:


八、具体代码

dao类代码:

1
2
3
4
public interface WordsDao {
//假如传入一个a ---> 返回 aa abc等 ---> 所以要用list集合
List<WordBean> findWords(String word) throws SQLException;
}

daoImpl类代码:

1
2
3
4
5
6
7
8
9
10
public class WordsDaoImpl implements WordsDao {
@Override
public List<WordBean> findWords(String word) throws SQLException {
//1.使用DBUtils的对象
QueryRunner runner=new QueryRunner(JDBCUtil02.getDataSource());

//2.调用简便方法
String sql="select * from words where words like ? limit ?"; //模糊查询 限制只能查出5个
return runner.query(sql, new BeanListHandler<WordBean>(WordBean.class),word+"%",5);
}

Servlet类代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class FindWordsServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//有中文
request.setCharacterEncoding("utf-8");
try {
//1.获取参数
String word=request.getParameter("word");
System.out.println("word="+word); //控制台输出 看我输入的是不是被抓过来了

//2.让dao实现
WordsDao dao=new WordsDaoImpl();
List<WordBean> list = dao.findWords(word);

//循环输出满足条件的结果
for (WordBean wordBean : list) {
System.out.println("==="+wordBean.toString());
}

//数据存到作用域
request.setAttribute("list",list);

//3.返回数据
response.setContentType("text/html;charset=utf-8");
request.getRequestDispatcher("list.jsp").forward(request, response); //跳转到list.jsp页面

} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}

}

domain获取数据库属性类代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

public class WordBean {

private int id;
private String words;

public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getWords() {
return words;
}
public void setWords(String words) {
this.words = words;
}

@Override
public String toString() {
return "WordBean [id=" + id + ", words=" + words + "]";
}

}

heima.js文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//捕捉弹起事件  对一个元素进行onkeyup事件监听
// 格式:$(document).reday(function(){})

$(function(){
$("#word").keyup(function(){
//2. 获取输入框的值
//var word=$("#word").val();
var word=$(this).val();


if(word == "") //查询的为0
{
$("#div01").hide();
}
else //查询东西要匹配
{
//3. 请求数据。
$.post("/day16_02/FindWordsServlet",{word:word},function(data,status){
//alert(data);
$("#div01").show();
$("#div01").html(data);
});
}
})
});

主页demo08.jsp页面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<%@ 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>

<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script>
<script type="text/javascript" src="js/heima.js"></script>
</head>

<body>
<center> <!-- 居中-->
<h2>黑马</h2>
<input type="text" name="word" id="word" style="width: 600px ; height: 50px ;font-size: 20px;">
<input type="button" value="黑马一下" style="height: 55px ; width: 100px ;">

<div id="div01" style="position:relative; left:-54px; width:600px; height:200px ; border:1px solid blue; display: none"></div>
</center>
</body>
</html>

list.jsp展示页面:

1
2
3
4
5
6
7
8
9
10
11
12
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>


<table style="width: 100%">
<c:forEach items="${list}" var="wordBean"> <!--一定要去servlet里面将数据存到作用域-->
<tr>
<td>${wordBean.words}</td>
</tr>
</c:forEach>
</table>

JDBCUtil02类(获取数据池对象)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
public class JDBCUtil02 {

static ComboPooledDataSource dataSource = null; //使用c3p0开源数据连接池的类
static{
dataSource = new ComboPooledDataSource();
}

public static DataSource getDataSource(){
return dataSource; //返回一个dataSource 方便获取
}

/*
* 获取连接对象
*/
public static Connection getConn() throws SQLException{
return dataSource.getConnection(); //返回一个连接
}

/*
* 释放资源
*/
public static void release(Connection conn , Statement st , ResultSet rs){
closeRs(rs);
closeSt(st);
closeConn(conn);
}
public static void release(Connection conn , Statement st){
closeSt(st);
closeConn(conn);
}


private static void closeRs(ResultSet rs){
try {
if(rs != null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
rs = null;
}
}

private static void closeSt(Statement st){
try {
if(st != null){
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
st = null;
}
}

private static void closeConn(Connection conn){
try {
if(conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
conn = null;
}
}
}

最终结果展示:

JQuery校验用户名

一、相比于之前的是连接数据库而检查

head里面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script>
<script type="text/javascript">
function checkUserName(){

//1.获取输入框的内容
var name=$("#name").val(); //通过$("#找用户的那个框框标签")

//2.发送请求(使用post方式)
$.post("/day16/checkUserNameServlet",{name:name},function(data,status){

//Servlet传过来的数字
if(data==1) //数据库有的写1
{
//alert("用户名已经存在");
$("#span01").html("<font color='red'>用户名已经存在了</font>"); //使用post和get的JQuery赋值代码
}
else //数据库没有的写2
{
//alert("用户名可以使用");
$("#span01").html("<font color='blue'>用户名可以使用</font>");
}
});

}

</script>

body里面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<table border="1" width="400px">
<tr>
<td>用户名:</td>
<td><input type="text" name="name" id="name" onblur="checkUserName()"><span id="span01"></span></td> <!-- 失去焦点就要弹出 -->
</tr>
<tr>
<td>密码:</td>
<td><input type="text" name=""></td>
</tr>
<tr>
<td>邮箱:</td>
<td><input type="text" name=""></td>
</tr>
<tr>
<td>简介:</td>
<td><input type="text" name=""></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="注册"></td>
</tr>
</table>

输入admin数据库里面有:

输入不存在的数据:


二、JQ和ajax方式对比

只有jsp页面不同:

JQuery基本用法

一、load

使用步骤:

1
2
3
4
5
6
7
8
9
1. 因为是js库:所以要通过srcipt导入包
2. 通过${"#名字"}的方式获取到jsp页面的一行内容
3. 然后load方法里面两个参数
3.1 第一个要写Servlet地址
3.2 要写function(responseText,statusTXT,xhr){}
responseText:包含调用成功的结果内容
statusTXT:包含调用状态
xhr:包含XMLHttpRequest对象
4. 然后可以通过$("#名字").val("responseText")的方式给哪一行标签设置值;

使用固定格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script>
<script type="text/javascript">
function load(){
//$("#text01") 相当于 document.getElementById("text01");
$("#text01").load("/day16/DemoServlet02",function(responseText,statusTXT,xhr){ //responseText:包含调用成功的结果内容 statusTXT:包含调用状态 xhr包含XMLHttpRequest对象
//alert("jieguo:"+responseText);
$("#text01").val("responseText");
});
}
</script>
</head>
<body>

<h3><a href="" onclick="load()">使用JQuery执行load方法</a></h3>
<input type="text" id="text01">
</body>

Servlet代码:

1
2
3
4
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("给你数据");
}

二、get

使用步骤:

1
2
3
4
5
6
7
1. 因为是js库:所以要通过srcipt导入包
2. 通过${"#名字"}的方式获取到jsp页面的一行内容
3. 通过$.get("Serlvet相对地址",function(data,status){})
4. 最重要的三种赋值问题:
//$("#div01").html(data); //html() 一般和font标签有关 可以写html代码
//$("#div01").text("data"+data); //text()
//$("#div01").val(data); //val() 元素里面有value属性

使用固定格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script>

<script type="text/javascript">
function get(){
//$("#div01") 相当于 document.getElementById("text01");
$.get("/day16/DemoServlet02",function(data,status){
alert("结果是:"+data);
$("#div01").html(data); //html() 一般和font标签有关
//$("#div01").text("data"+data); //text()
//$("#div01").val(data); //val() 元素里面有values的属性值
});
}
</script>

</head>
<body>
<input type="button" onclick="get()" value="使用JQuery演示get方法">
<div id="div01" style="width:100px; height:100px; border:1px solid blue>
</div>
</body>

打开页面之后点击按钮-弹出Servlet传过来data:

然后关闭弹窗之后通过赋值会把内容给蓝框里面:


三、post

使用步骤:

1
2
3
4
5
6
7
1. 因为是js库:所以要通过srcipt导入包
2. 通过${"#名字"}的方式获取到jsp页面的一行内容
3. 通过$.post("Serlvet相对地址",{写传的数据},function(data,status){})
4. 最重要的三种赋值问题:
//$("#div01").html(data); //html() 一般和font标签有关 可以写html代码
//$("#div01").text("data"+data); //text()
//$("#div01").val(data); //val() 元素里面有value属性

使用固定格式:

1
2
3
4
5
6
7
8
<script type="text/javascript">
function get(){
//$("#div01") 相当于 document.getElementById("text01");
$.post("/day16/DemoServlet02", {name:"zhangsan",age:18},function(data,status){ //相当于把ajax里面get的servlet后面?name 这种形式改了
$("#div01").html(data);
});
}
</script>

四、总结语法格式

  • load

    $("#元素id").load(url地址);
    
    $("#div1").load(serlvet); ---> 使用的get请求,回来赋值的时候, 使用text();去赋值
  • get

    语法格式 : $.get(URL,callback);    
使用案例: $.get("/day16/DemoServlet02"  , function(data ,status) {
    $("#div01").text(data);
});
  • post

    语法格式:$.post(URL,data,callback);
function post() {
    $.post("/day16/DemoServlet02", {name:"zhangsan",age:18},function(data,status) {
        //想要放数据到div里面去。 --- 找到div
        $("#div01").html(data);
    });
}

Ajax实现校验用户名

一、搭建环境

1.新建jsp页面

新建jsp页面(主要代码)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<table border="1" width="400px">
<tr>
<td>用户名:</td>
<td><input type="text" name="name" id="name"></td> <span id="span01"></span>
</tr>
<tr>
<td>密码:</td>
<td><input type="text" name=""></td>
</tr>
<tr>
<td>邮箱:</td>
<td><input type="text" name=""></td>
</tr>
<tr>
<td>简介:</td>
<td><input type="text" name=""></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="注册"></td>
</tr>
</table>

jsp页面:

2.建立数据库(添加jar和xml配置文件)

需要导入DBUtils和C3P0数据池的jar文件以及数据池配置文件xml(修改数据库为user)

C3P0数据池配置文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>

<!-- default-config 默认的配置, -->
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property> <!-- 要和不用配置文件的set方法的后面一样 -->
<property name="jdbcUrl">jdbc:mysql://localhost/user?characterEncoding=utf-8</property>
<property name="user">root</property>
<property name="password">njdxrjgc7777777.</property>


<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</default-config>

<!-- This app is massive! -->
<named-config name="oracle"> <!-- oracle数据库用 -->
<property name="acquireIncrement">50</property>
<property name="initialPoolSize">100</property>
<property name="minPoolSize">50</property>
<property name="maxPoolSize">1000</property>

<!-- intergalactoApp adopts a different approach to configuring statement caching -->
<property name="maxStatements">0</property>
<property name="maxStatementsPerConnection">5</property>

<!-- he's important, but there's only one of him -->
<user-overrides user="master-of-the-universe">
<property name="acquireIncrement">1</property>
<property name="initialPoolSize">1</property>
<property name="minPoolSize">1</property>
<property name="maxPoolSize">5</property>
<property name="maxStatementsPerConnection">50</property>
</user-overrides>
</named-config>

</c3p0-config>

数据库建立如下(以前的校验都是if判断):


二、逻辑实现

使用MVC模式解决问题:


三、 具体分析

对于实现的分析图:


四、具体代码如下:

最终实现代码框架:

UserDao类:

1
2
3
4
5
public interface UserDao {

//检测用户名是否存在
boolean checkUserName(String username) throws SQLException;
}

UserDaoImpl类:

1
2
3
4
5
6
7
8
9
10
11
public class UserDaoImpl implements UserDao {
@Override
public boolean checkUserName(String username) throws SQLException{
//使用DBUtils的类
QueryRunner runner=new QueryRunner(JDBCUtil02.getDataSource()); //要从JDBCUtil02获取数据池对象

//执行sql语句
String sql="select count(*) from t_user where name=?"; //使用聚合函数count查出来就只有username一个属性
Long result=(Long) runner.query(sql,new ScalarHandler(),username); //第一个为sql语句 第二个返回值 第三个是传入的值username
return result>0;
}

checkUserNameServlet类代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class checkUserNameServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
//数据库有中文
request.setCharacterEncoding("UTF-8");

//1.获取name--然后通过面向接口的方式调用方法--通过sql语句聚集函数得到username是否存在
String name=request.getParameter("name");
System.out.println("name="+name);

UserDao dao = new UserDaoImpl();
boolean isExist=dao.checkUserName(name); //如果是true(daoImpl的值是1)--匹配到了

//2.通知页面-- 到底有没有
if(isExist)
{
response.getWriter().println(1); //存在
}
else
{
response.getWriter().println(2); //不存在
}
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}

主页demo03.jsp代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<%@ 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>
<script type="text/javascript">

function ajaxFunction(){ <!--拷贝写好的创建对象的方法 -->
var xmlHttp;
try{ // Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
}
catch (e){
try{// Internet Explorer
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e){
try{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e){}
}
}
return xmlHttp;
}

function checkUserName(){
//获取输入框的值
var name=document.getElementById("name").value;

//1.创建xmlhttprequest对象
var request=ajaxFunction();

//2.发送请求
request.open("POST","/day16/checkUserNameServlet",true);

//注册状态改变监听,获取服务器传送过来的数据
request.onreadystatechange=function(){
if(request.readyState==4&&request.status==200) // 已经能够正常处理 && 判断状态码是不是200
{
var data=request.responseText;
if(data==1){
document.getElementById("span01").innerHTML="<font color='red'>用户名已经存在!</font>";
}
else{
document.getElementById("span01").innerHTML="<font color='red'>用户名可以使用!</font>";
}
}
}

//如果是post方式就必须要添加头 --说明提交的数据类型是一个经过url编码的form表单数据
request.setRequestHeader("Content-type","application/x-www-form-urlencoded"
request.send("name="+name);

}
</script>
</head>

<body>
<table border="1" width="400px">
<tr>
<td>用户名:</td>
<td><input type="text" name="name" id="name" onblur="checkUserName()"><span id="span01"></span></td> <!-- 失去焦点就要弹出 -->
</tr>
<tr>
<td>密码:</td>
<td><input type="text" name=""></td>
</tr>
<tr>
<td>邮箱:</td>
<td><input type="text" name=""></td>
</tr>
<tr>
<td>简介:</td>
<td><input type="text" name=""></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="注册"></td>
</tr>
</table>
</body>
</html>

最终输入一个用户名会提示判断,并且在java控制台输出结果:


Ajax

一、Ajax概述

Asynchronous Javascript And XML异步JavaScript和XML
并不是新的技术,只是把原有的技术,整合到一起而已。

1.使用CSS和XHTML来表示。
2. 使用DOM模型来交互和动态显示。
3.使用XMLHttpRequest来和服务器进行异步通信。
4.使用javascript来绑定和调用。
  • 作用:

    刷新局部内容


二、数据请求 Get

创建一个demo01.jsp页面:主要去写浏览器点击按钮后通过ajax方式获得数据请求,servlet得到反馈。

数据请求中的Get思路:

1
2
3
4
5
6
1.在body里面写一个点击按钮 onclick="get()"
2.在head里面引入js代码写get()方法具体实现。
2.1 主要是去创建对象(调用我们写好的ajaxFunction()方法 ---在F盘的jar文件内)
2.2 使用open()方法可以添加数据--发送请求
2.3 使用request.onreadystatechange=function(){}--判断是不是准备好了
2.4 使用send()方法

jsp页面的主要代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>

<script type="text/javascript"> <!--使用jS文件-->

function ajaxFunction(){ <!--拷贝写好的创建对象的方法 -->
var xmlHttp;
try{ // Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
}
catch (e){
try{// Internet Explorer
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e){
try{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e){}
}
}
return xmlHttp;
}

function get(){
//1.创建xmlhttprequest对象
var request=ajaxFunction(); <!--调用写好的创建对象的方法 -->
//2.发送请求
request.open("GET","/day16/DemoSerlvet01?name=aa&age=18",true); // 第一个参数:get/post 第二个:相对路径 默认从 项目开始 所以只用写servlet的代码 第三个: true(异步) /false(同步)

//3.获取响应数据
request.onreadystatechange=function(){
if(request.readyState==4&&request.status==200) // (4)已经能够正常处理 && 判断状态码是不是200
{
alert(request.responseText); //弹出信息
}
}
request.send();
}

</script>
</head>

<body>
<h3><a href="" onclick="get()">使用Ajax方式发送Get请求</a></h3>
</body>

DemoSerlvet01主要去写输出:

1
2
3
4
5
6
7
8
9
10
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取传入的信息
String name = request.getParameter("name");
String age = request.getParameter("age");
System.out.println(name+" "+age);

//通过alert的方式弹出
response.setContentType("text/html;charset=utf-8"); //response解决方法加一行代码 而request可以加代码/tomcat永久更改(之前博客写过方法)
response.getWriter().write("啊啊");
}

最终点击jsp页面的一行弹出alert提示:java控制台输出获取的信息


三、数据请求 Post

跟get的差距:

  1. 只是在open里面要是传输数据需在send()里面写。
  2. 传输数据必须现有头部
1
2
3
4
5
6

//如果是post方式就必须要添加头 --说明提交的数据类型是一个经过url编码的form表单数据
request.setRequestHeader("Content-type","application/x-www-form-urlencoded");

//post不能根据open带过去
request.send("name=aa&age=18");

与get方法的前三步骤一样(不带参数):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function post(){
//1.创建xmlhttprequest对象
var request=ajaxFunction(); <!--调用写好的创建对象的方法 -->
//2.发送请求
request.open("POST","/day16/DemoSerlvet01",true); // 第一个参数:get/post 第二个:相对路径 默认从 项目开始 所以只用写servlet的代码 第三个: true(异步) /false(同步)

//3.获取响应数据
request.onreadystatechange=function(){
if(request.readyState==4&&request.status==200) // 已经能够正常处理 && 判断状态码是不是200
{
alert(request.responseText);
}
}

//如果是post方式就必须要添加头 --说明提交的数据类型是一个经过url编码的form表单数据
request.setRequestHeader("Content-type","application/x-www-form-urlencoded");

//post不能根据open带过去
request.send("name=aa&age=18");
}

主要代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>

<script type="text/javascript"> <!--使用jS文件-->

function ajaxFunction(){ <!--拷贝写好的创建对象的方法 -->
var xmlHttp;
try{ // Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
}
catch (e){
try{// Internet Explorer
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e){
try{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e){}
}
}
return xmlHttp;
}

function post(){
//1.创建xmlhttprequest对象
var request=ajaxFunction(); <!--调用写好的创建对象的方法 -->
//2.发送请求
request.open("POST","/day16/DemoSerlvet01","true"); // 第一个参数:get/post 第二个:相对路径 默认从 项目开始 所以只用写servlet的代码 第三个: true(异步) /false(同步)

//3.获取响应数据
request.onreadystatechange=function(){
if(request.readyState==4&&request.status==200) // 已经能够正常处理 && 判断状态码是不是200
{
alert(request.responseText);
}
}

//如果是post方式就必须要添加头 --说明提交的数据类型是一个经过url编码的form表单数据
request.setRequestHeader("Content-type","application/x-www-form-urlencoded");

//post不能根据open带过去
request.send("name=aa&age=18");
}

</script>
</head>
<body>
<h3><a href="" onclick="post()">使用Ajax方式发送Post请求</a></h3>
</body>

DemoSerlvet01主要去写输出:

1
2
3
4
5
6
7
8
9
10
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取传入的信息
String name = request.getParameter("name");
String age = request.getParameter("age");
System.out.println(name+" "+age);

//通过alert的方式弹出
response.setContentType("text/html;charset=utf-8"); //response解决方法加一行代码 而request可以加代码/tomcat永久更改(之前博客写过方法)
response.getWriter().write("啊啊");
}

四、部分方法解析#

创建xmlhttprequest对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function ajaxFunction(){     <!--拷贝写好的创建对象的方法 -->
var xmlHttp;
try{ // Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
}
catch (e){
try{// Internet Explorer
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e){
try{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e){}
}
}
return xmlHttp;
}

open()方法

  1. 第一个参数: GET/POST
  2. 第二个参数: 相对地址(相对于localhost:8080中的8080) 一般是 “/项目名/servlet名字” (GET的方式可以直接?name=lisi&age=18;而POST的方式只能在send里面写,而且要加头)
  3. 第三个参数: true(异步)/false(同步)
1
request.open("GET","/day16/DemoSerlvet01?name=aa&age=18",true);

onreadystatechange=function(){}–判断状态##

1
2
3
4
5
6
7
//固定的格式:
request.onreadystatechange=function(){
if(request.readyState==4&&request.status==200) // 已经能够正常处理 && 判断状态码是不是200
{
alert(request.responseText); //配合request.responseText使用
}
}

readystate状态集:

status的状态集:

send()方法

1
2
3
4
5
6
7
8
9
10
	//如果是post方式就必须要添加头  --说明提交的数据类型是一个经过url编码的form表单数据
request.setRequestHeader("Content-type","application/x-www-form-urlencoded");

//post不能根据open带过去
request.send("name=aa&age=18");

// -----------------------------------------------

//get方式
request.send();

学生管理系统(2.0)

一、数据库准备

数据库SQL语句:

1
2
3
4
5
6
7
8
9
10
11
CREATE DATABASE stus;
USE stus;
CREATE TABLE stu (
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR (20),
gender VARCHAR (5),
phone VARCHAR (20),
birthday DATE,
hobby VARCHAR(50),
info VARCHAR(200)
);

Navicat配合mysql直接可视化:


二、环境搭建(Dao)#

1. 先写index.jsp页面

2. 写一个StudentListServlet类去进行查询学生信息—弹出到list.jsp页面

3. 写一个Student类(封装):里面写所有数据库的属性以及set和get方法

4. 写dao层里面的StudentDao类:里面去写要完成什么方法

5. 写dao.impl里面的StudentDaoImpl类:具体去写连接数据库等操作


三、环境搭建(Dao实现)

1.需要连接开源数据池和连接数据库:
所以要引入c3p0和DBUtils的jar以及连接数据库的jar包,还有就是要有c3p0开源数据池的配置文件。

2. 建立Util包,里面放写好的JDBCUtil02(简化的JDBC连接类)

3. StudentDaoImpl类里面去完成写当时的连接数据库查询的三步


四、环境搭建(Service层)

1. 新建service接口和实现类–和dao以及daoimpl代码一样(为了service去找dao)

2. 在Serlvet代码内增加StudentService service=new StudentServiceImpl()(为了servlet找service)


五、查询所有学生#

1. 完善Servlet类

1
2
3
4
5
6
7
8
9
//1.查询出所有学生
StudentService service=new StudentServiceImpl(); //Servlet去找service 然后他会去找dao层
List<Student> list = service.findAll(); //找到查询方法

//2.先把数据存到作用域中
request.setAttribute("list", list);

//3.有结果了--跳转
request.getRequestDispatcher("list.jsp").forward(request, response);

2. 写跳转的list.jsp页面

1
2
3
4
1.在body里面建立2*8的表格:
第一行写标题(姓名、性别等)
第二行要用JSP里面学过的JSTL语言配合EL表达式循环出所有的结果
2.导入所需要用的jstl.jar和standard.jar包

六、添加学生

1. 通过主页面list.jsp的添加href要去找添加的界面,因此写一个add.jsp页面

2. 接下来完成servlet(1.获取客户端提交的信息 2.添加到数据库 3.跳转到list.jsp的主页面)

3. 需要去找dao层的studentDao写insert()方法

4. 然后去impl里面去实现insert()方法
和之前的查询一样都是两步:第一步通过JDBCUtil02导入连接;第二步通过update的方法导入信息

5.更改service层代码–添加和dao一层的代码,但是在impl里面建立dao的对象

6. 更改Add.servlet层代码–添加到数据库

注意事项

  1. 需要更改eclipse和mysql的编码格式都为UTF-8
  2. 需要注意爱好需要用数组然后转字符串输出(不然就只能显示一个)

七、删除学生

1. 设置点击超链接弹出一个询问框,如果点击确定–删除成功

1
<a href="#" onclick="doDelete(${stu.sid})">删除</a>

2. 让超链接执行js方法–触发servlet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<script type="text/javascript">

function doDelete(sid) {
var flag = confirm("是否确定删除?"); //提示语
if(flag){
//表明点了确定。 访问servlet。 在当前标签页上打开 超链接,
//window.location.href="DeleteServlet?sid="+sid;
location.href="DeleteServlet?sid="+sid;
}
}

</script>

```
**3. js点击确定--会获取到sid,然后给sid跳转到servlet**

**4. servlet收到了请求 ---> service,service ---> dao**

---

# 八、更新学生 #

** 1.和之前的操作差不多都是dao和service
去写方法,impl去写实际功能。**

** 2.在list.jsp要通过按钮href标签`EditServlet?sid=${stu.sid}`去找sid然后相当于弹出一个edit的jsp页面展示原来的信息,然后根据更改提交给原来的展示所有的StudentListServet之后在弹出list.jsp页面**


---

# 九、模糊查询 #

**要将list的表格通过form提交,然后里面的sql语句要用拼凑的方法。**

```
String sql="select * from stu where 1=1"; //啥也不选就提交就这样的sql语句
List<String> list=new ArrayList<String>(); //存放传入的sname/sgender

//拼装
if(!TextUtil.isEmpty(sname))
{
sql=sql+" and sname like ?";
list.add("%"+sname+"%"); //因为like在前面 所以要用%包起来
}
if(!TextUtil.isEmpty(sgender))
{
sql=sql+" and gender=?";
list.add(sgender);
}

十、分页(还未实现 可以再F盘的jar文件找源码)

  • 物理分页 (真分页)

来数据库查询的时候,只查一页的数据就返回了。

 优点 内存中的数据量不会太大

缺点:对数据库的访问频繁了一点。

SELECT * FROM stu LIMIT    5 OFFSET 2 (一次性五条 相对与之前的而言)
  • 逻辑分页 (假分页)

一口气把所有的数据全部查询出来,然后放置在内存中。

优点: 访问速度快。

缺点: 数据库量过大,内存溢出。

十一、代码完整上传至其他仓库(Student management system)

,