JavaWeb学习笔记,主要是讲Java Servle,很适合Java开发网站的入门学习。
(以课程进度为目录)
第四周Web课
.jsp中删除共性代码(html、body)————.java文件能相对的简洁
taglib 指令(标签库)
动作元素action——element:
包含include
动态包含:在运行时才引入文件,代码也会动态引入,时间和使用方式不同
<jsp:include page="show-time.jsp"/>
分为以下五步:
- 将被包含的 jsp文件1 直接放入服务器解析
- 生成文件1.java文件
- 将文件1的结果放入文件2中
- 再将文件2 放入服务器解析
- 生成一个文件2.java 文件
还可加入 flush="true":每次动态执行时,将检查文件是否改变——若改变则重新生产java class
静态包含:
<%@ include page="show-time.jsp">
使用上面的静态包含,能将文件1 (show-time.jsp)的内容复制到文件2(使用<%@ include page="show-time.jsp">代码的文件)
区别:
1、命令不同。
2、一个文件(转成java之间全部包含进来,一次转成java)
多文件(各自转化成java class,用动态包含进来——类似"方法"调用
3、静态VS动态:静态包含的页面是静态的。动态包含的内容是可变
4、flush="true"多 这一个
5、静态包含不能传参数、动态可以
1 jsp:include是动态包含
而<%@ include000000%>是静态包含。
2 动态包含可以给被包含的页面传递参数。
静态包含不能给被包含的页面传递参数。
3 动态包含的地址可以是变量。
静态包含的地址是常量。
4 <jsp:include page=“file” flush=“true” />它总是会检查所含文件中的变化。(flush:刷新缓冲区)
而<%@include file=“file”%>不会检查所含文件的变化,适用于包含静态页面。
<jsp:param value="" name=""/> 键值对传参
使用 action-eclement.jsp文件中写 需要传递的信息
不能单独使用,需要在被包含页面处理
当jsp:include和jsp:param动作元素一起使用时,可以将jsp:param中提供的参数值传递到jsp:include要加载的文件中去,因此当jsp:include和jsp:param结合使用时,可以在加载文件的过程中同时向该文件提供信息。
(66条消息) jsp的动作元素(include和param)_ClearLoveQ的博客-CSDN博客
这是接收:
.getParamter();
对表单中的数据进行接收
String a = request.getParamter("name");接收并输出 show-time.jsp文件中接收
out.print(bj);
注意jsp:forward 和 jsp:include的区别:
区别在于,执行forward时,被forward的页面将完全替代原有页面;而执行include时,被include的页面只是插入原有页面。
简而言之:forward拿目标页面代替原有页面,而include则拿目标页面插入原有页面。
注意格式include
<jsp:include page = "success.jsp">
<jsp:param value="成功参数" name = "a1"></jsp:param>
</jsp:include>
注意格式forward
<jsp:forward page = "success.jsp">
<jsp:param value="我是成功的传参数量" name="a1"/>
</jsp:forward>
跳转forword
<jsp:forward page="success.jsp"/>执行到该语句将直接执行——跳转到相应的jsp页面
服务端跳转:
浏览器地址不改变
欢迎<%= request.getParamter("name")/> 用以接收 传来的信息的name信息
【课堂登录案例:登录jsp页面->跳转到->处理jsp(单纯的处理信息)->根据处理结果->调到相应的jsp页面去:在相应的页面使用
上面的语句获取跳转的相关信息】
客户端调整:
客户端跳转,浏览器地址会改变,到达指定的URL后,上个页面(跳转之前的原来页面)中的请求全部结束,原request对象将会消失,数据将会消失。新页面会新建request对象,即产生新的request对象。
response.sendRedirect(fail.jsp)
服务端跳转
采用请求转发方式,在跳转页面的时候是带着原来页面的request和response跳转的,request对象始终存在,不会重新创建
request.getRequestDispatcher(url).forward(request,response)
区别:
1、地址变与不变
2、服务器跳转可以传值request.getParamter();方法。客户端不能传值
3、(java代码写在<%中%>)
标签创建对象Bean
<jsp:useBean id="" class="" />__________了解就行
如何在页面上通过标签的方式创建对象
Student stu = new Student();//java方式
id -> stu 对象名
需要先创建Public java类(Student)需要无参构造 get/set方法
此时类称为 Bean
下面的方法将调用默认的构造方法
<jsp:useBean id="stu" class="com.wfpan.vo.Student"/></jsp:useBean>
<jsp:setProperty property="name" name="stu" value="rj"/>赋值
<jsp:setProperty property="age" name="stu" value="18"/>赋值
name: <jsp:getProperty property="name" name="stu" />取值
age: <jsp:getProperty property="age" name="stu" />取值
<jsp:set/getProperty name=""[value=""]/>
jsp面向对象
1、内置对象 built-in-object
tomcat new 出来的对象() ->都是小写的
1)java块中<% %> 2)<%= %> ->jspservice 直接调用:
out:页面输出流——页面上输出信息
<%
out.print("Hello World");//网页面上输出信息
request.getResquestDispatcher("success.jsp").forward(request,response);//跳转到success.jsps去
%>
2、request
封装请求数据
map封装的键值对(name、value)
key 表单name
第五周Web课
### request response和request都是jsp内置对象,request是获取用户的请求,response处理用户请求。 ### request
本身也是个作用域:
hander.jsp;
forward()函数可以延伸request作用域
:request.getRequestDispatcher().forward()函数可以延长request的作用域
request
.setAttribute()
给request设置内容
rquest.setAttribute("Keys":object,"内容value":objet)//设置传递的值——设值
.getRequestDispatcher()
跳转页面——可延长request的作用域
下面的样例将request的作用域延长的到了success.jsp页面中
request.getResquestDispatcher("success.jsp").forward(request,response);
//跳转到success.jsp页面
//可以在 request中传递想要传递的值
requst.getRequestDispatcher("").forward(request,response);//服务器端跳转
//Map(key,value)底层思路
request.setAttribute("Keys":object,"内容value":objet)//设置传递的值——设值
request.getAttribute("Keys");//获取内容——取值
request.setAttribute("stuList",new ArrayList<Student>(){})
//可以存任何的数据类型(只要是Object的子类就行)
request.getRequestDispatcher("想要跳转的界 面.jsp").forward(request,reponse);//跳转方式
//下面小例也是使用的如此方法
.sendRedirect()
response.sendRedirecte(''wfpan.jsp ");//简单的跳转,客户端跳转
小例思路:Student类——辅助类,方便传递参数封装对象Student。
index-hander.jsp 处理界面——然后跳转到相应的界面:是以Student对象的形式处理传来传去的数据的。
index类:有兴趣爱好之类的信息——间接传递给seccess.jsp页面,并显示相关内容(跳转页面需要携带相关的数据)
404:网站找不到
500:程序有误
热部署:自动保存数据
.setCharacterEncoding()
处理method = "Post"请求中中文乱码
request.setCharacterEncoding("utf-8");
.getParamter()
处理表单传来的数据,获取其内容
String name = request.getParameter("username");
String pwd = request.getParameter("pwd");
reponse
.setContentType()
使客户端浏览器,区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据。
功能和jsp文件首行的功能一致 utf-8
response.setContentType(" text.html; charset=utf-8 ")//在首行没配置时才有用
.sendRedirect();
sendRedirect()函数的作用是重定向网页,向浏览器发送一个特殊的Header。然后有浏览器来做重定向,跳转到指定的页面。
传递页面:不带参数的形式__单纯的传递页面
response.sendRedirect("fail.jsp");//跳转到fail.jsp页面——使用正确
fail.jsp页面
直接写 out.print("登录失败")——只要识别中文utf-8也可以
response.setContentType(" text.html; charset=utf-8 ")//在首行没配置时才有用
session
session:会话,第一次连接到服务器后就有session对象——限时30分钟(如果30分钟内没操作,将释放掉会话session对象)
作用域:可共享同一个session,session可被多个页面共享(同一个浏览器发出的请求)
会话:记录用户状态(用户名,密码,权限——权限控制)。应用:临时购物车!免登录!
.getId()
获取session id号
.setMaxInactiveInterval()
设置时间间隔
session.setMaxInactiveInterval(1000);
.getMaxInactiveInterval()
获取同一个session对象最大不活跃间隔(间隔)
一般是30分钟
out.println(session.getMaxInactiveInterval());//直接输出
.setAttribute("","")
设置属性,键值对
.getAttribute
获取属性
.removeAttribute()
删除属性
.remove()
删除指定session数据
session.remove("user");——不推荐
.invalidate()
1、(无效)session销毁,用于退出登录。
2、服务器重启也可让session消失
3、超时消失
样例:
一旦登录成功,将用户信息保存取来
handler.jsp页面
session.setAttribute("stu",stu);
传递respnose.getRequestDispatcher("跳转页面.jsp")
!!!重要
此处如果使用session,则response也可以跳转带数据了。原因是用为使用了session来存储数据的,它为所有对象所共享的。
——可见response只跳转,而不传递值——跳转。
<%
success.jsp页面
Student stu = (Student)session.getAttribute("stu");//从session中获取信息
%>
//做登录判断
Object stu = session.getAttribute("stu");
if(stu == null){
//为空
//做登录界面,进行登录
}else{
//方法一:
//stu类型转化成 Student类型
Student stu2 = (Student) stu;
//不为空将session——stu中的账号,密码提取出来写到相应输入框中
/*
账号= stu2.getName();
密码= stu2.getPassword();
*/
//方法二:直接跳转到第二页去
response.sedRedirect("success.jsp");
}
//退出
session.invalidate();
response.sedRedirect("index.jsp");//跳转到登录界面
第六周Web课
1.登录检测
2.购物车
User类(用户信息类),Good类(商品类),Cart类(购物车):List
<!--index.jsp页面-->
<%
Object cu = session.getAttribute("curUser");
if(null != cu){
User u = (User)cu;
%>
用户名:<input type = "text" name = "username" value ="<%=u.getname>"/><br/>
密码:<input type = "password" name = "pwd" alue ="<%=u.getpwd>"/><br/>
<input type = "submit" value="登录"/>
<a href = "quit.jsp">退出登录</a>
<%}%><%else{%>
<from action="index-hander.jsp"
用户名:<input type = "text" name = "username"/><br/>
密码:<input type = "password" name = "pwd"/><br/>
<input type = "submit" value="登录"/>
</from>
<%}%>
index-hander.jsp
<%
tring name = null;
Object cu = session.getAttribute("curUser");
if(null != cu){
request.getRequestDisapatcher("success.jsp").forward(request,response);
}else{//从第一页index.jsp跳转过来的
name = request.getParameter("username");
if(null == name){//排除从其他页面跳转过来
response.sendRedirect("index.jsp");
return;
/*
避免直接通过url直接访问处理界面而是界面报错
增加网页的安全性
*/
}
}
String pwd = request.getParameter("pwd");
if(判断用户名与相应数据是否相等){
request.setAttribute("nLogin",1);//传登录次数
request.setAttribute("curUser",user);//传用户信息
//查找数据库,反馈相关信息——模拟形式。
LList<Good> gList = new ArrayList<>();
for(int i = 0; i < 10; i++){
Good g = new Good();
g.setId(i);
g.setGoodName("aaa"+i);
g.setGoodPrice(10+i);
//商品列表
gList = new ArrayList<>();//记得导包
gList.add(g);
}
//session.setAttribute();session用于存放较小的数据
//request 只能在两个页面存储——可用于存储较大的数据(商品信息只需要在两个页面处理)
//request.setAttribute("gList",gList);
sessionsetAttribute("gList",gList);//为了方便,还是应该用上面的方法
//下面的方法能传递request信息
request.getRequestDisapatcher("success.jsp").forward(request,response);
}
%>
<!--success.jsp页面-->
<%
//登录检测
Object cu = session.getAttribute("curUser");
if(null != cu){
String nLogin = request.getParameter("nLogin");
User u = (User)cu;
//List<Good> gList = (ArrayList<Good>)request.getAttribute("gList");//获取商品列表
List<Good> gList = (ArrayList<Good>)session.getAttribute("gList");//获取商品列表
%>
<!-- 被抛弃的方法 <jsp:getProperty property="uname" name="u"/> -->
<%=u%>
商品列表<br/>
<table border =“1”>
<tr><td>id</td><td>商品名</td><td>价格</td><td>操作</td></tr>
<%
Good g = null;
for(int i = 0; i < gList.size(); i++){
g = gList.get(i);
%>
<tr><td><%=g.getId()%>=gList.getId %></td><td>苹果1</td><td>9.9</td><td><a href="add-to-cast.jsp?id=<%=g.getId()">加入购物车</a></td></tr>
<tr><td>2</td><td>苹果2</td><td>9.99</td><td><a href="">加入购物车</a></td></tr>
<tr><td>3</td><td>苹果3</td><td>9.1</td><td><a href="">加入购物车</a></td></tr>
<tr><td>4</td><td>苹果4</td><td>9.3</td><td><a href="">加入购物车</a></td></tr>
<tr><td>5</td><td>苹果5</td><td>9.4</td><td><a href="">加入购物车</a></td></tr>
</table>
<a href = "quit.jsp">退出登录</a>
<a href = "showCart.jsp">形式购物车</a>
<%}}else {%>
还未登陆,请<a href = "">登录</a>
<!--#号表示当前页-->
<%}%>
quit.jsp
<%
session.invalidate();
resoinse.sendRedirect("index.jsp");
%>
add-to-cast.jsp
<%
//根据id 查数据库,查找相应的商品信息
sObject cu = session.getAttribute("curUser");
if(null != cu){
String nLogin = request.getParameter("nLogin");
User u = (User)cu;
//根据id查询数据库得到加入的商品的信息
Strign id = request.getParameter("id");
List<Good> gList = (ArrayList<Good>)session.getAttribute("gList");//获取商品列表,报错 try catch
//1.数据获取
Object ctmp = session.getAttribute("cart");
Cart c = null;
if(null != ctmp){
c = (Cart) ctmp;
}else{
c = new Cart();
}
c.getList().add(gList.get(Interger.parserInt(id)));
session.setAttribute("cart",c);
response.sendRedirect("succession.jsp");
}
%>
showCart.jsp
显示购物车
<%
//登录检测
Object cu = session.getAttribute("curUser");
if(null != cu){
String nLogin = request.getParameter("nLogin");
User u = (User)cu;
//List<Good> gList = (ArrayList<Good>)request.getAttribute("gList");//获取商品列表
Cart c= (Cart)session.getAttribute("cart");//获取商品列表
List<Good> gList = c.getList();//获取商品列表
%>
<!-- 被抛弃的方法 <jsp:getProperty property="uname" name="u"/> -->
<%=u%>
商品列表<br/>
<table border =“1”>
<tr><td>id</td><td>商品名</td><td>价格</td></tr>
<%
Good g = null;
for(int i = 0; i < gList.size(); i++){
g = gList.get(i);
%>
<tr><td><%=g.getId()%>=gList.getId()%></td><td><%=g.getId()%>=gList.getname()%></td><td><%=g.getId()%>=gList.getPrice() %></td></tr>
<a href = "quit.jsp">退出登录</a>
<a href = "showCart.jsp">形式购物车</a>
</table>
<%}}else {%>
还未登陆,请<a href = "">登录</a>
<!--#号表示当前页-->
<%}%>
添加购物车项CartItem类,放在Cart列表中,方便存储数据:数量信息。
(数量信息与用户紧密联系,与商品表,无关系的)
<%
//判断是否有购物车
无:创建,初始化为=1
有:将数量+1;
for循环找出 id,名称,价格,数量
%>
第七周Web课
session vs request:
pageContext
context:情境,所处的环境(Page的作用域)
pageContext = .getPageContext(this,request,response,null,true,8192,true)//this表示当前页面有效
PageContext pageContext = new PageContext();
//对应类:javax.servlet.jsp.PageContext;
pageContext.getSession();
pageContext.getOut();
pageContext.getPage();
pageContext.getResponse();
pageContext.getRequest();//ServletRequest()
((HttpServletRequest)rep).getContextPath();//Servelt时可能会用来ping路径
out.print(request.getContextPath());//输出根目录 "/Week07"-> "WebContent"相对应
//原因:在创建项目是在编译器中设置了相应的对应关系
page->java->servlet
File : jsp->java->class
application
javax.servlet.ServletContext;
服务器启动时创建,关闭,重启的时候关闭。
作用域:整个服务器——>整个项目
//由于是在服务器上:作用域大
//每个页面都可以使用它
//应用:在线用户统计 vs 历史访问人数
application.setAttribute("","");
application.getAttribute("","");
模拟在线用户统计
<!--需要不断刷新才能实时显示具体用户数量-->
<%
int uc2 = 0;
Object uc = application.getAttribute("usercnt");
if(null == uc){//第一次登录
application.setAttribute("usercnt",1);
}else{
uc2 = (Integer)uc;
//取出来 + 更新(对新用户增加)
if(session.isNew()){
uc2++;
application.setAttribute("usercnt",uc2);
}
//非新用户不用操作
//手动删除
//allication.removeAttribute(age0);
}
%>
当前用户数量为:<%= uc2%>个人
<!--只要不关闭服务器,历史数据一直在的-->
config
配置信息,servet配置信息web.xml
page
页面上的this
exception
isErrorpage——不长用
作用域:page前天我们就举报完例子嘛就是说这个
发送错误类:
errorPage = “
接收错误类
前面:isErrorPage="true"
可以获取错误信息
主题
数据的传递
两个页面
1、表单传递
<%
//action = "调到哪里 .jsp/servlet"
//method 数据的传递方式:get,post
get:
1.会把表单数据拼接到url上 ?var=value&var=value&var=value
将表单里面的数据拼接到action里的url里面(以?连接)
问题:
2.传递中文->易乱码(通过浏览器进行加密解密)
3.明码
4.数据比较小(4MB ->或许?)
5.比较快
6.安全性低
post:
1.会把表单数据作为流的一部分 socket serversocket
2.不是明码
3.数据量大
4.比较曼
5.安全性高
%>
<form action = "" mehtod = "">
<!--隐含表单元素-->
<input type="hidden" name="" value=""/>
<label></label><!--包裹,里面的东西都可以点击-->
<!--多选项-->
<label><input type="checkbox"/>吃饭</label>
<input tyoe="checkbox"/>睡觉
<!--下拉选择框-->
<select name = "">
<option>杭州</option>
<option>重庆</option>
</select>
<!-- 单选,通name属性的才可以只选一个 -->
<label><input type="radio" name="id1"/>吃饭</label>
<label><input tyoe="radio" name="id1"/>睡觉</label>
</form>
2、超级链接传递
get方式传递
<a href="" target="_blank">submit</a>
序列化机制
3、request+ (setter/getter)服务端跳转一下
request.getRequestDispatcher("想要跳转的界面.jsp").forward(request,reponse);//跳转方式
多个页面
session:生存周期长,一直占用资源,空间不够用,(服务器内存宝贵)
application:在线人数
两个页面:request
登录状态:session
处理乱码方式
//post ->getParameter():出现乱码——解决方式
request.setCharacterEncoding("utf-8").getParameter("uname");
//get 处理乱码:new String();
String username = request.getParameter("uname");
String uname = new String(username.getBytes("iso-8859-1"),"utf-8(编码charset)");//哪里用到转哪里
产生乱码原因:编码不一致
pageEncodign()指定硬盘上的编码 ->java -> class ->tomcat(iso-8859-1)->页面上(utf-8)
(了解不推荐)另一种解决乱码方式:在tomcat文件 server.xml 中修改编码格式
session vs request
表单数据传递
第八周Web课
Cookie:记住密码+自动登录
介绍:
<!--
Cookie:网站通过浏览器在这个用户硬盘上放的小文件,存放了一些信息,用来提高用户体验(方便、便利)
网站:服务器(上面),网站vs .cookie文件 1:m关系
浏览器:中介(并不一定帮你放到硬盘上:1、放+立马消失(时间,cookie有效期)2、
硬盘:存放地址(位置)大约:300个
文件:个数(20个)、大小(4k/2k)、安全性(谁存,谁用)
信息:怎么存、怎么取
response:cookie存入
request:getCookies取
Cookie创建、存值
体验:
1、记住登录信息:登录用户名+密码——>自动登录
2、广告:记录在站点的信息(点击的页面、文章(商品)、页面上停留的时间(页面有什么)、时序)——>推荐(内容-兴趣)
cookie联盟:细化(行业公司在经营:寡头)
依赖于浏览器设置-禁掉/不禁掉
-->
Cookie指令
<%
//创建
//键值对
Cookie username = new Cookie("username","value");
Cookie pwd = new Cookie("pwd","123");
//Cookie的默认时间是0,创建好,addCookie后立马就无效,必须设置有效时间
username.setMaxAge(60*60*24);//60秒*60分*24小时=一天
pwd.setMaxAge(60*60*24);
//添加Cookie到浏览器-硬盘(位置:Edge/Cookie和管理权限/查看所有站点数据)
response.addCookie(username);
response.addCookie(pwd);
</%>
week06项目
<%
//取
//登录检测
Object cu = session.getAttribute("curUser");
if(null != cu){//有登录过的
User u = (User)cu;
%>
<!-- <form action = "index-handler.jsp">
用户名:<input type = "text" name = "username" value ="<%=u.getUname()%>"/></br>
密码:<input type = "password" name = "pwd" alue ="<%=u.getPwd()%>"/></br>
<input type = "submit" value="登录"/>
<a href = "quit.jsp">退出登录</a>
</form>
--> <!-- 在有登录过的基础上选择是否要退出之前的登录信息 -->
用户名:<%=u.getUname()%><br/>
密 码:<%=u.getPwd()%><br/>
<a href="quit.jsp">退出登录</a>
<%} else {
//这个位置取Cookie,去做填充
//得到这个站上的所有Cookiex
Cookie[] cks = request.getCookie();
String username="",pwd="";
for (Cookie c : cks){
if("username".equal(c.getName())){
username = c.getValue();
}
if("pwd".equal(c.getName())){
pwd = c.getValue();
}
}
%>
<form action="index-handler.jsp">
用户名:<input type = "text" name = "uname" value="<%=username%>"/><br/>
密码:<input type = "password" name = "pwd" value="<%=pwd%>"/><br/>
<input type = "submit" value="登录"/>
<a href = "Register.jsp">注册</a>
</form>
<%}%>
<%
//存
if(name1.equals(user.getUname()) && pwd1.equals(user.getPwd()))
//if(user == user2)
{
if("1".equals(jzmm)){
//添加Cookie
//键值对
Cookie username = new Cookie("username","value");
Cookie pwd = new Cookie("pwd","123");
//Cookie的默认时间是0,创建好,addCookie后立马就无效,必须设置有效时间
username.setMaxAge(60*60*24);//60秒*60分*24小时=一天
pwd.setMaxAge(60*60*24);
//添加Cookie到浏览器-硬盘(位置:Edge/Cookie和管理权限/查看所有站点数据)
response.addCookie(username);
response.addCookie(pwd);
}
request.setAttribute("nLogin", 1);//登录
session.setAttribute("curUser", user);
//登录成功——开始操作数据
/*
理论上:查找数据库、吧商品信息找出来
*/
//展示商品信息
List<Good> gList = new ArrayList<Good>();
for(int i = 0; i < 10; i++){
Good g = new Good();
g.setId(i+"");
g.setGoodname("苹果"+i);
g.setGoodPrice(10+i);
//商品列表
gList.add(g);
}
//将gList信息存入到商品列表中
session.setAttribute("gList", gList);
request.getRequestDispatcher("success.jsp").forward(request, response);
}
>%
SQL:数据库创建
SQL-Server 2022 software
SQL: 语言标准
MySQL:中小型数据库(后面使用的工具软件)
第九周Web课
Java连接标准:interface(一对多),多家数据库厂商应该符合该标准才能使用java来访问数据库。
Dynamic Web项目导mysql包,放在web-in里面(自动导入)
两层模式:
数据展示、逻辑控制——>jsp
数据获取——>java
<!--
index-hander.jsp
不涉及显示的,应将<html></html>部分删掉
-->
<%
//数据获取
String username = request.getParamenter("username");
String pwd = request.getParameter("pwd");
//数据封装——新建一个类
User user01 = new User();
user01.setName(username);
user01.setPwd(pwd);
//业务逻辑处理,干什么做什么
//对密码,用户名进行比较(数据库)
//数据库的连接、获取
//DAO、DAOimpl
UserDao ud = new UserDaoimpl();
User u = ud.finOne(user01);
if(null != U){
session.setAttributr("user",u);//将用户信息传入Session中,方便页面之间调用
//登录成功_跳转到成功界面
response.sendRedirect("success.jsp");
}else{
//登录失败_跳转到失败界面
response.sendRedirect("faild.jsp");
}
%>
//连接数据库的接口——面向对象的思想
//UserDao.java,放在UDao包里面
interface UserDao{
/*
用户数据的访问对象
增删改查
*/
public void register(User user) throws SQLException;
public void delete(int id) throw SQLException;
public void modify(User user) throws SQLException;
public void finOne(int id) throw SQLException;
public void finAll() throw SQLException;
public void findOne(String username,String pwd);
}
public UserDaoimpl implements UserDao{
//连接字符串
public static final String URL = "jdbc:mysql//localhost:3306/具体数据库名称";
public static final String USER = "root";//数据库用户名
public static final String PWD = "123456";//数据库密码
//实现接口的所有方法
public User finOne(String username,String pwd) throws SQLException{
try{
//1.加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
//2.创建连接_java下面的接口
Connection conn = DriverManager.getConnection(URL,USER,PWD);
//3.创建SQL语句_查询功能
String Sql = "select id,name,pwd from 表名 where name '' and pwd = ' '";
//User user是查询对象时
String Sql = "select id,name,pwd from 表名 where name '"+user.getUserName()+"' and pwd = '"+user.getPwd()+"'";
//4.创建发射器
//Statement stat = conn.createStatement();//01
PreparedStatement ps = conn.prepareStatement(Sql);//02 预编译的发射器
ps.setString(?的位置,值)//处理Sql语句中的?值
ps.setString(2,pwd)
//5.发射. 查询xxxQuery(select),更新xxxUpdate(inser,delet,update)
//ResultSet rs = stat.executeQuery(Sql);//发射后有返回值
ResultSet rs = ps.executeQuery();//返回所有看最下面代码
User u = null;
if(rs.next()){
//由内容,则返回
u = new User();
u.setId(rs.getInt(0))
//u.setUserName(rs.getString("name")
u.setUserName(rs.getString(2)
u.setUserPwd(rs.getString(3)
}
}catch(ClassNotFoundException e){
//输出错误
}
}
}
List<User> userList = new ArrayList<User>();
User u = null;//节省空间
while(rs.next()){
u = new User();
u.setId(rs.getInt(0))
//u.setUserName(rs.getString("name")
u.setUserName(rs.getString(2))
u.setUserPwd(rs.getString(3))
userList.add(u);
}
return userList;
第十周Web
修改操作
public void findOneById(){//数据库操作语句
}
这里不完整
<!--搜索框-->
<!--
名字,id都可搜索
select * from user where name like = '*3*' or pwd like '*3*';//使用通配符使用
select * from user where name like = ? or pwd like ?;
-->
<form action = "">
<input type = "text" name = "find"/>
<input type = "submit" value = "搜索"/>
</form>
<a href = "user-modify-handler.jsp?id">修改</a>
<!--处理界面user-modify-handler.jsp-->
<%
String Sid = request.getParameter("id");//获取数据
//封装
//业务逻辑处理
UserDao ud = new UserImpl();//连接数据库,并进行处理
User user = ud.findOneById(Integer.parseInt(sId));//不需要空判断,findOne()函数需要写好(前提)
request.setAttribute("user",user);
request.getResquestDispatcher("user-updata.jsp").forward(request,response);//信息修改页面
%>
<!--user-updata.jsp-->
<%
//获取需要修改的用户信息
User user = (User)request.getAttribute("user");
%>
<form action = "user-updata-handler.jsp">
<input type = "hidden" name = "id" vlaue = "<%=user.getId() />
id:<input type = "text" vlaue = "<%=user.getId()>" disabled = "disable"/><br/>不可修改
用户名:<input type = "text" name ="username" vlaue = "<%=user.getName()>"/><br/>
密码:<input type="text" name ="pwd" vlaue = "<%=user.getPwd()>"/>
<input type = "submit" value="修改">
</form>
<!--根据提交的信息进行修改 user-updata-handler.jsp-->
<%
Int id = Integer.pardeInt(request.getParameter("id"));
String username = request.getParameter("username");
String pwd = request.getParameter("pwd");
//封装
User user = new User();
user.setId(id);
user.setUsername(usernmae);
user.setPwd(pwd);
UserDao ud = new UserImple();
ud.modify(user);//数据库更改操作,updata操作,根据userid来更改username和pwd
/*
Sql语句,操作:
updata user set name="?" pwd="?" where id = "?"
PreparedStatement ps = conn.prepareStament();
ps.setString(1,user.getUsername());
ps.setString(2,user.getPwd());
ps.setInt(3,user.getId())
//执行
int cnt = ps.executeUpdate();//执行返回一个int值——受影响的行数
//关闭
ps.close();
coon.close();
*/
%>
删除操作
删除后需要在来接收数据,实时刷新当前的数据信息(finall())
第十一周Web课
EL表达式
1、简介:表达式语言
int a,b;
a + b //类似这样的
//操作这种表达式去完成一些功能
jsp 2.0
功能:以一种标签的形式取简化内容的输出,取值的方式
2、语法结构:
${变量或表达式} \ . 与[ ] 运算符
${变量或表达式}
${a}
${1+2}
变量+运算
变量:基本 + 引用
引用:=>集合 : Array, List
Student[] arr, arr[0],List
. [ ]
Student
在EL中 对对象的取值直接 stu.name 而不需要使用stu.getName()方法。
简化了取值的方式
3、EL隐含对象
内置对象里的东西,提供了一种简化的取值方式
内置对象 隐含对象
pageContext - pageContext
page - pageScope
request - requestScope
session - sessionScope
application - applicationScope
request.getCookies - cookie
request.getParameter() - param
request.getParameterValues - paramValues
request.setAttribute("K1",v1);
session.setAttribute("K2",v2);
application.setAttribute("K3",v3);
...+Scope 去遍历了空间,set方式进去的值,转化成一个Map(K1/K2/K3, V1/V2/V3)
取值:
${requestScope.k1}
${}的使用限制
需要有.setAttribute()后才能使用
如果你这个K1在request、session、application中唯一
可以直接使用${K1}直接使用
不需要使用前缀 ${requestScope.K1 or sessionScope.K1 or applicationScope.K1}
用例
<!--注意版本不一致问题-->
<%
int a = 3;
request.setAttribute("b",a);
session.setAttribute("",);
//定义数组
User[] arrUser = new User[10];
for(int i = 0; i < arrUser.length;i ++){
User u = new User();
u.setUserName = ("LT" + i);
u.setPwd = (i*2+6+"");
arrUser[i] = u;
}
%>
request.setAttribute("userArray",arrUser);
输出:、${requestScope.userArray[1]};
输出:、${requestScope.userArray[1].userName};
输出:、${requestScope.userArray[1]["userName"]};
<!--不唯一时将优先搜索request中的值-->
a ; ${b}<!--唯一时直接key值也能找到对应的Value值-->
a ; ${requestScope.b}
运算符:
算、关、逻
+ - * /(div) %(mod)
== eq , != ne , > gt , < lt , >= ge, <= le
&& and , || or , ! not
empty 判空 empty loginUser
表示用来判断后面这个是不是为空的。 是:True
not empty loginUser
<!--逻辑运算符:比较值,而不比较内容-->
${"LT" == "LT"} <!--True-->
${"LT" == "12"} <!--False-->
<%
String str1 = "LT";
String str2 = "LT" + "12";
String str3 = str1 + str2;
request.setAttribute('L',str3);
%>
${"LT" == str3}<!--估计是不大行的-->
JSTL标签库
1、简介
jsp taglib标签库
导包
2、核心标签
core - 核心
sql
xml
fm
i18n
指令
<%@ taglib prefix = "标签的前缀 c" uri = " .../jsp/jstl/core"%>
<!--jstl + el-->
<c:set 调属性 var = "age" value = "13">设置值</c:set>
age : ${age} <br/>
<!--输出,下面代码直接输出值-->
<c:out value = "3"></c:out>
<c:out value = "${3 }"></c:out>
<!--if()-->
<c:if test = "${age > 10}">
YES
</c:if>
<c:if test = "${not (age > 10)}">
NO
</c:if>
<!--switch语句,chose自带break开关结构-->
<c:choose>
<c:when test= "${ age > 8 && age < 26}">高年级</c:when>
<c:when test= "${age < 7 && age > 5}">幼儿园 </c:when>
<c:when test= "${age < 5 && age > 1}">家里蹲大学 </c:when>
<c:otherwise>家里蹲大学 </c:otherwise>
</c:choose>
<!--循环结构for each
items:collection集合类型
for(User u : userArr)
-->
<c:forEach items = "${userArray}" step ="步长 1(隔多少取值)" var = "得带变量 user" varStatus="状态变量 vs">
${user.userName}<br/>
${user.pwd}<br/>
状态$<vs.index><br/><!--索引位置-->
遍历数$<vs.count><br/>
当前的个体信息(完整的)$<vs.current><br/>
是不是第一个$<vs.first><br/>
是不是最后一个$<vs.last><br/>
</c:forEach>
<!--循环字符串-->
<c:forTokens items = "sadassadasdasd#dsadsadsd#dsadasdsfas#fdaf" delims="#分隔符" var="s输出类型">
${s }<br/>
</c:forTokens>
第十二周Web课
Servlet基本概念
servlet是独立于平台(服务器)、协议。运行于support servlet容器上
Serv - let
service (服务) - let (小)
从哪里来: 服务器自动创建——tomcat创建
存在与哪里:运行在一个支持servlet的容器上(tomcat)
eclispe仅是编辑器,Run on server ——> tomcat上运行
怎么用(随调用)的: 容器(tomcat)
在哪里用:用于handler 替代
week:jsp - java - class
java : servlet类
service - _jspService
init/destroy/service
创建Servlet
javax.servlet.Servlet(接口)子类
实现Servlet接口的方式去实现一个自己的servlet
Servlet有多种子类,可以去继承
方法一:
需要从外界导入servlet包(Servlet.class)
//继承接口
import javax.servlet.
public class GoodServlet implements Servlet{//实现一个servlet接口,重写抽象方法
init();
getServletInfo();
destroy();
}
<!--配置web.xml文件-->
1.1:创建对象
<servlet>
创建一个srevlet 对象名
<servlet-name>GoodServlet</servlet-name>
对象名对应类
<servlet-class>com.lt.servlet.GoodServlet</servlet-class>
</servlet>
1.2:提供对象的方法url(web提供url)
<servlet-mapping>
<servlet-name>GoodServlet</servlet-name>
根目录(webcontent)下的servlet,一般跟jsp同级
<url-patterb>/GoodServlet</url-patterb>
</servlet-mapping>
1.3访问 url配置的servlet
根据url路径访问自己创建的servlet
方法二:
继承servlet接口的子类HttpServlet
public class GoodServlet2 extends HttpServlet{
//无抽象属性、方法
//重写
init();
service();
doget();//调用频率高的,写在其里面
dopost();//频率低的调用频率高的
destroy();
}
下一步继续更改web.xml中的文件 GoodServlet为GoodSer2
使用
servlet-demo.jsp
<!--将提交的信息传到 GoodServlet2 Servlet中去进行处理-->
<form action = "GoodServlet2" method = "get">
用户名:
密码:
<submit></submit>
</form>
自动写一个Servlet
可以自动配置web.xml中的相关信息
Ceate Servlet->作用:取代handler.jsp 。
主要用来处理数据的:包括对数据库的一些操作
路径:${pageContext.request.contextPath}/g/s/t/go.do
/g/s/t/go.do 去看看老师课堂代码web.xml文件里怎么写的 -- > 对,是web.xml中设置的路径
Servlet生命周期
三个方法
init();
service(doGet doPost());
destroy();
web.xml 文件 ->servlet 取创建对象 -> init 初始化 -> service -> destroy
init 只运行一次(对服务器而言)在Servlet上创建一个实例
service 调用一次运行一次
destroy 服务器关闭、重启时调用
第十三周Web课
两层开发模式
jsp+javabean
jsp:
交互(输入+点一下)= 表单+超链接
+显示(显示DB中的东西)show = table+循环+超链接
+流程的控制(if数据库查询DAO-else判断):数据获取+业务处理+if+跳转 = handler.jsp = <%%>没有html代码(凌乱)
javabean:
vo:good商品//存数据
业务-领域bean Bo:DAO+DAOimpl
三层开发模式 MVC
Model/domain:javabean
viewer:jsp
controller:servlet
jsp+servlet+javabean
jsp:
交互+显示
servlet:
流程控制,java代码(因此它是个java类)
javebean:
vo:good商品//存数据
业务-领域bean Bo:DAO+DAOimpl
Servlet中:
1.处理中文乱码
`request.setCharacterEncoding("utf-8")`
`response.setCharacterEncoding("utf-8")`
2.数据获取
3.数据封装
4.业务处理
5.判断+数据存储+跳转
跳成功——>存储登录信息
request.getSession().setAttribute("loginUser",u2);
request.setAttribute("loginFlag","lf");//存储登录状态
request.getRequestDispatcher("success.jsp"路径要根据xml中一致).format(request,response);
若是登录失败跳转到注册页面
request.setAttribute("tempu",u);
request.getRequestDispatcher("register.jsp").format(request,response);
第十四周Web课
5选择题5填空题 = 20分
简答题 5题 = 50分
过滤器
<!-- filter:数据-》 处理数据 --%>
<!-- 表单数据(中文) -》 filter(乱码处理)-》 没有乱码的数据-->
<!--filter vs.servlet-->
<!--servlet filter-->
生命周期:
servlet: init destroy service(doGet/doPost)
filter: init(服务器加载的) destroy doFilter
创建: filter -> javax.servlet.filter
也需要在web.xml中配置(也可自动配置)
servlet:servlet-name,servlet-class,servlet-mapping(servlet-name,url-pattern)
filter: filter,filter-mapping
1:n 一个处理乱码过滤器,可以多个页面servlet
m:1页面(乱码filter+检测是否登录filter)
web.xml文件
<filter>
<filter-name>LoginCheck</filter-name>
<filter-class>LoginCheck</filter-class>类的位置
<init-param>
<param-name>CEC</param-name>
<param-value>"utf-8"</param-value>方便后面统一更改 所有网页的编码格式,后期处理文件主要通过这里来获取编码格式
</init-param>
<filter-mapping>
<filter-name>LoginCheck</filter-name>
指定filter要处理的哪个servlet
<!--<servelt-name>GoodServlet</servelt-name>//当前filter对应的Servlet-->
<url-pattern>/* (根目录下所有servlet)</url-pattern>可实现一个filter处理多个Servlet
</filter-mapping>
</filter>
创建Filter
自动添加
将自动创建相关信息
LoginCheck.class
public class LoginCheck implements Filter{
public void init(FilterConfig config) throws ServletException {
//设置编码-获取初始化参数
String cec = fConfig.getInitParameter("CEC");//web.xml中设置的值
// 获取初始化参数
String site = config.getInitParameter("Site");
// 输出初始化参数
System.out.println("网站名称: " + site);
}
//在进入servlet前执行改语句
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException {
System.out.println("do LoginFilter");
User user = (User)((HttpServletRequest) request).getSession().getAttribute("user");
if(null == user){
//未登录
((HttpServletResponse)response).sendRedirect("index.jsp");//返回到主页
}else{
//已登录
// 把请求传回过滤链
chain.doFilter(request,response);
}
}
//处理乱码的filter 中的 doFilter;;;;web.xml中也需要更改
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException {
//表单
request.setCharacterEncoding("utf-8");
//out显示((HttpServletRequest).request).getWriter()
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
chain.doFilter(request,response);
}
public void destroy( ){
/* 在 Filter 实例被 Web 容器从服务移除之前调用 */
}
}
第十五周Web课
Listener监听器
目的:事件发生前、中、后做一些事情
动作:创建、销毁-生命周期
SessionContextListener
SetAttribute
SessionAttributeListener
//可以自动创建
public class SessionInvalidateListener implements HttpSessionListener{
public SessionInvalidateListener(){
}
public void sessionCreated(HttpSessionEvent e){//创建
System.out.println("session创建");
}
public void SessionDestroy(HttpSessionEvent e){
System.out.println("session销毁");
}
}
监听器常用的用途
统计在线人数,利用HttpSessionLisener
加载初始化信息:利用ServletContextListener
统计网站访问量
实现访问监控
监听器的创建以及执行过程
个对在线人数的监控,可以创建如下的监听器:
public class MyListener implements HttpSessionListener{
private int userNumber = 0;
public void sessionCreated(HttpSessionEvent arg0) {
userNumber++;
arg0.getSession().setAttribute("userNumber", userNumber);
}
public void sessionDestroyed(HttpSessionEvent arg0) {
userNumber--;
arg0.getSession().setAttribute("userNumber", userNumber);
}
}
标签:Java,JavaWeb,servlet,request,session,jsp,跳转,Servlet,页面
From: https://www.cnblogs.com/Hygge1024/p/18059996