JAVA WEB
1.基本概念
1.1 前言
web开发:
-
web:网页的意思,www.baidu.com
-
静态web
-
html,css
-
提供给所有人看的数据始终不会发生变化
-
-
动态web
-
提供给所有人看的数据始终会发生变化,每个人在不同的时间,不同的地点看到的信息各不相同
-
淘宝,京东,几乎是所有的网站
-
技术栈:Servket/jsp,ASP,PHP
在JAVA中,动态web资源开发的技术统称为JAVA web
-
1.2 web应用程序
web应用程序:可以提供给浏览器访问的程序;
-
a.html、b.html.......多个web资源,这些web资源可以被外界访问,对外界提供服务
-
你们能访问到的任何一个页面或者资源,都存在与这个世界的某一个角落的计算机上
-
URL
-
这个统一的web资源会被放在同一个文件夹下,web应用程许->Tomcat:服务器
-
一个web应用由多部份组成(静态web,动态web)
-
html,css,js
-
jsp,servlet
-
java程序
-
jar包
-
配置文件(properties)
-
web应用程序编写完毕之后若想要提供给外界访问:需要一个服务器来统一管理;
1.3 静态web
-
. html .htm,这些都是网页的后缀
-
静态web存在的缺点
-
web页面无法动态更新,托幼用户看到都是一个页面
-
轮播图,点击特效:伪特效
-
javascript[实际开发用的最多]
-
VBscript[微软的一种技术]
-
-
无法与数据库交互 (数据无法持久化 用户无法交互)
1.4 动态web
页面会动态展示:“web展示的效果因人而异”
缺点
-
加入服务器的动态web资源发生了错误,我们需要重新编写我们的后台程序 重新发布;
-
停机维护
-
优点:
-
web页面可以动态更新,可以让所有的用户看到不是同一个页面
-
轮播图,点击特效:伪动态
-
javascript[实际开发用的最多]
-
VBscript[微软的一种技术]
-
-
它可以与数据库交互(数据持久化:注册,用户数据存储)
-
2.web服务器
2.1 技术讲解
ASP:
-
微软:国内最早流行的就是asp
-
在html中潜入了vb的脚本,asp+ com
-
在ASP开发中,基本一个页面都有几千行的业务代码,页面机器混乱
-
维护成本太高
-
C#
-
IIS(international information services)
PHP
-
PHP开发速度很快,功能很强大,跨平台,代码很简单(70%)
-
无法承载大访问量的情况(局限性)
JSP/Servlet:
B/S:浏览和服务器
C/S:客户端和服务器
-
SUN公司主推的B\S架构
-
基于java语言的(所有的大公司,或者一些开源的组件,都是用java写的
-
可以承载高并发 高可用 高性能 带来的影响
-
语法向ASP,ASP->>jsp,加强市场强度
2.2 web服务器
服务器是一种被动的操作,用来处理用户的一些请求和给用户一些响应信息
IIS
微软的;asp windows中自带的
Tomcat
omcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
......
工作3-5年之后可以长是手写tomcat服务器;
3.Tomcat
3.1启动和关闭 tomcat
bin目录下的 startup.bat 和 shutdown.bat
3.2配置
config 中的server.xml
-
可以配置启动的端口号
-
tomcat 的默认端口位8080
-
mysql是3306
-
http是80
-
https是443
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
-
-
可以配置主机的名称
-
默认主机名位localhost
-
默认网站存放的位置位:webapps
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
高难度面试题
-
输入一个域名:回车
-
检查本机的C:\Windows\System32\drivers\etc\host配置文件下有没有这个域名映射;
-
有:直接返回对应的ip地址,这个地址中,有我们需要访问的web程序,可以直接访问
127.0.0.1 host
-
没有:去DNS服务器找,找到就会犯,找不到就返回找不到
-
3.3 发布一个web网站
不会就线模仿
-
将自己写的网站,放到服务器(tomcat)中指定的web应用的文件夹(webapps)下,就可以访问了,网站应该有的结构
--webapps: tomcat服务器的web目录 -ROOT -kuangstudy:网站的目录名 -WEB-INF -classes:java程序 -lib:web应用所依赖的jar包 -WEB.XML -index.html 默认的首页 -static -css -style.css -js -img ...
HTTP协议:面试
Maven:构建工具
-
Maven安装包
Servlet入门
-
HELLO WORLD!
-
servlet配置
-
原理
4.HTTP
4.1什么是HTTP
http(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使开发和部署非常地直截了当。
-
文本:html 字符串......
-
超文本:图片 音乐 视频 定位 地图等
-
默认端口为80
HTTPS:安全的http
-
默认端口为443
4.2 两个时代
-
http1.0
-
HTTP/1.0 客户端可以与web服务器连接后,只能获得一个web资源,断开连接
-
-
http2.0
-
HTTP/1.1客户端可以与web服务器连接后,可以获得多个web资源,断开连接
-
4.3 HTTP请求
-
客户端---发请求(request) ---- 服务器
-
百度
Request URL: https://www.baidu.com/ 请求地址 Request Method: GET get方法、post方法 Status Code: 200 OK 状态码:200 Remote Address: 14.215.177.38:443 Referrer Policy: strict-origin-when-cross-origin
4.3.1请求行
-
请求行中的请求方式:GET
-
请求方式:Get,Post,HEAD,delete,put,tract
-
get:请求能够携带的参数比较少,大小有限制,回在浏览器的Url地址栏显示数据内容,不安全,但是高效
-
post:请求能够携带的参数没有限制,大小没有限制,回在浏览器的Url地址栏布显示数据内容,安全,但是高效
-
4.3.2消息头
Accept:告诉浏览器,它所支持的数据类型 Accept-Encoding: gzip, deflate, br 支持哪种编码格 式 Accept-Language: zh-CN,zh;q=0.9 告诉浏览器:它的语言环境 Cache-Control: max-age=0 缓存控制 Connection: keep-alive 请求完成时断开还是 保持连接 HOST : 主机
-
4.4 HTTP响应
-
服务器---响应----客户端
百度:
Bdpagetype: 1 Bdqid: 0xa0512beb0002b6b4 Cache-Control: private 缓存控制 Connection: keep-alive连接 Content-Encoding: gzip 编码 Content-Type: text/html;charset=utf-8 类型 Date: Fri, 13 Aug 2021 04:50:12 GMT Expires: Fri, 13 Aug 2021 04:49:29 GMT
4.4.1响应体
Accept:告诉浏览器,它所支持的数据类型 Accept-Encoding: gzip, deflate, br 支持哪种编码格 式 Accept-Language: zh-CN,zh;q=0.9 告诉浏览器:它的语言环境 Cache-Control: max-age=0 缓存控制 Connection: keep-alive 请求完成时断开还是 保持连接 HOST : 主机 Refresh: 告诉客户端,多久刷新一次 location:让王爷重新定位
4.4.2响应状态码(重点)
200:请求响应成功
3xx:请求重定向
-
重定向:你重新找 我给你新位置 去访问
4xx:找不到资源 或者服务器上没有该资源
5xx:服务器代码错误 500 502 网关错误
常见面试题:
当你的浏览器中地址栏输入地址并回车的一瞬间能展示界面回来经历了什么 ??
就是以上代码总结吹水拿出来
5.Maven
-
在web开发中需要用到大量的jar包,需要手动导入;
-
如何让一个东西自动帮我导入和配置jarbao
由此,Maven诞生了
5.1 Maven项目架构管理工具
方便导入jar包的
Maven的核心思想:约束大于配置
-
有约束,不要去违法
Maven回归定好你该如何去编写我们的java代码,必须按照这个规范来
5.2 Maven配置环境变量
5.3阿里云镜像
-
镜像(mirror)
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</ur> <mirrorOf>central</mirrorOf> </mirror>
5.4本地仓库
在本地的仓库,远程仓库;
建立一个本地仓库:localRepository
建立一个本地仓库
<localRepository>D:\environment\Maven\apache-maven-3.8.1\maven-repo</localRepository>
5.5 在IDEA中使用Maven
为什么要创建这么一个 maven:war ?
原因是我们在进行网络访问时候 必须要访问指定到某一个文件夹里面
5.5 pom文件
pom.xml是maven的核心配置文件
5.6 IDEA操作
ctrl+shift+alt:多行操作 psvm:生成main()方法; fori:生成for循环; Ctrl+Alt+v:自动补齐返回值类型 ctrl+o:覆写方法 ctrl+i:实现接口中的方法 ctrl+shift+u:大小写转换 CTRL+SHIFT+Z:取消撤销 Alt+Insert:生成构造方法、getter、setter ctrl+y:删除当前行 Ctrl+Shift+J:将选中的行合并成一行 ctrl+g:定位到某一行 Ctrl+Shitft+向下箭头:将光标所在的代码块向下整体移动 Ctrl+Shift+向上箭头:将光标所在的代码块向上整体移动 Alt+Shift+向下箭头:将行向下移动 Alt+Shift+向上箭头:将行向上移动 Ctrl+F:在当前文件中查找 Ctrl+R:替换字符串 Ctrl+Shift+F:在全局文件中查找字符串 Ctrl+Shift+R:在全局中替换字符串 Ctrl+Shift+Enter:自动补齐{}或者分号; Shift+Enter:在当前行的下方开始新行 Ctrl+Alt+Enter:在当前行的上方插入新行 Ctrl+Delete:删除光标所在至单词结尾处的所有字符
Maven中jar包中的联系关联图
6.Maven仓库的使用
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>
7.servlet
7.1 servlet简介
-
servlet是sun公司开发动态web 的一门技术
-
sun在这些api中提供一个接口叫做servlet,如果你想开发一个servlet程序,只需要完成两个小步骤:
-
编写一个类,实现servlet几口
-
把开发好的java类部署到web服务器中
把实现了servlet接口的java程序jiaozuo,servlet
-
7.2helloservlet
-
构建一个maven项目:删除掉所有文件,新建一个module就是
-
关于父子工程的理解:
父项目中会有
<modules> <module>servlet-01</module> </modules>
子项目会有
<parent> <artifactId>javaweb-01-maven</artifactId> <groupId>com.gzb2021813</groupId> <version>1.0-SNAPSHOT</version> </parent>
父项目中的java子项目可以直接使用
son extends father
-
Maven环境优化
-
修改web,xml为最新的
-
将maven的结构搭建完整
-
servlet 类的继承
-
编写servlet的映射
为什么需要映射:我们写的是java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的servlet,还需给他一个浏览器能够访问的路径
7.3 servlet的原理
servlet是由web服务器调用的,收到浏览器的请求后 ,会:
7.4Mapping
-
一个servlet可以指定一个映射路径
-
一个servlet可以指定多个映射路径
-
一个servlet可以指定通用映射路径
-
指定一些后缀或者路径等。。。。
-
优先级问题
制定了固有的,或者已经有的路径是绝对有限的,优先级别最高,如果找不到就会走默认的处理要求
<servlet> <servlet-name>error</servlet-name> <servlet-class>com.jw.servlet.ErrorServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>error</servlet-name> <!--请求路径--> <url-pattern>/*</url-pattern> //通用路径 error便是通用路径 </servlet-mapping>
7.5ServletContext
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象的web应用
1.共享数据
在当前的servle保存的数据 在另一个servlet可以拿到
传到servletContext
//this.getServletContext() servlet上下文 ServletContext context =this.getServletContext(); String username="gzb"; context.setAttribute("username",username);//将一个数据保存再servlecontext中,名字为:username,值username System.out.println("hello");
ServletContext context = this.getServletContext(); String username =(String) context.getAttribute("username"); resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); resp.getWriter().print("名字"+username);
等待数据重新上传之后 等待服务器重启看到测试结果:
2.获取初始化参数
//web.xml里面的 <context-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/mybatis</param-value> </context-param> <servlet> //class文件里面的 ServletContext context = this.getServletContext(); String url = context.getInitParameter("url"); resp.getWriter().print(url);
3.请求转发
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); /*RequestDispatcher requestDispatcher = context.getRequestDispatcher(".gp");//转发请求路径 requestDispatcher.forward(req,resp);//调用forward实现请求转发*/ System.out.println("进入了servletdemo04"); context.getRequestDispatcher("/gp").forward(req,resp); }
4.读取资源文件
Properties
-
在java目录下新建properties
-
在resources目录下新建properties
-
发现:都被打包到了同一个路径下:classes 俗称这个路径为classpath
-
思路:需要一个文件流
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties"); Properties prop = new Properties(); prop.load(is); String username = prop.getProperty("username"); String password = prop.getProperty("password"); resp.getWriter().print(username+password); }
7.6HtttpServletRequest
HtttpServletRequest代表客户端的请求,用户通过http协议访问服务器,http请求中的所有信息会被封装到HtttpServletRequest,通过HtttpServletRequest的方法,获得客户端的所有信息
1.获取前端传递的参数
2.请求转发
7.7HtttpServletResponse
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的httpservletrequest对象,代表相应的一个HtttpServletResponse
-
如果要获取客户端请求过来的参数:找httpservletrequest
-
如果要给客户端相应一些信息:找h ttpresponse
1.简单分类
负责向浏览器发送数据的方法
-
ServletOutputStream getOutputStream() throws IOException; PrintWriter getWriter() throws IOException;
2.状态响应码
int SC_CONTINUE = 100; int SC_SWITCHING_PROTOCOLS = 101; int SC_OK = 200; int SC_CREATED = 201; int SC_ACCEPTED = 202; int SC_NON_AUTHORITATIVE_INFORMATION = 203; int SC_NO_CONTENT = 204; int SC_RESET_CONTENT = 205; int SC_PARTIAL_CONTENT = 206; int SC_MULTIPLE_CHOICES = 300; int SC_MOVED_PERMANENTLY = 301; int SC_MOVED_TEMPORARILY = 302; int SC_FOUND = 302; int SC_SEE_OTHER = 303; int SC_NOT_MODIFIED = 304; int SC_USE_PROXY = 305; int SC_TEMPORARY_REDIRECT = 307; int SC_BAD_REQUEST = 400; int SC_UNAUTHORIZED = 401; int SC_PAYMENT_REQUIRED = 402; int SC_FORBIDDEN = 403; int SC_NOT_FOUND = 404; int SC_METHOD_NOT_ALLOWED = 405; int SC_NOT_ACCEPTABLE = 406; int SC_PROXY_AUTHENTICATION_REQUIRED = 407; int SC_REQUEST_TIMEOUT = 408; int SC_CONFLICT = 409; int SC_GONE = 410; int SC_LENGTH_REQUIRED = 411; int SC_PRECONDITION_FAILED = 412; int SC_REQUEST_ENTITY_TOO_LARGE = 413; int SC_REQUEST_URI_TOO_LONG = 414; int SC_UNSUPPORTED_MEDIA_TYPE = 415; int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416; int SC_EXPECTATION_FAILED = 417; int SC_INTERNAL_SERVER_ERROR = 500; int SC_NOT_IMPLEMENTED = 501; int SC_BAD_GATEWAY = 502; int SC_SERVICE_UNAVAILABLE = 503; int SC_GATEWAY_TIMEOUT = 504; int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
3.常见应用
1.向浏览器输出消息
2.下载文件
1. 要获取下载文件的路径 2. 下载的文件名是啥? 3. 设置想办法让浏览器能支持下载我们想要的东西 4. 获取下载文件的输入流 5. 创建缓冲区 6. 获取outputstream对象 7. 将fileoutputstream流写道buffer缓冲区 8. 使用outputstream将缓冲区中的数据输出到客户端
3.验证码功能
养正怎么来的?
-
前端实现
-
后端实现,需要用的java的图片类,生产一个图片
4.实现重定向
一个web资源收到客户端请求a后,b他会通知客户端 去访问另一个web资源c,这个过程交重定向
常见场景:
-
用户登录
void sendRedirect(String var1) throws IOException;
-
测试
public class RedirectServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { /* resp.setHeader("location","/img"); resp.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);*/ resp.sendRedirect("img"); }
5.面试题:请你聊聊重定向和转发的区别?
相同点
-
页面都会实现跳转
不同点
-
请求转发的时候,url不会发生改变变化 状态码是307
-
重定向时候,url地址栏会发生变化 状态码是302
7.8.Cookie、session
7.1 会话
会话:用户打开浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程惩治和为绘画
有状态会话:你怎么证明你是韶关的学生?
1. 发票 2. 学校等级
客户端 服务端
1.服务端给客户端发了一个cookie
7.2保存会话的两种技术
cookile
-
客户端技术(请求,响应)
session
-
服务器技术,利用这个技术,可以保存用户的会话信息 我们可以把信息或者数据放在session!
常见:网站登录之后,你下次不用再次登陆了,第二次访问就可以登上去了
7.3 Cookie
-
从请求红拿到cookie信息
-
服务器相应给客户端cookie
cookie:一般会保存在本地的 用户目录下 appdata
一个网站cookie是否存在上限! 聊聊细节问题
-
一个cookie只能保存一个信息
-
一个web站点可以给浏览器发送多个cookie,最多存放29哥cookie
-
cookie大小有限制4kb
-
300个cookie浏览器上限
删除cookie
-
不设置有效期,关闭浏览器,自动生效
-
设置有效期时间为0;
7.4 Session(重点)
什么是session
-
服务器会给每一个用户(浏览器)创建一个session对象
-
一个session独占一个浏览器,只要浏览器没有关闭,这个session就存在
-
用户登陆之后,整个网站它都可以访问 --》保存用户的信息,保存购物车的信息—
session和cookie的区别
-
Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
-
session是把用户的数据写到用户的独占session中,服务器端保存(保存中药的信息,减少服务器资源的浪费)
-
session对象由服务创建;
Session使用场景:
-
保存一个登录用户的信息
-
购物车信息
-
在整个网站中经常会使用的数据,我们将他保存在session中;
使用session
HttpSession session = req.getSession(); //给session中存东西 session.setAttribute("name",new Person("suru711",1)); //获取session的id String id = session.getId(); //判断session是不是新创建 if(session.isNew()){ resp.getWriter().write("session创建成功,id为:"+id); } else{ resp.getWriter().write("session已经在服务器中存在了,id为" +id); } //注销session HttpSession session = req.getSession(); session.removeAttribute("name"); //手动注销 session.invalidate();
会话自动过期
<!--设置session默认的失效时间--> <session-config> <session-timeout>1440</session-timeout> <!--1440分钟后 一天后失效 session自动失效--> </session-config>
8.JSP
8.1什么是JSP
java server Pages: java服务器端页面,也和servlet 一样,用于动态web技术
最大的特点:
-
写JSP就像再写HTML
-
区别:
-
HTML只给用户提供静态的数据集
-
JSP页面中可以嵌入JAVA代码,为用户提供动态数据
-
8.2JSP原理
思路:JSP到底怎么执行的
-
代码层面没有任何的问题
-
服务器内部公国
tomcat中有一个work目录
IDEA中使用tomcat回在目录中生成一个work目录
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问servlet
jsp最终也会被加工成一个java类
JSP 本质上也就是 一个 servlet
//初始化 @Override public void init(ServletConfig servletConfig) throws ServletException { } //销毁 @Override public void jspDestroy() { } //jspservice public void _jspService(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException { }
-
判断请求
-
内置一些对象
final javax.servlet.jsp.PageContext pageContext; javax.servlet.http.HttpSession session = null; final javax.servlet.ServletContext application; final javax.servlet.ServletConfig config; javax.servlet.jsp.JspWriter out = null; final java.lang.Object page = this; javax.servlet.jsp.JspWriter _jspx_out = null; javax.servlet.jsp.PageContext _jspx_page_context = null;
-
文字描述:WEB容器(Servlet引擎)接收到以.jsp为扩展名的URL的访问请求时,它将把该访问请求交给JSP引擎去处理。Tomcat中的JSP引擎就是一个Servlet程序,它负责解释和执行JSP页面。每个JSP 页面在第一次被访问时,JSP引擎将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet的class类文件,然后再由WEB容器(Servlet引擎)像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程序。 Tomcat 5.x把为JSP页面创建的Servlet源文件和class类文件放置在“<TOMCAT_HOME>\work\Catalina<主机名><应用程序名>\”目录中,Tomcat将JSP页面翻译成的Servlet的包名为org.apache.jsp.<JSP页面在WEB应用程序内的目录名> 。JSP规范也没有明确要求JSP中的脚本程序代码必须采用Java语言,JSP中的脚本程序代码可以采用Java语言之外的其他脚本语言来编写,但是,JSP页面最终必须转换成Java Servlet程序。
-
输出页面签增加的代码
response.setContentType("text/html"); pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out;
在jsp页面中
只要是java代码就会原封不动的输出
如果是html代码,就会被转换成
out.write("<html>\r\n")
这样的格式,输出到前端
-
8.3jsp基础语法
任何语言都有自己的语法,java中有,jsp作为java技术的一种应用,它拥有一些自己扩充的语法(了解,知道就可以了),java是所有语法都支持
jsp表达式
<%--jsp表达式--%> <%--作用:用来将程序的输出,输出到客户端--%> <%= new java.util.Date()%>
jsp脚本片段
<%--jsp表达式--%> <%--作用:用来将程序的输出,输出到客户端--%> <%= new java.util.Date()%> <%--脚本片段--%> <hr/> <% int sum=0; for (int i=1;i<=100;i++) { sum+=i; } out.println("<h1>sum="+sum+"</h1>"); %> <% int x=10; out.println(x); %> <p>这是一个jsp代码</p> <% int y=10; out.println(y); %> <%--尝试在代码处嵌入html代码--%> <% int sum1=0; for (int j=1;j<5;j++){ /* <h1>HelloWorld</h1>这里报错了没法写*/ sum+=j; } %>
JSP生命:会被编译到jsp生成
java的类中!其他的,会被生成到jspservice方法中!
在jsp,嵌入java代码即可
<%%> <%=%> <%!%>
jsp的注释,不会再客户端显示,html的就可以
8.4jsp指令
<%@ page ... %> | 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等 |
---|---|
<%@ include ... %> | 包含其他文件 |
<%@ taglib ... %> | 引入标签库的定义 |
8.5 jsp标签,jstl标签,el表达式
<dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl-api</artifactId> <version>1.2</version> </dependency> <!-- JSTL所需要的standard标签库 --> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency>
EL表达式:${}
-
获取数据
-
执行运算
-
获取web开发的常用对象
-
调用java方法
9.JavaBean
实体类
javabean由特定的写法
-
必须要一个无参构造
-
必须私有化
-
必须由对应的get/set方法
一个用来和数据库的字段做映射ORM;
ORM:对象关系映射
-
表--->类
-
字段->属性
-
行记录->对象
people表
id
-
10.MVC三层架构
什么是MVC:Model View Control
10.1早些年
用户直接访问控制层,控制层就可以直接操作数据库
servlet--CRUD-->数据库 弊端:程序十分臃肿,不利于维护 servlet的代码中,处理请求,响应,视图跳转,处理jdbc,处理业务代码,处理逻辑代码 架构:没有什么是加一层解决不了的 程序猿调用 | JDBC | mysql oracle sqlserver
10.2MVC三层架构
Model
-
业务处理:业务逻辑(Service)
-
数据持久层:CRUD(Dao)
View
-
展示数据
-
提供链接发起Servlet请求(a,form,img..)
Controller(Servlet)
-
接受用户的请求:(req:请求参数或者session信息)
-
交给业务层处理对应的代码
-
控制视图的跳转
登录---->接受用户的登录请求---->处理用户的请求(获取用户登录的参数,username,password)--->给业务层出压力登录业务(p判断用户名密码是否正确)--->Dao层查询用户名和密码是否正确---》数据库
11.Filter(重点)
Shiro
Filter:过滤器,用来过滤网站的数据
-
处理中文乱码
-
登陆验证
Filter开发步骤
导包
public class CharacterEncodingFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //chain:链 /* * 1. 过滤器的所有代码,在过滤特定的请求的时候都会执行 * 2、必须要让过滤器继续通行 * filterChain.doFilter * */ servletRequest.setCharacterEncoding("utf-8"); servletResponse.setCharacterEncoding("utf-8"); servletResponse.setContentType("text/html;charset=UTF-8"); System.out.println("CharacterEncodingFilter执行前"); filterChain.doFilter(servletRequest,servletResponse);//让我们的请求继续走,如果不写,程序到这里就被拦截停止 System.out.println("CharacterEncodingFilter执行后"); } public void destroy() { System.out.println("web服务器关闭的时候过滤器会销毁"); }
xml文件
<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>com.jw.Filter.CharacterEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <!--只要是servlet下面的任何请求, 都要请求这个过滤器--> <url-pattern>/servlet/*</url-pattern> </filter-mapping>
12 监听器
实现一个监听器的接口
1.编写一个监听器:
实现监听器的接口..
package com.jw.listener; import javax.servlet.ServletContext; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import java.net.http.WebSocket; //统计在线人数:统计session public class OnlineCountListener implements HttpSessionListener { @Override//创建session监听:看你的一举一动 //一旦创建session就会触发一次这个时间 public void sessionCreated(HttpSessionEvent httpSessionEvent) { ServletContext ctx = httpSessionEvent.getSession().getServletContext(); Integer onlineCount= (Integer) ctx.getAttribute("OnlineCount "); if(onlineCount==null){ onlineCount=new Integer(1); } else { int count= onlineCount.intValue(); onlineCount=new Integer(count+1); } ctx.setAttribute("OnlineCount",onlineCount); } //一旦创建session就会触发一次这个时间 @Override public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { ServletContext ctx = httpSessionEvent.getSession().getServletContext(); Integer onlineCount= (Integer) ctx.getAttribute("OnlineCount "); if(onlineCount==null){ onlineCount=new Integer(0); } else { int count= onlineCount.intValue(); onlineCount=new Integer(count-1); } ctx.setAttribute("OnlineCount",onlineCount); } }
2.web.xml注册监听
<listener> <listener-class>com.jw.listener.OnlineCountListener </listener-class> </listener>
3.看情况设置使用
13.过滤器,监听器的应用
14.jdbc
需要jar包的支持:
-
java.sql
-
javax.sql
-
mysql-connecter-j ava...连接数据库用的
实验环境搭建
导入数据库依赖 jdbc mysql 的驱动
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> </dependencies>
IDEA中连接数据库
JDBC固定步骤
String uri="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8"; String username="root"; String password="123"; Class.forName("com.mysql.jdbc.Driver"); //1.加载驱动 Connection connection = DriverManager.getConnection(uri, username, password); //2.连接数据库,代表数据库 Statement statement = connection.createStatement(); //3.向数据库发送sql对象 String sql="select * from users"; //4.编写sql ResultSet rs =statement.executeQuery(sql); while (rs.next()){ System.out.println("id="+rs.getObject("id")); System.out.println("name="+rs.getObject("name")); System.out.println("password="+rs.getObject("password")); System.out.println("email="+rs.getObject("email")); System.out.println("birthday="+rs.getObject("birthday")); } //5.执行查询sql,返回一个resultset:结果集 rs.close(); statement.close(); connection.close(); //6.对池的进行关闭
事务
要么都成功,要么都失败
ACID原则:保证数据的安全。
开启事务 事务提交 commit() 事务回滚 rollback() 关闭事务 转账: A:1000 B:1000
15 JNI Java Native Interface
//implements Serialzable 标记接口