javaWeb的创建实践,

阅读: 评论:0

javaWeb的创建实践,

javaWeb的创建实践,

ⅩⅢ.javaWeb

应用程序架构分为两种
C/S架构
C/S(Client/Server):客户端/服务器
B/S架构
B/S(Browser/Server):浏览器/服务器

相对于C/S应用程序而言, B/S应用程序更容易访问且部署维护时更加方便

1.Tomcat

URL的组成

localhost:8080/myProject/index.jsp

http:协议(Hypertext Transfer Protocol):超文本传输协议
Ip:服务器的地址
Port:端口号,让那个程序相应
myProject/index.jsp:路径/文件名

端口如果设置为80,可以不写端口

状态码 意义

200 成功处理请求

404 找不到服务器资源

500 服务器处理出错

②Tomcat的目录结构
目录文件作用
binstartup.bat, shutdown.bat
conf存放Tomcat的配置文件
libTomcat所需要的lib文件
webappsWeb应用的发布目录
workJSP运行时生成的servlet文件
tempTomcat运行时存放临时文件
logs存放Tomcat的日志文件
③可以通过l修改端口号
<!--<Connector port="8080" protocol="HTTP/1.1 " connectionTimeout="20000" redirectPort="8443 " 	
/>-->
//将8080端口修改为6060端口
<Connector port= "6060" protocol="HTTP/1.1 " connectionTimeout="20000" redirectPort="8443 " 	
/>
④在Tomcat中配置虚拟目录

打开conf目录中的l文件,在其中的标签中使用一个标签进行配置。

<Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true"xmlValidation="false" xmlNamespaceAware="false"><Context path="/myweb"	docBase="E:JavaWebFirstWebProWebRoot"/><!--"/myweb"为虚拟路径"E:JavaWebFirstWebProWebRoot"为物理路径--></Host>

2.IDEA建原生javaweb项目

Java Web 程序的目录结构

目录文件作用
应用程序文档根目录 /在MyEclipse中为WebRoot
WEB-INF目录该目录存于文档根目录下,并且不能被访问
文件存放应用使用的各种资源,该目录及其子目录对客户端都是不可以访问,其中包括l(部署表述符)
classes目录存放字节码文件
lib文件夹它包含Web应用程序所需要的JAR包文件
tld文件标签库描述文件

开发Web项目步骤如下

配置开发环境
创建Web项目
编写项目代码
部署Web项目到服务器中
打开浏览器,运行Web项目

①新建java程序勾选Web application

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qXcgJPEo-1635413245670)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20210913152916252.png)]

②打开file菜单,选择project Structure

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ABpoRU4X-1635413245673)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20210913153100481.png)]

③选择Modules —》 sources ,在WEB-INF文件夹下新建classes、lib文件,并将classes文件设置为Excluded文件格式,class储存src目录下编译的源代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q2y82QS8-1635413245675)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20210913152706550.png)]

④选择Modules—》Paths,选择使用自己刚刚新建的文件路径classes

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ukZusSWR-1635413245677)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20210913153516784.png)]

④选择Modules—》dependencies,添加jar包,设置jar包路径为刚才新建的lib文件夹。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MmlhI9Kp-1635413245680)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20210913153754142.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GaSSpXDM-1635413245683)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20210913153828709.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pokYWKnj-1635413245686)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20210913153847234.png)]

⑤选择Artifacts—》修改输出路径为tomcat的webapps文件下,即部署的位置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6mCKcOCk-1635413245688)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20210913154108659.png)]

⑥选择设置Edit Configurations,选择Tomcat server 下的本地local,(Remote是远程)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5uhiuXfC-1635413245690)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20210913154249375.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nSAwVkKd-1635413245693)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20210913154442783.png)]

⑦配置tomcat

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0gojaP2P-1635413245695)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20210913155302567.png)]

⑧选择部署,按步骤依次点击,之后会添加第⑤步设置的部署位置,之后将Application context 名字修改为程序名,不修改的话地址栏访问时输入的就是localhost:8080/javaWeb_war_exploded;修改后地址栏访问输入的就是localhost:8080/程序名

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uk9x5I24-1635413245697)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20210913155623246.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XMtc2c9h-1635413245699)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20210913155826022.png)]

⑨配置完成

运行tomcat,此时修改index.jsp中的内容为欢迎使用jsp;ctrl+s保存后直接刷新页面,就会看到刚刚设置的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5jGxhUnU-1635413245700)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20210913160734906.png)]

这两个属性已经生效

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Zq61sEW-1635413245702)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20210913160717383.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Qyr8hV8-1635413245704)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20210913160705157.png)]

3.配置Web应用

使用l文件配置应用发布
l文件必须保存在/WEB-INF目录下
在 l文件中配置各种资源的发布信息

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="" xmlns:xsi="" xsi:schemaLocation=" .xsd"><welcome-file-list><welcome-file>index.jsp</welcome-file> <welcome-file>home.jsp</welcome-file> <!--假定在web应用(news)下存在一个index.jsp页面,输入localhost:8080/news地址时,web容器会默认调用index.jsp页面。可以设置多个页面,当第一个找不到时就会依次向下寻找--></welcome-file-list>
</web-app>

4.JSP

JSP (Java Server Pages)是指:

在HTML中嵌入Java脚本代码
由应用服务器中的JSP引擎来编译和执行嵌入的Java脚本代码
然后将生成的整个页面信息返回给客户端

②JSP 执行过程

Web容器处理JSP文件请求需要经过3个阶段:
翻译阶段 JSP => Servlet
编译阶段 Servlet.java
=> .class
执行阶段

③JSP 页面组成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bt23RAlb-1635413245705)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20210914162935177.png)]

④JSP中的注释

合理、详细的注释有利于代码后期的维护和阅读
*在JSP文件的编写过程中,共有三种注释方法:
HTML的注释: //缺点:不安全,加大网络传输负担
JSP注释:<%-- JSP注释–%> //不可见注释
在JSP脚本中注释:
<% //单行注释 %>
<% /*多行注释 */ %>

⑤JSP指令元素

JSP指令元素主要用来提供整个JSP网页相关的信息,并且用来设定JSP页面的相关属性。
JSP指令的格式
<%@ 指令名 属性= “属性值” %>
JSP有3种指令元素
page指令
include指令
taglib指令

page指令
通过设置内部的多个属性来定义整个页面的属性
语法:<%@ page 属性1=“属性值” 属性2=“属性值1,属性值2”… 属性n=“属性值n”%>

属性描述默认值
language指定JSP页面使用的脚本语言java
import通过该属性来引用脚本语言中使用到的类文件
contentType用来指定JSP页面所采用的编码方式text/html, GBK,UTF-8
errorPage设置该JSP页面的错误处理页面的URL,处理当前页面中引发但未捕获到的异常
isErroePage**设置该页面是否为错误处理页面
⑥tomcat包导入

如果发现out.print()、request等内置对象没有提示方法爆红,都可以找到tomcat 的lib包下的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WdkjLqil-1635413245707)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20210914172621944.png)]

这三个包进行导入,放入项目的lib文件下就可以解决。如果有些不显示其实没有影响,tomcat包中有这些,但是开发阶段的lib包中没有,所以把包从tomcat中导出来,有些方法自己拼写太麻烦还是导入lib的好。

⑦声明

声明就是在JSP页面中定义Java的变量和方法
语法:<%! Java代码%>

<%@ page language="java" import="java.util.*,*" contentType="text/html; charset=GBK" pageEncoding="GBK"%>
<html>
<%!
String formatDate(Date d){SimpleDateFormat formater = new SimpleDateFormat("yyyy年MM月dd日");retrun formater.format(d);
}
%>
你好,今天是
<%=formatDate(new Date()) %>
</body>
</html>
⑧JSP中的标准动作

什么是JSP动作?
JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码。
常用标准动作
jsp:useBean:定义jsp页面使用一个JavaBean实例;
jsp:setProperty:设置一个JavaBean中的属性值;
jsp:getProperty:从JavaBean中获取一个属性值;
jsp:include:在JSP页面包含一个外在文件;
jsp:forward:把到达的请求转发另一个页面进行处理;
注意:动作中得属性区分大小写,属性中得值,必须置于双引号内.

⑨get和post

get方式会在地址栏显示,post不会。get地址栏传值,post属于Http传值

get方式附加的参数的大小不能大于2K,而post理论上没有长度

get方式有几率出现乱码,post不会

get方式相比post提交效率高一点

表单的默认提交方式为get

Login.jsp;
<form action=“login.jsp” Method=“post”>
账号:<input type=“text” name=“userName”/>
密码:<input type=“password” name=“pwd”/>
</form>
<%
String username&#Parament(“userName”);
String password&#Parament(“pwd”);
If(username.equals(“admin”)&&password.equals(“admin”)){
Response.sendRedirect(“login_success.jsp”);
}else{
Response.sendRedirect(“login_success.jsp”)
}
%>
注:乱码解决
1.多次转发可能会出现乱码:

接收数据/过滤器中的第一行插入这两个转码格式

request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
2.查看数据源是不是乱码

​ 查看数据库中的数据是否为乱码

​ 查看请求头中的数据是否为乱码,如果是进行第3

3.在<head>标签中添加
<meta charset="UTF-8">
4.相应后传递前端的数据乱码
       response.setContenttype("text/html;chatset=UTF-8")
5.乱码实在解决不了

可以在tomcat中的l文件修改端口中添加该代码

<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"URIEncoding=“UTF-8”           redirectPort="8443" />
<!--在端口下添加 URIEncoding=“UTF-8-->

容器居中

注:跳转

跳转时出现子页面出现问题需要父页面整个页面跳转时

如:子页面点击要执行servlet时,要验证登录操作,失败后需要父页面跳转登陆页面

//servlet中可以这样写
out.write("<script>parent.location.href='index.html'</script>");
<!--js中可以这样写-->
<script>parent.location.href='index.html'</script>

原理就是执行父页面parent 的跳转location.href

⑩转发与重定向

转发&#RequestDispatcher(“XXX.jsp”).forward(request,response);

重定向:response.sendRedirect(“XXX.jsp”);

1.两者都可以实现也页面的跳转

2.转发是内部控制权的转移,重定向是重新发送了一次url请求。

3.转发是服务器行为,重定向是客户端行为。

4.如果使用request.setAttribute的话,转发会将数据传递,重定向不会,因为request的作用域只在一次请求中有效

5.如果需要传数据,那么就使用转发,否则就使用重定向。

⑩①request
方 法 名 称方    法  描    述
String getParameter(String name)根据页面表单元素名称获取请求页面提交的数据
String[] getParameterValues(String name)获取页面请求中有重名表单的元素用户的请求数据
getRequestDispatcher(String path)返回一个RequestDispatcher对象该对象的forward方法可以把请求转发到指定资源.
Object getAttribute(String name)返回由name指定的属性值
void setAttribute(String name,Object obj)设置名字为name的request参数值
⑩②作用域
名称说 明
page范围在一个页面范围内有效,通过pageContext对象访问该范围内的对象
request范围在一个服务器请求范围内有效,与客户端请求绑定一起
session范围在一次会话范围内容有效,在会话期间与session绑定的对象皆属于该范围
application范围在一个应用服务器范围内有效,当应用服务启动后即创建该对象,并向所有用户所共享
作用域说 明
pageContext在一个页面中有效只能在创建对象的页面内访问,在服务器跳转后失效
pageContext.setAttribute(“name”,value);Attribute(“name”);
request在一次请求中有效页面跳转后,设置的内容依然被保,request.setAttribute(“name”,value);Attribute(“name”);
session在一次会话中有效重定向后,也可以访问,关闭浏览器失效session.setAttribute(“name”,value);Attribute(“name”);
application在一次服务器中有效,服务器不重启不失效。关闭浏览器,重新打开,也可以访问到application.setAttribute(“name”,value);Attribute(“name”);
⑩③Cookie

什么是Cookie

Cookie是由服务器生成 发送给客户端浏览器的一小段信息, 浏览器将其保存成某个目录下的文本文件中.
Cookie的作用
对特定对象(客户)的追踪,如:访问系统次数,最后访问时间,停留时间等
统计网页浏览次数
记录用户登录信息
实现个性化服务,如针对不同的用户偏好展示不同的内容等
安全性能
容易信息泄露

1.Cookie的应用

导入包

<%@page import="javax.servlet.http.Cookie“%>

创建Cookie

Cookie newCookie=new Cookie(“parameter”, “value”);

parameter:用于代表cookie的名称(key)
value:用于表示当前key名称所对应的值

使用cookie 必须设置一个有效期

写入Cookie

response.addCookie(newCookie)

读取Cookie

类型方法名称说 明
voidsetMaxAge(int expiry)设置Cookie的有效期,以秒为单位
voidsetValue(String value)Cookie创建后,对Cookie进行赋值
StringgetName()获取Cookie的名称
StringgetValue()获取Cookie的值
intgetMaxAge()获取Cookie的有效时间,以秒为单位
2.JSP中应用Cookie
------从登录验证页面表单中获取用户名------
<%String username&#Parameter("username");
String password&#Parameter(“pwd”);
Cookie uname=new Cookie("uname", username); 
Cookie upwd=new Cookie(“pwd", password);
response.addCookie(uname);
Response.addCookie(upwd);//创建Cookie,使用response的addCookie方法保存Cookie
... ...
%>
-----在显示页面显示用户名---------------
<%//获取请求中的Cookie,以数组方式保存Cookie cookies[ ]&#Cookies();//使用reqeust获取Cookie数组,通过cookie的名称获取对应的内容//循环遍历数组,得到key=uname的Cookiefor(int i=0;i<cookies.length;i++){Cookie ucookie=cookies[i];Name().equals("uname”));//判断Cookie的名称%>欢迎你:<%&#Value() %>//获取key对应的value,输出显示<%  }  %>

javascript:kie),在网页控制台使用该代码可以看到该网页现在的Cookie值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UZUGbd2J-1635413245710)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20211018173042481.png)]

⑩④Session

session对象用来存储有关用户会话的所有信息,这些信息保存在服务器端

1.session对象常用方法:
类型方法名称说 明
voidsetAttribute(String key,Object value)key/value的形式保存对象值
ObjectgetAttribute(String key)通过key获取对象值
StringgetId()获取session对象的编号
voidinvalidate()设置session对象失效
2.在控制页面获取用户请求的登录信息进行验证
------登录处理页面的代码片断------
<%
if (rs.next()) {  //如果是已注册用户
session.setAttribute("LOGINED_USER", loginedUser);
response.sendRedirect("index.jsp");
} else {
response.sendRedirect("login.html");
}
%>------ 在新闻发布系统新闻发布页面增加登录验证------
<%
User user = (User) Attribute("LOGINED_USER");
//如果session中不存在该用户的登录信息,转入登录页面
if (user == null) {
response.sendRedirect("login.jsp");
}
%>
  1. 在新闻发布系统新闻发布页面增加注销
<!--success.jsp-->
欢迎<%&#UserName()   %>使用本系统。
<a href="logout.jsp" >注销</a><!--logout.jsp-->
<%//3秒后跳转到登录页面response.setHeader("refresh","3;URL=index.jsp");//让当前session失效session.invalidate();
%>
注销成功,3秒后自动转到登录页面,如没有跳转,请点击
<a href="index.jsp">这里</a>
⑩⑤Cookie与session的比较
sessionCookie
是在服务器端保存用户信息是在客户端保存用户信息
保存的是对象保存的是字符串
随会话结束而关闭可以长期保存在客户端
重要的信息使用session保存通常用于保存不重要的用户信息
⑩⑥SmartUpload组件实现上传功能
1。环境准备

使用SmartUpload组件需要在项目中引入jspsmartupload.jar文件

将jspsmartupload.jar 添加到WEB-INFlib目录下

需要设置表单的enctype属性

<form enctype="multipart/form-data" method="post"><!--设置了enctype属性后,表单必须以post方式提交-->
2.SmartUpload类及方法
属性名称说 明
public final void initialize(PageContext pageContext)执行上传和下载的初始化工作,必须实现
public void upload()实现文件数据的上传,在initialize方法后执行
public int save(String pathName)将全部上传文件保存到指定的目录下,并返回保存的文件个数
public void setAllowFilesList(String ExtList)指定允许上传的文件扩展名,接收一个扩展名列表,以逗号分隔
public void setDeniedFilesList ( String fileList)指定了禁止上传的文件扩展名列表,每个扩展名之间以逗号分隔
public void setMaxFileSize(long filesize)设定每个文件允许上传的最大长度
public void setTotalMaxFileSIze(long totalfilesize)设定允许上传文件的总长度
3.Files类

封装了所有上传文件的信息集合
常用方法

属性名称说 明
public int getCount()取得文件上传的数目
public File getFile(int index)取得指定位置的File文件对象
public long getSize()取得上传文件的总长度
public Files getFiles()将所有上传文件对象以Collection的形式返回
方法名称说 明
saveAs(String destFilePathName)将文件保存,参数destFilePathName是保存的文件名
isMissing( )判断用户是否选择了文件,即对应表单项是否为空,返回值为boolean类型
public String getFiledName( )获取表单中当前上传文件所对应的表单项的名称
public String getFileName( )获取上传文件的文件名称,不包含路径
4.编写上传文件处理页uploadManage.jsp
<%@ page import="com.jspsmart.upload.*"%><!--导入包--> 
<%smartUpload su = new SmartUpload();		//创建smartupload对象su.initialize(pageContext);				//上传初始化,初始化pageContext对象,pagecontext对象的作用域是本页面su.setCharset(“GBK”);					//设置格式,一般设置为UTF-8su.upload();							//上传文件
//获取单个上传文件[如果要得到文件信息,则用file,如果不需要,则直接保存com.jspsmart.upload.file file = su.getFiles().getFile(0);//创建文件读取对象
//文件在服务器端保存file.save(filepath);
//save保存文件		//filepath指定文件保存路径
5.混合表单

混合表单上传文件时获取不到除上传文件的其他值

所以需要通过smartupload取request对象来获取其他值

<%//实例化SmartUpload上传组件SmartUpload smart = new SmartUpload();		//创建smartupload对象//初始化上传操作smart.initialize(pageContext);				//上传初始化//设置字符集smart.setCharset("gbk");					//设置编码格式//准备上传smart.upload();								//上传文件Request smartReq  &#Request();		//创建request对象String username = Parameter("username");//通过创建的request获取值//将上传的文件保存到项目根路径下的uploadfile目录中smart.save("uploadfile");%><h3>姓名:<%=username %></h3>			<!--通过smartupload创建的request可以获取到值-->	<h3>使用request内置对象获取:	<%&#Parameter("username") %>			<!--该方法获取不到值-->	
</h3>
<!--servlet中创建pagecontext-->final javax.servlet.jsp.PageContext pageContext;private static final javax.servlet.jsp.JspFactory _jspxFactory =javax.servlet.DefaultFactory();pageContext = _PageContext(this, request, response,null, true, 8192, true);javax.servlet.jsp.PageContext pageContext = javax.servlet.DefaultFactory().getPageContext(this, request, response,null, true, 8192, true);
6.综合上传
	SmartUpload smart=new SmartUpload();Request req&#Request();  		//获取Request对象smart.initialize(pageContext);smart.setCharset("UTF-8");smart.upload();smart.save("upfiles");String title&#Parameter("title");String writer=(Attribute("uname");String content&#Parameter("content");SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");String writerDate=sdf.format(new Date());String pic&#Files().getFile(0).getFileName();		//  获取文件名
7.获取表单数据

SmartUpload 获取表单数据
getRequest(): 得到com.jspsmart.upload.Request对象
常用方法

getParameter(String name)获取指定参数之值,等同JSP内置对象Request的getParameter方法
getParameterValues(String name)获取一个页面表单组件对应多个值时的用户的请求数据,等同JSP内置对象Request的getParameterValues方法
<form method="post" enctype="multipart/form-data" action="control.jsp">
上传文件:<input type="file" name="nfile"><br/>
文件描述:<input type="text" name="explanation"><br/>
<input type="submit" value="上传"> 
</form>
<!--java代码-->
<%
com.jspsmart.upload.Request surequest = su.getRequest();
String explanation = Parameter("explanation");
out.println(explanation) ;
%>
8.多文件上传
<%//实例化SmartUpload上传组件SmartUpload smart = new SmartUpload();//初始化上传操作smart.initialize(pageContext);//设置字符集smart.setCharset("gbk");//准备上传smart.upload();//取得所有上传文件Files files = Files();		//获取上传文件//循环保存各个文件for(int i=0;i&Count();i++){smart.save("uploadfile");			//循环保存文件}
%>
9.控制上传文件的类型

使用SmartUpload组件可以对上传文件的类型进行限制
setAllowedFilesList(): 允许上传的文件类型
setDeniedFilesList(): 禁止上传的文件类型

SmartUpload su = new SmartUpload();
//初始化SmartUpload对象
su.initialize(pageContext);try {//定义允许上传文件类型   su.setAllowedFilesList("gif,jpg,doc");//不允许上传文件类型   su.setDeniedFilesList("jsp,asp,php,aspx,html,htm,exe,bat");//执行上传su.upload();
}catch(Exception e)
10.控制上传文件的大小

使用SmartUpload组件可以对上传文件的大小进行限制
setMaxFileSize(): 允许上传的单个文件大小
setTotalMaxFileSize():允许上传的文件总容量

	//定义允许上传文件类型   su.setAllowedFilesList("gif,jpg,doc");//不允许上传文件类型   su.setDeniedFilesList("jsp,asp,php,aspx,html,htm,exe,bat") ;//单个文件最大限制   su.setMaxFileSize(20000);//所有上传文件的总容量限制   su.setTotalMaxFileSize(500000);				//文件上传大小单位byte
⑩⑦富文本编辑器

可以实现复杂的多文本输入

1.使用:

导入js文件:wangEditor.min.js

2.实现
<div id="div1"><p>欢迎使用 <b>wangEditor</b> 富文本编辑器</p>
</div><!-- 引入 wangEditor.min.js -->
<script type="text/javascript">const E = window.wangEditorconst editor = new E('#div1')// 或者 const editor = new E( ElementById('div1') )ate()
</script>

通过监控富文本的变化将文本同步更新到textarea

<div id="div1"><p>欢迎使用 <b>wangEditor</b> 富文本编辑器</p>
</div>
<textarea id="text1" style="width:100%; height:200px;"></textarea><script src=".2.1/jquery.min.js"></script>
<!-- 引入 wangEditor.min.js -->
<script type="text/javascript">const E = window.wangEditorconst editor = new E('#div1')const $text1 = $('#text1')hange = function (html) {// 第二步,监控变化,同步更新到 textarea$text1.val(html)}ate()// 第一步,初始化 textarea 的值$text1.html())
</script>

5.servlet

HttpServlet继承于GenericServlet
处理HTTP协议的请求和响应
HttpServlet的方法

方法名称功能描述
void doGet(HttpServletRequest request,HttpServletRresponse response)Get请求服务时调用
void doPost(HttpServletRequest request,HttpServletRresponse response)Post请求服务时调用
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloServletTest    extends HttpServlet {public void doGet(HttpServletRequest request,     HttpServletResponse    response)    throws ServletException, IOException {	  			 	 response.setContentType("text/html;charset=GBK");PrintWriter out = Writer();out.println("<html>");out.println("  <head><title>Servlet</title></head>");out.println("  <body>");out.println("你好,欢迎来到Servlet世界");out.println("  </body>");out.println("</html>");out.close();}
}

HttpServletRequest类常用方法

方法名称功能描述
String getParameter(String param)获取客户端请求数据
void setCharacterEncoding(String encoding)设置输入字符集

HttpServletResponse类常用方法

方法名称功能描述
void setContentType(String contType)设置输出字符集
void sendRedirect(String url)让浏览器重定向到指定的资源
①编写配置文件
<web-app><servlet><servlet-name> HttpServletTest </servlet-name><!--为了方便使用Servlet,取个别名--><!--servlet-name两个名称必须相同--><servlet-class>cn.jbit.servlet. HttpServletTest </servlet-class><!-- 完整的包名+类名--></servlet><servlet-mapping><servlet-name> HttpServletTest </servlet-name><url-pattern>/HttpServletTest </url-pattern><!--访问Servlet的URL--></servlet-mapping></web-app>
②.注解
@webServlet(name = "".displayname="")

与xml相比较

name 等价与 servlet-name

displayname 等价与 url-pattern

大部分情况下格式为

@WebServlet("/name")
③servlet的生命周期

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tl7l50eL-1635413245718)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20210922180253558.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-obx4dLwD-1635413245720)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20210922180327900.png)]

init——》service——》doget/dopost——》服务器关闭时执行destory

④Servlet相关接口
ServeltConfig接口

在Servlet初始化过程中获取配置信息
一个Servlet只有一个ServletConfig对象
ServeltConfig接口的常用方法

方法名称功能描述
String getInitParameter(String name)获取中设置的以name命名的初始化参数值
ServletContext getServletContext()返回Servlet的上下文对象引用
ServeltContext接口

获取Servlet上下文
ServeltContext接口的常用方法

方法名称功能描述
ServletContext getContext(String path)返回服务器上与指定URL相对应的ServletContext对象
void setAttribute(String name,Object obj)设置Servlet中的共享属性
Object getAttribute(String name)获取Servlet中设置的共享属性
getServletConfig().getServletContext().getContext("/servlet").getServerInfo()
GenericServlet抽象类

提供了Servlet与ServletConfig接口的默认实现方法
GenericServlet的常用方法

方法名称功能描述
String getInitParameter(String name)返回服务器上与指定URL相对应的ServletContext对象,实际上是调用ServletConfig接口的同名方法
ServletContext getServletContext()返回Servlet的上下文对象引用,实际上是调用ServletConfig接口的同名方法
** **void init()初始化****Servlet
⑤全局和局部初始化参数的获取方式/Servlet上下文参数
1.局部初始化参数
<web-app><servlet><servlet-name>HelloServlet</servlet-name><servlet-class>org.jbit.servlet.HelloServlet</servlet-class><init-param><param-name>initParam</param-name><param-value>Hello Servlet</param-value></init-param><!--init-param即为局部初始化参数,参数名为initialparam,值为Hello Servlet--></servlet><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/HelloServlet</url-pattern></servlet-mapping>
</web-app>
 public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("处理请求时,doGet()方法被调用。");String initParam = getInitParameter("initParam");//局部初始化参数通过ServletConfig的getInitParameter方法//来获得xml中以“initParam”为name 的参数值System.out.println(initParam);}
2.全局初始化参数
<web-app><context-param><param-name>contextParam</param-name><param-value>Hello Servlet</param-value></context-param><!--省略其他配置-->
</web-app>
<!--局部参数是写在servlet标签下,而全局参数是写在web—app标签下的-->
public class HelloServlet extends HttpServlet {// …省略其他代码public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("处理请求时,doGet()方法被调用。");String initParam = getInitParameter("initParam");//此处获取HelloServlet名下的局部参数initParamString contextParam = 								ServletContext().getInitParameter("contextParam");//该方法获取的是全局初始化参数contextParamSystem.out.println("Servlet初始化参数" + initParam);System.out.println("系统初始化参数" + contextParam);}
}
3.获取Servlet上下文参数比较
//调用<init-param>中的参量:
//调用格式为:
String name = getInitParameter(“name”); 
//或
String name = getServletConfig().getInitParameter(“name”);//局部参数是通过Servletconfig的getInitParameter方法获取参数//调用<context-param>中的参量:
//调用格式为:
String name =getServletContext(). getInitParameter(“name”);
//或
String name = getServletConfig().getServletContext().getInitParameter(“name”);
//全局参数是通过Servletconfig的getServletContext方法获取ServletContext对象
//然后通过ServletContext对象的getInitParameter方法获取参数

6.EL表达式

①什么是EL

EL即Expression Language(表达式语言)
EL的功能
替代JSP页面中的复杂代码
EL的语法
${ EL exprission}

${  bean.name } 或 ${  bean['name'] }//${bean.name}实质是调用bean的getName()方法
//输出姓名显示
<%Map names = new HashMap();names.put("one","LiYang");names.put("two","WangHua");request.setAttribute("names",names);
%>
姓名:${}<br/>
姓名:${names["two"] }<br/>
②隐式对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FUFQlCLt-1635413245722)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20210924143033016.png)]

//对象取值写法:
${  bean.name } 或 ${  bean['name'] }//实际上改代码的完整形式是:${requestScope.bean.name}
${ username }
//直接使用变量名获取值$,这种方法其实也可以,但是最好还是带上前边的隐式对象,不加隐式对象的话,EL会在pageScope,requstScope,sessionScope,applicationScope这些隐式对象中循环查找该参数名
//加上隐式对象的作用就是,指明该参数是从哪个方向获取的,要去哪个隐式对象中取查找
//如果该参数是从session中传过来的,那么就调用
${ sessionScope.username }
//这样就可以获取session中该参数名的值
//一般后端向前端穿参数尽量使用requstScope
属性范围EL****中的名称
pagepageScope,例如${pageScope.username},表示在page范围内查找username变量,找不到返回Null
requestrequstScope
sessionsessionScope
applicationapplicationScope
${param.参数}
//param是用来接受页面传来的参数值${paramValues.参数}
//param是用来接受页面传来的集合对象值。如:list等//Param:
${param.name}
//等价于
Parameter("name");//paramValues :
${params.name}
//等价于
ParameterValues("name");
//如:${paramValues.habit[0]}  ${paramValues.habit[1]}  

注意:

/*
注意param
p a r a m . n a m e 等 价 于 r e q u e s t . ∗ ∗ g e t P a r a m t e r ∗ ∗ ( " n a m e " ) , 这 两 种 方 法 一 般 用 于 服 务 器 从 页 面 或 者 客 户 端 获 取 的 内 容 。 ∗ ∗ {param.name} 等价于 request.**getParamter**("name"),这两种方法一般用于服务器从页面或者客户端获取的内容。 * * param.name等价于request.∗∗getParamter∗∗("name"),这两种方法一般用于服务器从页面或者客户端获取的内容。∗∗{requestScope.name} 等价于 request
.getAttribute**(“name”),一般是从服务器传递结果到页面,在页面中取出服务器保存的值。
*/

对象名称说 明
pageScope返回页面范围的变量名,这些名称已映射至相应的值
requestScope返回请求范围的变量名,这些名称已映射至相应的值
sessionScope返回会话范围的变量名,这些名称已映射至相应的值
applicationScope返回应用范围内的变量,并将变量名映射至相应的值
param返回客户端的请求参数的字符串值
paramValues返回映射至客户端的请求参数的一组值
pageContext提供对用户请求和页面信息的访问
③pageContext
得到请求的url但是不包含参数 :
/${questURL}:
<c:out value=“${questURL}”/></br>
得到web应用的名称:
/${tPath}:
<c:out value="${tPath}"/></br>
得到请求方法:
/${hod}:
<c:out value=“${hod}”/></br>
得到用户:
/${User}:
<c:out value=“${User}”/></br>
得到用户的IP地址:
/${Addr }:
<c:out value=“${Addr}”/></br>
得到sessionID
/${pageContext.session.id}:
<c:out value="${pageContext.session.id}"/></br>
④EL运算符

empty 运算符:${empty 对象}

判断对象是否为空

算数操作符说 明
加法+
减法_
乘法*****
除法/ 和 div
取余% mod
逻辑操作符说 明
&& 和 and
|| 和 or
! 和 not
关系操作符说 明
等于== 和 eq
不等于!= 和 ne
小于< 和 lt
大于> 和 gt
小于等于<= 和 le
大于等于>= 和 ge
操作符描述
.访问一个Bean属性或者一个映射条目
[]访问一个数组或者链表的元素
( )组织一个子表达式以改变优先级
+
-减或负
*
/ or div
% or mod取模
== or eq测试是否相等
!= or ne测试是否不等
< or lt测试是否小于
> or gt测试是否大于
<= or le测试是否小于等于
>= or ge测试是否大于等于
&& or and测试逻辑与
|| or or测试逻辑或
! or not测试取反
empty测试是否空值

7.JSTL

①什么是JSTL

JSTL(JavaServerPages Standard Tag Library)JSP标准标签库
使用JSTL实现JSP页面中逻辑处理

JSTL通常会与EL表达式合作实现JSP页面的编码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y7h2kqF1-1635413245724)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20210924145547381.png)]

②使用JSTL的步骤
1.创建Web工程,添加jar包

项目中如果要使用JSTL和EL表达式,就必须导入jstl.jarstandard.jar文件

2.在JSP页面添加taglib指令
……
<%@ taglib uri="" prefix="c"%>
……
3.使用JSTL标签

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ERgH3x85-1635413245726)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20210924161427368.png)]

③.通用标签的使用

set:设置指定范围内的变量值

<c:set var= "example" value="${100+1}" scope="session"  />
<!--向session中,存入一个名为 example 的参数,值为101-->

out:计算表达式并将结果输出显示

<c:out value="${example}"/>
<!--在页面上输入 名字为example的参数-->

remove:删除指定范围内的变量

<c:remove var= "example" scope="session"/>
<!--在session中删除名为example 的参数-->

<c:out>标签有如下属性:

属性描述是否必要默认值
value要输出的内容
default输出的默认值主体中的内容
escapeXml是否忽略XML特殊字符true
<body>
<!-- 设置之前应该是空值 -->
设置变量之前的值是:msg=<c:out value="${msg}" default="null"/>
<!-- 给变量msg设值 -->
<c:set var="msg" value="Hello ACCP!" scope="page"></c:set>
<!-- 此时msg的值应该是上面设置的"已经不是空值了" -->
设置新值以后:msg=<c:out value="${msg}"></c:out><br>
<!-- 把 msg变量从page范围内移除-->
<c:remove var="msg" scope="page"/>
<!-- 此时msg的值应该显示null -->
移除变量msg以后:msg=<c:outvalue="${msg}“ default="null"/>
</body>	
④.条件标签的使用

if:if标签用于判断条件是否成,与Java中的If语句做用用相同
语法

<%@ taglib uri="" prefix="c"%><c:if   test="codition"    var="name"    scope="applicationArea" >
<!--test="codition"				判断条件表达式返回true/false var="name"					变量名用于保存返回的true/falsescope="applicationArea"		指定var变量的作用域 
--></c:if>	

<c:choose>:choose用于多重选择执行代码,与Java中的If—else结构;该标签没有任何属性,但必须结合<c:when>和<c:otherwise>标签.

<c:choose><c:when test="${测试条件}"><!--满足测试条件,则执行改段代码--></c:when>......<c:otherwise><!--不满足以上条件,则执行该段代码--></c:otherwise>
</c:choose>
⑤.条件标签的应用
<body>
<c:set var="isLogin" value="${not empty sessionScope.userId}"/>
<c:if test="${not islogin}">
<!--登录表单使用条件标签判断是否已登录
--></form>
</c:if>
<c:if test="${isLogin}">
已经登录!
</c:if>
</body>
⑥.迭代标签
属性名类型描述
items数值,集合等将要迭代的集合对象
varString是迭代到的元素的引用
varStatusString保存当前迭代状态
beginint指定开始的索引
endint指定迭代结束的索引
stepint表示循环的步长

迭代标签
实现对集合中对象的遍历
语法:

<c:forEach     items=${list}         var=name    begin=start   end=end  step=count>
<!--
items指定要遍历的集合对象
var指定集合内数据的变量名称,即迭代时集合内当前的变量名称
begin指定从集合的第几位开始		 start从头开始迭代
end指定迭代到集合的第几位结束		end迭代到最后	
Step指定迭代的增量					count迭代增量时下一个forEach是for循环语句的变体,实现 。集合对象(可以是list、数组等)的处理 
-->…循环体代码…
</forEach>
⑦.迭代标签的应用
index.jsp
<c:choose>		<!--choose标签多条件标签 相当于if...else..--><c:when test="${empty userList}"><!--空判断,如果userList为空,则返回true-->没有你想要的数据<br></c:when><c:otherwise><!--上边条件都不成立,则执行该标签下的代码,即userList不为空--><c:forEach items="${userList}" var="u" varStatus="s"><!--循环迭代userList,迭代过程中使用u来代userlist中的变量varStatus为s,即用s来获取当前迭代的状态--><c:choose><c:when test="${s.count % 2 == 0}"><!--求余判断,如果当前迭代的s的行数能整除2时,则返回true--><font color=red>编号:${u.id} 用户名 :${u.username } 年龄:${u.age }<br></font></c:when><c:otherwise><!--当前行数除2求余不为0-->编号:${u.id} 用户名 :${u.username } 年龄:${u.age }<br/></c:otherwise></c:choose></c:forEach></c:otherwise>
</c:choose>
⑧总结

EL(Expression Language)即表达式语言,是一种简单的数据访问语言。

使用EL访问JavaBean属性值的格式为:

J a v a B e a n . p r o p e r t y N a m e ∗ ∗ 或 ∗ ∗ {JavaBean.propertyName}**或** JavaBean.propertyName∗∗或∗∗ {JavaBean[“propertyName”]}

EL提供了内置对象

pageScoperequestScopesessionScopeapplicationScope来访问作用域范围内容的数据。
JSTL (JavaServer Pages Standard Tag Library)即JSP标准标签库,包含用于编写和开发 JSP页面的一组标准标签,它可以为用户提供一个无脚本环境。
JSTL常用标签有如下3类:
通用标签:<c:out>、<c:set>和<c:remove>
条件标签:<c:if>、<c:choose>、<c:when>和<c:otherwise>
迭代标签:<c:forEach>

8.过滤器filter和监听器listener

过滤器filter

①介绍

什么是Filter?
依据字面上的中文意思为过滤器。
Filter的作用
当用户的请求到达指定的URL之前,可以借助Filter来改变这些请求的内容;同样地,当响应结果到达客户端之前,可以使用Filter修改输出的内容。
什么是FilterChain(过滤器链)?
一个FilterChain包含多个Filter。

Filter生命周期

实例化——》初始化——》过滤——》销毁

FilterChain过滤链

一个过滤器链(FilterChain),在请求到达请求资源前会依次经过链中的所有过滤器,配置在前的Filter先执行,而请求处理完成后,会按照相反的顺序再次经过链中的所有过滤器。

方法
Filter接口方法作用
Init(FilterConfig)初始化
doFilter(ServletRequest,ServletRespone,
FilterChain)过滤
destory()销毁

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SIJfbK1y-1635413245728)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20210927141809261.png)]

②配置
1.实现Filter接口
import javax.servlet.*;
import java.io.IOException;public class Encodingfilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//注意ServletResponse,ServletRequest是//HttpServletRequest和HttpServletResponse的父接口//使用时需要强转}@Overridepublic void destroy() {}
}
2.配置注解或XML

XML配置

<filter><filter-name>Logger</filter-name><filter-class>com.util.LoggerFilter</filter-class>
</filter><filter-mapping><filter-name>Logger</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
<!--与Servlet配置相似-->

注解

@WebFilter(urlpatterns = "/*")//fileName是类名
@WebFilter(urlpatterns = "/*" filterName = "Encodingfilter")
④过滤器的应用场合

加载:对于到达系统的所有请求,过滤器收集诸如浏览器类型,一天中的时间等相关信息,并对它们进行日志记录
性能:过滤器在内容通过线路传来并在到达Servlet和JSP页面之前解压缩该内容,然后再取得响应内容,并在响应内容发送到客户机器之前将它转换为压缩格式
安全:过滤器处理身份验证令牌的管理,并适当地限制安全资源的访问,提示用户进行身份验证或将它们指引到第三方进行身份验证.
会话管理:将Servlet和JSP页面与会话处理代码混杂在一起可能带来相当大的麻烦.使用过滤器来管理会话可以让WEB页面集中精力考虑内容显示和委托处理,而不必担心会话管理的细节.

监听器Listener

①Listener的作用

Listener是Servlet规范的另一个高级特性,用于监听Java Web程序中的事件,例如创建销毁sessionrequestcontext等,并触发相应的事件,事件发生的时候会自动触发该事件对应的Listener。
Java Web程序也一样,使用Listener和Event完成相应事件的处理。

②监听器配置l

<!--application监听器配置-->
<listener>
<listener-class>com.javaweb.listener.ApplicationListener</listener-class>
</listener>
③application监听器的作用

application监听器的作用
监听的Web应用的生命周期。
用于处理应用程序启动初始化和关闭释放资源的问题
实现
实现ServletContextListener接口

**

注:此处是很好的实体类创建的地方,spring框架也是在这里进行了类的管理创建

**

public class ApplicationListener implements ServletContextListener {//监听服务器关闭时执行@Overridepublic void contextDestroyed(ServletContextEvent sct) {System.out.println("应用关闭-->"+new Date().toLocaleString());}//监听服务器开启时执行@Overridepublic void contextInitialized(ServletContextEvent sct) {System.out.println("应用启动-->"+new Date().toLocaleString());//得到应用路径String path = ServletContext().getContextPath();System.out.println("应用是:"+path);}
}
④session监听器
session状态监听:HttpSessionListener接口
方法描述
public void sessionCreated(HttpSessionEvent hse)session创建时调用
public void sessionDestroyed(HttpSessionEvent hse)session销毁时调用
public class MySessionListener implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent hse) {String dateTime = new Date().toLocaleString();HttpSession session = Session();System.out.println(dateTime+" 创建 sessiom,ID:"&#Id());}@Overridepublic void sessionDestroyed(HttpSessionEvent hse) {String dateTime = new Date().toLocaleString();HttpSession session = Session();System.out.println(dateTime+" 销毁session,ID:"&#Id());}
session属性监听:HttpSessionAttributeListener接口
方法描述
public void attributeAdded(HttpSessionBindingEvent hsb)增加属性时调用
public void attributeRemoved(HttpSessionBindingEvent hsb)删除属性时调用
public void attributeReplaced(HttpSessionBindingEvent hsb)替换属性时调用
public class MySessionAttrListener implements HttpSessionAttributeListener {@Overridepublic void attributeAdded(HttpSessionBindingEvent hsb) {//得到当前sessionSystem.out.print("session ID:"&#Session().getId());//获取属性名和属性值System.out.println(" 增加属性:"&#Name()+",属性值是:"&#Value());
}
public void attributeRemoved(HttpSessionBindingEvent hsb) {System.out.print("session ID:"&#Session().getId());System.out.println(" 删除属性:"&#Name()+",属性值是:"&#Value());}
public void attributeReplaced(HttpSessionBindingEvent hsb) {System.out.print("session ID:"&#Session().getId());System.out.println(" 替换属性:"&#Name()+",属性值是:"&#Value());}
}

监听器应用

①字符集处理
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {//设置请求字符集request.setCharacterEncoding("GBK");//请求向下传递chain.doFilter(request, response);
}
②Listener经典案例-在线用户统计

要完成在线用户统计功能的监听器,需要实现如下3个接口。
ServletContextListener接口
使用此接口的作用是:在应用初始化的时候向application中添加一个空的Set集合用来保存在线用户。
HttpSessionAttributeListener接口
使用此接口的作用是:当用户登陆成功后,会向session中添加一个属性用来保存用户信息,这样就表示新用户登陆,之后把用户保存在在线用户列表中。
HttpSessionListener接口
使用此接口的作用是:当用户注销后将用户信息从用户列表中删除。

d.Filter;d.entity.User;import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;public class Encodingfilter implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener {javax.servlet.ServletContext Application;//Application监听器@Overridepublic void contextInitialized(ServletContextEvent sce) {String path = ServletContext().getContextPath();System.out.println("应用开启:时间:"+new Date().toLocaleString());System.out.println("应用开启:路径:"+path);Application = ServletContext();Set<User> onLineUsers = new HashSet<>();//开启服务器添加在线用户集合Application.setAttribute("onLineUsers",onLineUsers);}@Overridepublic void contextDestroyed(ServletContextEvent sce) {String path = ServletContext().getContextPath();System.out.println("应用关闭:时间:"+new Date().toLocaleString());System.out.println("应用关闭:路径:"+path);Application = ServletContext();//关闭服务器后删除在线用户集合veAttribute("onLineUsers");}//Session监听器@Overridepublic void sessionCreated(HttpSessionEvent se) {
//        User user = (User) se.getSession().getAttribute("user");System.out.println("创建Session:");
//        //将session添加如onLineUsers
//        Set<User> onLineUsers = (Set<User>) Attribute("onLineUsers");
//        onLineUsers.add(user);}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {HttpSession session &#Session();User user = (User) Attribute("user");System.out.println("删除Session:"&#String());//将session从onLineUsers中删除Set<User> onLineUsers = (Set<User>) Attribute("onLineUsers");ve(user);}//session属性监听@Overridepublic void attributeAdded(HttpSessionBindingEvent se) {System.out.println("添加Session属性:");User user = (User) se.getSession().getAttribute("user");//将session添加如onLineUsersSet<User> onLineUsers = (Set<User>) Attribute("onLineUsers");onLineUsers.add(user);}@Overridepublic void attributeRemoved(HttpSessionBindingEvent se) {System.out.println("移除Session属性:");User user = (User) se.getSession().getAttribute("user");//将session添加如onLineUsersSet<User> onLineUsers = (Set<User>) Attribute("onLineUsers");ve(user);}@Overridepublic void attributeReplaced(HttpSessionBindingEvent se) {System.out.println("替换Session属性:");User user = (User) se.getSession().getAttribute("user");//将session添加如onLineUsersSet<User> onLineUsers = (Set<User>) Attribute("onLineUsers");onLineUsers.add(user);}
}

9.Ajax

①Ajax技术和传统的Web开发技术有什么异同?

发送方式不同
服务器响应不同
客户端处理响应的方式不同

②Ajavx是什么

Ajax:只刷新局部页面的技术

Asynchr onous JavaScript And Xml

​ 异步的

JavaScript:更新局部的网页
XML:一般用于请求数据和响应数据的封装
XMLHttpRequest对象:发送请求到服务器并获得返回结果 //Ajax技术的核心
CSS:美化页面样式
异步:发送请求后不等返回结果,由回调函数处理结果

XMLHttpRequest对象的方法
方法名说 明
open(method,URL,async)建立与服务器的连接
method参数指定请求的HTTP方法,值是GET或POST
URL参数指定请求的地址,
async参数指定是否使用异步请求,其值为true或false
send(content)发送请求 content参数指定请求的参数
格式为String:“name1=”+value1+"&name2="+value2
setRequestHeader(header,value)设置请求的头信息 ,使用post提交时使用,防止传递中出现错误、乱码等问题,
④XMLHttpRequest用属性

onreadystatechange:指定回调函数

readystate: XMLHttpRequest的状态信息 即就绪状态码

statusHTTP的状态码

responseText:获得响应的文本内容
responseXML:获得响应的XML文档对象

就绪状态码说 明
0XMLHttpRequest对象没有完成初始化
1XMLHttpRequest对象开始发送请求
2XMLHttpRequest对象的请求发送完成
3XMLHttpRequest对象开始读取响应,还没有结束
4XMLHttpRequest对象读取响应结束
HTTP的状态码说明
200服务器响应正常
400无法找到请求的资源
403没有访问权限
404访问的资源不存在
500服务器内部错误

在使用时一般判断的是是否读取响应结束的状态:4,和服务器响应正常的Http状态码:200;

在回调函数中,如果两个状态都匹配即就绪状态是4而且状态码是200,才可以处理服务器数据。

⑤创建XmlHttpRequest对象
	var xhr;//初始化XMLHttpRequestfunction createXHR(){try{return new XMLHttpRequest();  //初始化ie7版本之后,火狐,谷歌//正常状态返回的都是这个}catch(e){return new ActiveXObject("Microsoft.XMLHTTP");		//ie7以前的版本//这个是要兼容之前版本的IE}}
⑥演示示例:使用Ajax实现用户名验证

GET方式:

function checkName(){//XmlHttpRequest对象初始化xhr=createXHR();//获取需要传递的参数var name&#ElementById("username").value;//设置回调函数adystatechange=callback;  //此时使用的是GET方式提交,所以参数的设置直接跟在URL后边,设置使用异步truexhr.open("GET","CheckUserNameServlet?username="+name,true);//使用GET方式提交后不需要在send中设置参数了,传递值设置为nullxhr.send(null);  		}
function callback(){//回调函数adyState==4 && xhr.status==200){var msg&#ElementById("msg");var result&#sponseText;//使用responseText来获取返回值if(result=="true"){msg.innerHTML="用户名已经存在";}else{msg.innerHTML="用户名可以使用";}}}

POST

function searchSuggest(){//XmlHttpRequest对象初始化xhr=createXHR();//获取需要传递的参数var keyword&#ElementById("txtSearch").value;//设置回调函数adystatechange=callback;//打开链接,传递方式为POST,POST提交时只需要写名地址不需要加参数xhr.open("POST","SuggestServlet",true);//post提交时防止发生错误设置请求头参数。。。。。固定格式xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");//POST提交时添加参数xhr.send("keyword="+keyword);  		
}
⑦总结

Ajax(Asynchronous JavaScript And XML)。
Ajax并不是一种新技术,而是整合几种现有技术:JavaScriptXMLCSS,其中主要是JavaScript

XMLHttpRequest对象的属性、方法说明
onreadystatechange
属性
设置传递后需要调用的回调参数//只写参数名即可
open( )
方法
建立连接,参数有method:提交方式、URL:地址、async:是否使用异步传递(true/false)
send( )
方法
传递参数
POST传递时需要传递参数
GET传递时不需要设置为null
readyState
属性
就绪状态码,读取响应完成的值为4
status
属性
HTTP状态码,服务器响应正常为200
responseText
属性
获取响应返回的文本内容
responseXML
属性
获得响应返回的XML文档对象
setRequestHeader()
方法
使用POST方式提交时需要设置请求头

10.jquery.ajax

①使用方法

get:

<(url, [data], [callback], [type])

post:

Query.post(url, [data], [callback], [type])

参数名称类型说明
urlString请求的URL地址
data(可选)Map要发送到服务器的key/value数据
callback(可选)Function响应成功时的回调函数
type(可选)String返回内容格式,可以是:xml, html, script, json, text, _default
$("#test").click(function () {$.get("testServlet",{type:"test"},function (data) {console.log(data.name);});},"text")
//注意,返回类型是String,说明时需要加上"";

返回类型补充说明

如果前端返回类型type没有选的话,默认为text,如果想要使用json格式则需要在后端加上设置格式

		String type= Parameter("type");PrintWriter out= Writer();resp.setContentType("application/json");//设置响应response的格式为jsonif(type!=null){if(type.equals("test")){out.write("{"name":"小明"}");}else{out.write("2");}}else{out.write("0");}

$.ajax()

格式:

$.ajax({type:"POST",url:"xxxxxxxxx",data:{name:$("name").val(),password:$("password").val()},datatype:"text",success:function (data){				//成功后触发if(data=="true"){alter("成功");}else{alter("失败");}},error:function(jqxhr,textstatus,errorThrown){		//发生错误时触发console.log("错误");}})
json格式:

格式为key:value,使用时key要加上"“号,value为int时不需要加”“号,value为String时需要加”"号,

当value为数组时需要加[ ]号,json格式整体加{ }号。

{

​ “int”:value,

​ “String”:“value”

​ “list”:[

​ value,

​ value

​ ]

}

{"key1":1,//此时key1的值为int类型:1"key2":"1",//此时key2的值为String类型:"1""key3": [1, 2, 3, 4]//此时key3的值为int[]数组
}

11.layer.js

lib中已收录,下载过H-ui框架,无需单独下载,但页面需要单独引入。单独下载地址 layer_v3.1.1.js

layer.js是由前端大牛贤心编写的web弹窗插件。

使用方法

1、layer.js依赖jquery或者zepto.js。

<script type="text/javascript" src="lib/layer/3.1.1/layer.js"></script>

js调用

layer.open({  title: '在线调试'  ,content: '可以填写任意的layer代码'});

demo效果

打开弹窗

相关参数

属性默认值描述备注
type0类型0 信息框,默认 | 1 页面层 | 2 iframe层 | 3 加载层 | 4 tips层
title“信息”标题支持三种类型的值。字符串:"我是标题"数组:[‘文本’, ‘font-size:18px;’]布尔值:false
content“”内容支持:String、html、DOM、URL、数组
skin“”样式类名可以定制layer皮肤。
area“auto”宽高数组 [‘500px’, ‘300px’]
offset垂直水平居中坐标String/Array。[‘100px’, ‘50px’]
icon-1图标-1(信息框)/0(加载层)
btn“确认”按钮btn: [‘按钮一’, ‘按钮二’, ‘按钮三’] //可以无限个按钮。,yes: function(index, layero){ //按钮【按钮一】的回调},btn2: function(index, layero){ //按钮【按钮二】的回调 //return false 开启该代码可禁止点击该按钮关闭},btn3: function(index, layero){ //按钮【按钮三】的回调 //return false 开启该代码可禁止点击该按钮关闭},cancel: function(){ //右上角关闭回调 //return false 开启该代码可禁止点击该按钮关闭}
btnAlignr按钮排列“l” 左对齐 | “c” 居中对齐 | “r” 右对齐
closeBtn1关闭按钮两种风格:1 | 2 | 0 不显示
shade0.3 透明度的黑色背景(’#000’)遮罩String/Array/Boolean[0.8, ‘#393D49’]0 不显示遮罩。
shadeClosefalse是否点击遮罩关闭
time0 不自动关闭自动关闭所需毫秒5000 5秒后自动关闭
id用于控制弹层唯一标识String
anim0弹出动画0 平滑放大 | 1 从上掉落 | 2 从最底部往上滑入 | 3 从左滑入 | 4 从左翻滚 | 5 渐显 | 6 抖动
isOutAnimtrue关闭动画
maxminfalse最大最小化
fixedtrue固定
resizetrue是否允许拉伸
resizingnull监听窗口拉伸动作回调函数。
scrollbartrue是否允许浏览器出现滚动条
maxWidth360最大宽度只有当area: 'auto’时,maxWidth的设定才有效。
maxHeight最大高度只有当高度自适应时,maxHeight的设定才有效。
zIndex19891014 贤心生日层叠顺序用于解决和其它组件的层叠冲突。
move‘.layui-layer-title’触发拖动的元素String/DOM/Boolean。默认是触发标题区域拖拽。如果你想单独定义,指向元素的选择器或者DOM即可。如move: ‘.mine-move’。你还配置设定move: false
moveOutfalse是否允许拖拽到窗口外默认只能在窗口内拖拽,如果你想让拖到窗外,那么设定moveOut: true即可。
moveEndnull拖动完毕后的回调方法回调函数。
tips2方向和颜色Number/Array。tips层的私有参数。支持上右下左四个方向
tipsMorefalse是否允许多个tips允许多个意味着不会销毁之前的tips层。
successnull层弹出后的成功回调方法回调函数
yesnull确定按钮回调方法回调函数
cancelnull右上角关闭按钮触发的回调回调函数,携带两个参数。当前层索引参数(index)、当前层的DOM对象(layero)。如果不想关闭,return false即可。
endnull层销毁后触发的回调回调函数
full/min/restorenull分别代表最大化、最小化、还原 后触发的回调回调函数
fig(options)初始化全局配置
layer.open(options)核心方法
layer.alert(content, options, yes)普通信息框
firm(content, options, yes, cancel)询问框
layer.msg(content, options, end)提示框
layer.load(icon, options)加载层
layer.tips(content, follow, options)tips层
layer.close(index)关闭特定层
layer.closeAll(type)关闭所有层“dialog” 关闭信息框 | “page” 关闭所有页面层 | “iframe” 关闭所有的iframe层 | “loading” 关闭加载层 | “tips” 关闭所有的tips层
layer.style(index, cssStyle)重新定义层的样式
layer.title(title, index)改变层的标题
ChildFrame(selector, index)获取iframe页的DOM
FrameIndex(windowName)获取特定iframe层的索引
layer.iframeAuto(index)指定iframe层自适应
layer.iframeSrc(index, url)重置特定iframe url
layer.setTop(layero)置顶当前窗口
layer.full()、layer.min()、store()手工执行最大小化
layer.prompt(options, yes)输入层
layer.tab(options)tab层
layer.photos(options)相册层

12.富文本编辑器

<script src="@latest/dist/wangEditor.min.js"></script>
<div id="div1"><p>新闻内容</p>
</div>
<textarea name="context" id="text1" style="width:100%; height:200px;display: none"></textarea>
<script type="text/javascript">const E = window.wangEditorconst editor = new E('#div1')const $text1 = $('#text1')hange = function (html) {// 第二步,监控变化,同步更新到 textarea$text1.val(html)}ate()// 第一步,初始化 textarea 的值$text1.html());
</script>

本文发布于:2024-01-29 08:30:43,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170648824814002.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:javaWeb
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23