JavaWeb学习
1.基本概念
动态web资源开发的技术统称为JavaWeb
web应用程序:可以提供浏览器访问的程序
统一的web资源会被放在同一个文件夹下
web应用程序 -->Tomcat:服务器
一个web应用由多部分组成:
- html css js
- jsp servlet
- java程序
- jar包
- 配置文件
静态web的缺点:无法动态更新,无法和数据库交互,数据无法持久化
web应用程序编写完毕后,若想提供给外界访问:需要一个服务器来统一管理
2.web服务器
2.1技术讲解
ASP,JSP,php
JSP/Servlet
B/S:浏览器和服务器 C/S:客户端和服务器
- sun公司主推的B/S架构
- 基于Java语言
- Servlet 是在服务器上运行的小程序
2.2 web服务器
服务器是一种被动的操作,用来处理用户的请求和给用户一些响应信息
IIS:微软的;ASP,windows中自带的
Tomcat:
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目.
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选
Tomcat 实际上运行JSP 页面和Servlet
3.Tomcat
tomcat是啥?
web容器
tomcat更多用来做做一个应用容器,让java web app跑在里面的东西,对应同级别的有jboss,jetty等东西。
一个支持Servlet API的Web服务器
什么是容器?
容器是一种为某种特定组件的运行提供必要支持的一个软件环境。例如,Tomcat就是一个Servlet容器,它可以为Servlet的运行提供运行环境。类似Docker这样的软件也是一个容器,它提供了必要的Linux环境以便运行一个特定的Linux进程。
为什么需要tomcat?
普通的Java程序是通过启动JVM,然后执行main()方法开始运行。但是Web应用程序有所不同,我们无法直接运行war文件,必须先启动Web服务器,再由Web服务器加载我们编写的HelloServlet,这样就可以让HelloServlet处理浏览器发送的请求。
编写Web应用程序就是编写Servlet处理HTTP请求;
tomcat的启动和配置
可启动的端口
tomcat默认端口:8080
mysql:3306
http:80
https:443
可配置的主机名称
默认的主机名为:localhost -- 127.0.0.1
默认网站应用存放的位置:webapps
面试题:网站是如何访问的
1.输入一个域名
2.检查本机的hosts配置文件有没有这个域名映射;
有:直接返回对应的ip地址,这个地址中,有我们需要访问的web程序,可以直接访问
没有:去DNS服务器
发布一个web网站
网站应该有的架构
--webspps: Tomcat服务器的web目录
-ROOT
-kuangstudy:网站的目录名
-WEB-INF
-classes:java程序
-lib:web应用所依赖的jar包
-web.xml
-index.html
-static
-css
-js
-img
4.http
4.1 什么是http
http(超文本传输协议)是一个简单的请求-相应协议,通常运行在TCP之上
-文本:html 字符串
-超文本:图片、音乐、视频、定位、地图
-80(默认端口)
https:安全的
-443
5.Maven
项目的打包方式:
jar:java应用
war:JavaWeb应用
properties:配置
dependencies:项目依赖
问题:
可能遇到写的配置文件无法被导出,或者生效的问题
解决方案:
在build中配置resources,防止资源导出失败
6.Servlet
6.1servlet简介
Servlet是sun公司开发动态web的一门技术
sun在这些API中提供的一个接口叫servlet
如果开发一个servlet程序 两个步骤
1.编写一个类 实现servlet接口
2.把开发好的Java类部署到web服务器中
把实现了Servlet接口的Java 程序 叫做Servlet
6.2 HelloServlet
servlet接口 sun公司有两个默认的实现类:httpServlet,GenericServlet
编写一个Servlet程序:1.编写一个普通类2.继承HttpServlet
编写Servlet映射:我们写的是Java 程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以需要在web服务器中注册我们写的servlet,还需要提供一个浏览器能够访问的路径
6.3 servlet原理
(我们编写的Servlet并不是直接运行,而是由Web服务器加载后创建实例运行,所以,类似Tomcat这样的Web服务器也称为Servlet容器。)
servlet是由web服务器调用,web服务器在收到浏览器请求之后
request会从servixe(请求)拿到请求,并且把请求之后的响应交给response
6.4 mapping
<!-- 可以自定义后缀实现请求映射 *前不能加项目映射的路径-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.kuang.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
一个Servlet可以执行一个、多个、通用映射路径
优先级问题:指定了固有的映射路径优先级最高,如果找不到就会走默认的
6.5 ServletContext
web容器在启动的时候,它会为每个web程序创建一个对应的servletContext对象,代表了当前的web应用
1.共享数据
建一个放置数据的类
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = "zzj";
context.setAttribute("username",username);
}
}
一个读取数据的类
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = (String) context.getAttribute("username");
resp.setCharacterEncoding("UTF-8");
resp.getWriter().print(username);
}
}
配置web.xml文件
<servlet>
<servlet-name>getc</servlet-name>
<servlet-class>com.learning.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getc</servlet-name>
<url-pattern>/getc</url-pattern>
</servlet-mapping>
2.获取初始化参数
在web.xml中配置
<servlet>
<servlet-name>gp</servlet-name>
<servlet-class>com.learning.servlet.ServletDemo3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>gp</servlet-name>
<url-pattern>/gp</url-pattern>
</servlet-mapping>
在类中获取
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
resp.getWriter().print(url);
}
}
3.请求转发
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("进入了Sd4");
ServletContext context = this.getServletContext();
context.getRequestDispatcher("/gp").forward(req,resp);
}
4.读取资源文件
Properties
-
在java目录下新建properties
-
在resources目录下新建properties
发现:都被打包到了同一个路径下:classes 俗称类路径classpath
思路:需要一个文件流public class ServletDemo05 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { InputStream is = this.getServletContext().getResourceAsStream("WEB-INF/classes/com/learning/servlet/aa.properties"); Properties prop = new Properties(); prop.load(is); String username = prop.getProperty("username"); String password = prop.getProperty("password"); resp.getWriter().print(username + ":" + password); } }
6.6 HttpServletResponse
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表相应的HttpServletResponse对象
常见应用:
1.向浏览器输出消息
2.下载文件
-
获取下载文件的路径
-
下载的文件名
-
设置浏览器能够支持我们需要的东西
-
获取下载文件的输入流
-
创建缓冲区
-
获取OutputStream对象
-
将FileOutPutStream流写入到buffer缓冲区
-
使用OutPutStream将缓冲区中的数据输出到客户端
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String realPath = "E:\\code\\test\\response\\src\\main\\resources\\1.png"; System.out.println("下载文件的路径"+realPath); String fileName = realPath.substring(realPath.lastIndexOf("\\")+1); resp.setHeader("Content-Disposition","attachement;filename="+fileName); FileInputStream in = new FileInputStream(realPath); int len = 0; byte[] buffer = new byte[1024]; ServletOutputStream out = resp.getOutputStream(); while((len = in.read(buffer)) > 0){ out.write(buffer,0,len); } in.close(); out.close(); }
6.7 HttpServletRequest
httpServletRequest代表客户端的请求,用户通过http协议访问服务器,Http请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息。
**获取前端参数,请求转发 **
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobbys = req.getParameterValues("hobbys");
//resp.sendRedirect();重定向
//this.getServletContext();转发
//请求转发
req.getRequestDispatcher("/success.jsp").forward(req,resp);
}
重定向和转发的区别
相同点
--页面都会实现跳转
不同点
--请求转发的时候 url不会发生变化;307
-- 重定向的时候 url地址栏会发生变化;302