小白学习java第16天(上): javaWeb
0.背景介绍
1.前言
首先我们需要javaweb里面的大概流程是干什么的,怎么才能实现的?,每一部分是靠什么进行的?以及背后实现的功能是干什么的?。。。。对于我来说要是不解决这些,会让我感觉不踏实!
首先既然是web开发,那么就是势必需要对于页面进行处理,你打开一个网站上面会出现两部分,一部分就是静态的网页(html,css,js)所有人都可以看到的页面!如百度的官网页面;但是另外一部分就是动态web,你要是进行登录就是呈现每个人都不一样的页面,(技术栈就是servlet,jsp,PHP。。),即:提供给所有人的数据始终会发生变化,每个人在不同的时间,不同的地点看到的信息各有不同!,动态web资源开发的技术统称为javaweb!
2.web应用程序
web应用程序:可以提供浏览器的访问程序。(需要理解就是我们能访问到的任何一个页面或者资源,都存在于这个世界某个角落的计算机上)
(不知道大家有没有和我一样的,服务器到底是什么呢,是一个计算机吗?)
这里就需要介绍tomcat服务器,tomcat可以理解为一个专门运行java网站程序的容器,它好像网站的“管家”,负责协调协调和管理用户访问网站的各种操作!那么里面真正进行处理执行的是什么呢?
1.环境搭建
1.1.Tomcat
1.1.1安装Tomcat
tomcat官网
tomcat下载,我下载是第9版本的!(64位的window)
1.1.2开始启动和关闭tomcat
这里有一个小细节就是你的端口号8080是不是被占用了,怎么判断是不是被占用了?
步骤:
1.打开cmd,查看端口号*(去任务管理器的服务中查看)
2.确实被我自己的浏览器服务占用,因此我们需要改端口号
3.然后我们就去tomcat文件夹下面去找config,里面的server文件,将里面的端口号进行修改,我改的是8081端口(最后搜一下就能出现小猫就算成功!!! )
然后就会出现(下面这个界面)
(那么为什么会这样的?)
首先我们看tomcat里面的配置文件下面的config文件里面的server配置
(端口号!)
(里面的执行文件)就是默认的去webapp里面去找,默认的里面的文件夹root
=========================================================================
回答网站是如何进行访问的???
1.输入域名,回车!
2.检查本机的C:\Windows\System32\drivers\etc\hosts配置文件有没有这个域名映射;
2.1有,直接返回对应的ip地址,这个地址中,有我们需要访问的web程序,可以直接访问
2.2 没有;去DNS服务器找,找到的话就返回,找不到就返回找不到!
流程图如下:
=========================================================================
1.2.Maven
1.2.1我们为什么需要学习maven?
javaweb在开发中需要使用大量的jar包,手动的就太麻烦了,我觉得python简单是因为他可以使用自动导包很舒服,因此maven诞生!,他是一个工具他是一个架构的管理工具。
maven的核心思想就是:约定大于配置。maven会规定好你该如何编写java代码!
1.2.2maven的下载安装和使用(我用的是3.6.3版本的)
打开官网进行下载:https://maven.apache.org/download.cgi
1.2.3配置环境:(老套路)
1.M2_HOME Maven目录下的bin目录
2.MAVEN_HOME Maven的目录
3.在系统中path配置 %Maven_HOME%/bin
测试:
1.2.4阿里云镜像:
修改一下镜像,因为访问国外的比较慢,因此我们需要镜像mirrors :加速我们的下载!
在config文件里面的setting里面找到mirrors里面进行!(下载下面这个代码!)
<!--下面是配置内容--><mirror><id>nexus-aliyun</id><mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url></mirror>
1.2.5本地仓库
建立一个本地的仓库,创建一个文件夹maven-repo
然后再配置文件中添加配置:
1.2.6在idea中使用maven
网上有很多类似的资料进行解释https://www.cnblogs.com/bjynjj/p/18494523,可以详细参考这个
run里面显示这个就算成功了!(我们是勾选了web的框架模版的)
3.写第一个servlet程序
3.1编写一个servlet程序
首先我们需要知道servlet这个接口,然后再看他实现类
大概流程图就是
实现的代码:
public class HelloServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("响应!");PrintWriter writer = resp.getWriter();//响应流writer.print("hello servlet");}
}
那你现在写了java程序,怎么执行呢!我们的浏览器里面需要输入什么就可以显示这个呢?
代码:
<!-- 配置servlet --><servlet><servlet-name>hello</servlet-name><servlet-class>com.xcl.servlet.HelloServlet</servlet-class></servlet><!-- 配置servlet映射 --><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping>
然后就是在idea中启动tomcat!(按照上面进行配置就行!)
3.
3.2servlet的原理:
3.3web.xml中的mapping映射
一个请求指定一个映射路径
一个请求指定多个映射路径
<!-- 配置servlet --><servlet><servlet-name>hello</servlet-name><servlet-class>com.xcl.servlet.HelloServlet</servlet-class></servlet><!-- 配置servlet映射 --><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello1</url-pattern></servlet-mapping>
一个请求指定通用的映射路径
<!-- 配置servlet --><servlet><servlet-name>hello</servlet-name><servlet-class>com.xcl.servlet.HelloServlet</servlet-class></servlet><!-- 配置servlet映射 --><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/*</url-pattern></servlet-mapping>
一个请求指定通用后缀映射路径-
<!-- 配置servlet --><servlet><servlet-name>hello</servlet-name><servlet-class>com.xcl.servlet.HelloServlet</servlet-class></servlet><!-- 配置servlet映射 --><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello/*</url-pattern></servlet-mapping>
3.3ServletContext对象,这就是我们之后要操作的对象
就是我们不同servlet之间怎么进行通信呢?这就需要一个中间商进行之间的传递!
3.3.1代码演示(共享数据):
先是上传到上下文:
public class HelloServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext servletContext = this.getServletContext();//获得上下文String username = "张三";servletContext.setAttribute("username", username);//传入到上下文里面System.out.println("hello,响应完成!");}
}
然后从上下文进行取出来:
public class GetServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext servletContext = this.getServletContext();//获得上下文String username = (String) servletContext.getAttribute("username");//获取上下文里面的内容resp.setContentType("text/html;charset=utf-8");PrintWriter writer = resp.getWriter();writer.print("名字:" + username);}
}
3.3.2(请求转发,url是不会变的)
(这样是不是比较麻烦啊,我还需要在网页上面进行手动输入getC,因此我们需要再hello里面进行转发)
public class HelloServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext servletContext = this.getServletContext();//获得上下文String username = "张三";servletContext.setAttribute("username", username);//传入到上下文里面System.out.println("hello,响应完成!");RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/getC");//进行转发requestDispatcher.forward(req, resp);}
}
为什么url不变,那就需要我们知道转发和跳转有哪些不一样
3.4读取配置文件
配置文件放在资源目录下面!
package com.xcl.servlet;import com.sun.xml.internal.stream.buffer.sax.Properties;import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;public class ServletDemo01 extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//读取流servletContext流文件InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");//properties读取java.util.Properties properties = new java.util.Properties();properties.load(resourceAsStream);String user = properties.getProperty("username");String password = properties.getProperty("password");System.out.println("user:"+user);System.out.println("password:"+password);resp.getWriter().print(user + ":" + password);}
}