首页 > 编程语言 >JavaWeb之Java Servlet学习笔记

JavaWeb之Java Servlet学习笔记

时间:2024-03-07 23:11:54浏览次数:39  
标签:Java JavaWeb servlet request session jsp 跳转 Servlet 页面

JavaWeb学习笔记,主要是讲Java Servle,很适合Java开发网站的入门学习。
(以课程进度为目录)


第四周Web课

.jsp中删除共性代码(html、body)————.java文件能相对的简洁
taglib 指令(标签库)


动作元素action——element:

包含include

动态包含:在运行时才引入文件,代码也会动态引入,时间和使用方式不同

<jsp:include page="show-time.jsp"/>

分为以下五步:

  1. 将被包含的 jsp文件1 直接放入服务器解析
  2. 生成文件1.java文件
  3. 将文件1的结果放入文件2中
  4. 再将文件2 放入服务器解析
  5. 生成一个文件2.java 文件

还可加入 flush="true":每次动态执行时,将检查文件是否改变——若改变则重新生产java class

静态包含:

<%@ include page="show-time.jsp">

使用上面的静态包含,能将文件1 (show-time.jsp)的内容复制到文件2(使用<%@ include page="show-time.jsp">代码的文件)img

区别:
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:includejsp:param动作元素一起使用时,可以将jsp:param中提供的参数值传递jsp:include要加载的文件中去,因此当jsp:includejsp: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 gList = new ArrayList<>();get/set()——toString()

<!--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/>
	密&nbsp;码:<%=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 stuList = > stuList[0]

​ . [ ]

​ 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

相关文章

  • Java基础 语法笔记
    大二学习Java语法时,上课写的部分笔记,可能并不完整,仅用以作纪念。数组、集合、字符串(第六课)目录数组、集合、字符串(第六课)数组集合类Collection接口:泛型:List:ArrayList:LinkedList类SetHashSet类TreeSet类MapLterator接口Vector类Collections类查找、替换操作复制StringtoString()......
  • Day 2 java
    类是变量的蓝图对象本身已知的事物称为实例变量,对象可以执行的动作称为方法;两种变量:primitive主数据和引用1.事实上没有对象变量这样的东西,只有引用(reference)到对象的变量;2.对象引用变量保存的是存取对象的方法;3.这种变量是一种类似指针的东西(引用变量是一个遥控器);4.数组......
  • java jndi
    JNDI(JavaNamingandDirectoryInterface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDIAPI映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和......
  • Java 日期和时间 API:实用技巧与示例 - 轻松处理日期和时间
    Java用户输入(Scanner)简介Scanner类用于获取用户输入,它位于java.util包中。使用Scanner类要使用Scanner类,请执行以下步骤:导入java.util.Scanner包。创建一个Scanner对象,并将其初始化为System.in。使用Scanner对象的方法读取用户输入。示例importjava.ut......
  • java基础 韩顺平老师的 面向对象(基础) 自己记的部分笔记
    194,对象内存布局基本数据类型放在堆里面,字符串类型放在方法区。栈:一般存放基本数据类型(局部变量)堆:存放对象(Catcat,数组等)方法区:常量池(常量,比如字符串),类加载信息 196,属性注意细节1,属性可以是基本数据类型,也可以是引用类型(对象,数组)2,属性的定义语法同变量,示例:访问修饰符属......
  • Java基础 --- 方法
    方法什么是方法方法(method)是程序中最小的执行单元。实际应用当中,将重复的方法打包提高代码的复用性提高代码可维持性总结:什么是方法?方法是程序中最小的执行单元。实际开发中,什么时候用到方法?重复的代码、具有独立功能的代码可以抽取到方法中。实际开发......
  • Java面向对象之封装性
    封装性我要用洗衣机,只需按开关即可,无需了解洗衣机的内部结构。以上这句话可能大家在搜索学习封装性的时候可能都听过,可是这句话严重误导了我。可能是由于面向过程的学习太过深刻,我联想到了函数,函数不就是把洗衣服的过程全部“封装”起来了吗?我只需要调用函数方法就可以了呀,确......
  • Java编程--观察者(Observer)设计模式
    观察者设计模式观察者设计模式是一种行为设计模式,允许对象在其状态改变时通知其他依赖对象。它创建了一种发布者(Subject)和订阅者(Observer)之间的依赖关系。这种模式经常用于实现事件处理系统。观察者模式的关键组成部分:Subject(主题):拥有添加和删除观察者的方法,以及通知所有观察......
  • Tomcat警告异常:org.apache.jasper.servlet.TldScanner.scanJars
    警告信息org.apache.jasper.servlet.TldScanner.scanJars至少有一个JAR被扫描用于TLD但尚未包含TLD。为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。解决方案1.打开配置文件找到Tomc......
  • MyBatis Java 和 数据库 数据类型对应表
    类型处理器(typeHandlers)MyBatis在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时,都会用类型处理器将获取到的值以合适的方式转换成Java类型。下表描述了一些默认的类型处理器。提示 从3.4.5开始,MyBatis默认支持JSR-310(日期和时间API)。类型处......