文章目录
概念
Web应用程序
-
web应用程序,可以提供浏览器访问的程序
-
一个Web应用有多个部件(静态web、动态web)
- html、css、js
- jsp、servlet
- jar包,配置文件properties
静态Web
- 静态web:与用户不交互,js伪动态。
- 客户端通过请求web service资源,然后web service回复给客户端一个资源
动态Web
-
动态web:与用户交互,动态交换信息,例如和数据库交互。
-
客户端 --(Request)–> WebServer Plugin --> jsp/Servlet --> web service -(Response)->客户端
技术—服务器
ASP:
- 微软:国内最早流行的ASP。服务器是IIS
- 在Html中嵌入VB脚本,ASP+COM。在html中有java代码
- ASP:一个基本页面几千行代码,页面混乱,维护成本大
- C#,
PHP:
- php开发快,功能强大,跨平台,代码简单。服务器是apache
- 无法承载大访问量(双11不可以)
JSP/Servlet:
- SUN公司主推B/S架构,基于java语言。服务器是tomcat
- 可以承载三高(高并发,高可用,高性能)
- 语法类似与ASP 。ASP --> JSP (快速占领市场)
Tomcat服务器
安装tomcat
- apache下载binary:apache-tomcat-9.0.58
- 启动bin/startup.bat。
- 如果cmd启动:
CATALINA_HOME
和path:%CATALINA_HOME%bin
- 乱码问题 —> conf\logging.properties中ConsoleHandler.encoding 设置为GBK
配置
- \webapps\ROOT中index.jsp可以改变首页localhost:8080的内容
- config配置中server.xml可以改变8080到其他端口7777。localhost:7777
- C:\Windows\System32\drivers\etc中hosts可以增加主机名www.adair.com映射到127.0.0.1(
无#
) ipconfig/flushdns
- 默认端口号:tomcat:8080、http80、https443、mysql3306
访问页面
- 在webapps中添加adair文件夹(模仿ROOT,留下WEB-INF),增加一个index.html文件(写入内容)
- localhost:8080所有访问默认都是
webapps
下的:- localhost:8080:访问webapps中的ROOT文件夹
- localhost:8080/adair/index.html 可以直接访问自己 index.html的内容
- localhost:8080/docs/
- localhost:8080/example 好多别人写的例子
--webapps :Tomcat服务器的web目录
-ROOT
-adair :网站的目录名
-WEB-INF
-web.xml :网站配置文件
-classes :java程序
-lib :web所依赖的包
-index.html :默认首页
-static
-css
-style.css
-js
-img
-....
HTTP
概念
-
HTTP(80,https443)是一个简单请求相应协议,运行在
TCP
之上 -
文本:HTML,字符串。
-
超文本:图片,音频,视频,定位,地图
-
http1.0:客户端与web服务器tcp连接一次,只可以获得一个web资源,断开连接
-
http1.1:客户端与web服务器tcp一次连接,可以获得多个web资源
request
- general
Request URL: https://www.baidu.com/ //请求url
Request Method: GET //请求方法
Status Code: 200 OK //状态码
Remote Address: 39.156.66.14:443 //远程地址
-
请求方式:
get
:内容少,不安全,速度快。post
:多,安全,慢 -
request
Accept: text/html //告诉浏览器,支持的数据类型
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: keep-alive
response
- response内容
Cache-Control: no-cache
Connection: keep-alive
Content-Encoding: gzip //编码
Content-Type: text/html;charset=utf-8 //类型
响应状态码:
- 2xx:响应成功 200
- 3xx:重定向
- 4xx:找不到资源 404
- 5xx:服务器代码错误 502(网关错误)
Maven
Maven概念
-
Maven核心思想:约定大于配置。
-
环境变量:
MAVEN_HOME
:apache-maven-3.6.1。M2_HOME
:apache-maven-3.6.1\bin -
path:%MAVEN_HOME%\bin
镜像&仓库
- 建议使用阿里云的镜像(加速包的下载) 仓库设置
#conf\settings.xml
<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>
<localRepository>D:\Environment\apache-maven-3.8.5\maven-repo</localRepository>
新建项目
- 点maven进行创建选择maven-archetype-webapp
模版生成
- 选择
maven\bin
环境,setting.xml
和maven-repo
创建。 - 在src/main下新建java,resources。mark directory as……(也可在struct中的project中)
连接Tomcat服务器
- 点击add config……
- 增加一个tomcat(local),设置相应的信息,然后进行deploy(处理warning)增加javaweb-01-maven:war
- 为什么有warning?因为我们访问一个网站,需要一个指定的文件夹名字
- 在进行deploy配置时,Application context默认的路径是localhost:8080。假如写了一个localhost:8080/adair,那这就是它访问的路径。叫做虚拟路径映射
- 然后进行运行tomcat右方的三角,会出现hello world!
- 点击右边maven下的
- Lifecycle maven的命令行操作。点击clean可以删除文件夹target
- plugins 插件可以删除
- Dependencies 项目依赖的jar包
pom.xml内容
-
jar:java应用。war:javaweb应用
-
dependencies中的版本报错,直接在右侧的maven面板刷新即可
-
mvn的高级之出:自动导入jar包所需要的其他jar包。mvnrepository.com中可以找Spring Web MVC然后复制下面的dependencies
<dependencies>
<!--具体的jar包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--maven会为你自动导入这个jar包所依赖的其他jar包-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.19.RELEASE</version>
</dependency>
</dependencies>
- 在External libraries可以看到jar包
maven树
idea右侧的maven可以点show dependencies可以生成树结构图
配置web.xml
- 从tomcat中选择webapps\ROOT\WEB-INF选择web.xml。选择全部,复制到idea的web.xml中,和tomcat保持一致(web2.0 --> web4.0)
- 在src下新建java(设置为source)和source(设置为resource)。推荐在project struct的module
Servlet
简介
-
servlet就是sun公司开发的动态web技术
-
sun公司在这些api中提供了一个接口叫做:servlet。如果想开发一个servlet小程序,两个步骤
- 编写一个类,实现servlet接口
- 把开发好的java类部署到web服务器上
-
把实现servlet接口的java程序,叫做servlet
HelloServlet
-
.idea
是idea的配置文件,.iml
是idea的识别文件。都不可删除,src可以删除(父类) -
关于Maven的父子,可以在project中创建module(创建maven)。类似与java中的子类继承父类(子类可用父类,父类不可用子类)。可以各自的
pom.xml
文件显示父子关系 -
在子类中手动增加src\main中的java和resource
-
maven结构优化
- 修改web.xml中为最新的版本(tomcat的webapps\root文件web.xml)
修改web.xml
<?xml version="1.0" encoding="utf-8" ?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
</web-app>
编写一个普通的servlet程序
- 父maven的pom.xml。父有子
<modules>
<module>servlet-01</module>
</modules>
- 子maven的pom.xm。子有父
<parent>
<artifactId>javaweb-02-servlet</artifactId>
<groupId>com.adair</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
servlet
→ genericservlet
→ httpservlet
→ myservlet
映射&配置tomcat
- 我们写的是java程序,但要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web.xml中配置映射(浏览器访问的url地址 --> com.adair.servlet.HttpServlet),而配置url需要配置tomcat
#web.xml
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.adair.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
-
优先级:固定路径 > 通配符路径
-
转发
public class ServletDemo04 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
System.out.println("进入sd4");
RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp");//demo3的请求路径
requestDispatcher.forward(req,resp);
}
}
共享数据
- 先s2/hello把username加载到共同的servletcontext中,s2/getc才可以取得
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = "庆林";
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.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print("名字"+username);
}
}
public class ServletDemo03 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);
}
}
================================================================
#web.xml
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
<servlet>
<servlet-name>gp</servlet-name>
<servlet-class>com.adair.servlet.ServletDemo03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>gp</servlet-name>
<url-pattern>/gp</url-pattern>
</servlet-mapping>
读取资源
Properties
- 在java中新建.properties,需要在web.xml中build进行设置
- 在resource中新建.properties
我们称之为classpath
#db.properties
username=root
password=123456
=============================================
public class ServletDemo05 extends HttpServlet { //记得web.xml的配置
@Override
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);
resp.getWriter().print(password);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
HttpServletResponse
resp.getwrite.print()
下载文件
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String realPath = "C:\\Users\\Adair\\Desktop\\庆林.png";
String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);//得到文件名
System.out.println("文件的路径"+realPath);
//设置浏览器能够支持我们下载的东西
resp.setHeader("Content-disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
FileInputStream fis = new FileInputStream(realPath);
ServletOutputStream os = resp.getOutputStream();
int len=0;
byte[] buffer = new byte[1024];
while ((len=fis.read(buffer))!=-1){
os.write(buffer,0,len);
}
fis.close();
os.close();
}
}
验证码
public class ImageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//3s自动刷新
resp.setHeader("refresh","3");
BufferedImage image = new BufferedImage(500, 100, BufferedImage.TYPE_INT_RGB);
Graphics2D g =(Graphics2D) image.getGraphics();
g.setColor(Color.white);
g.fillRect(0,0,500,100);
g.setColor(Color.blue);
g.setFont(new Font("宋体",Font.BOLD,20));
g.drawString(makeNum(),0,20);
//告诉浏览器,用请求的方式打开
resp.setContentType("image/jpeg");
//网站存在缓存,不让浏览器缓存
resp.setDateHeader("expires",-1);
resp.setHeader("Cahce-Control","no-cache");
resp.setHeader("Pragma","no-cache");
//图片写给浏览器
ImageIO.write(image,"jpg",resp.getOutputStream());
}
private String makeNum(){
Random random = new Random();
String num = random.nextInt(9999999) + "";
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 7-num.length(); i++) {
sb.append("0");
}
return sb.toString() + num;
}
}
重定向
- 一句足以
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// resp.setHeader("Location","/resp/img");
// resp.setStatus(302);
resp.sendRedirect("/resp/img");
}
}
- req中带有账号,resp回复账号
#index.jsp
<form action="${pageContext.request.contextPath}/login" method="get" >
用户名: <input type="text" name="username"> <br>
密码: <input type="password" name="password"> <br>
<input type="submit">
</form>
//web.xml映射login到HttpServlet
public class RequestTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("进入这个请求");
String username = req.getParameter("username");
String password = req.getParameter("password");
resp.getWriter().print(username);
resp.getWriter().print(password);
resp.sendRedirect("/resp/success.jsp");
}
}
HttpServletRequest
通过这个request可以获得用户的信息
<form action="${pageContext.request.contextPath}/login" method="post">
用户: <input type="text" name="username"> <br>
密码: <input type="password" name="password" > <br>
爱好:
<input type="checkbox" name="hobbys" value="女孩">女孩
<input type="checkbox" name="hobbys" value="代码">代码
<input type="checkbox" name="hobbys" value="创建">创建
<input type="checkbox" name="hobbys" value="成功">成功
<input type="submit">
</form>
=========================================
public class LoginServlet extends HttpServlet {
@Override
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");
System.out.println("=======================");
System.out.println(username);
System.out.println(password);
System.out.println(Arrays.toString(hobbys));
//转发 这里的/ 代表当前的web应用
req.getRequestDispatcher("/success.jsp").forward(req,resp);
// resp.sendRedirect("req/success.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- 转发307。重定向302
Session、Cookie
会话
- 可以理解为一次交谈
- 有状态会话:记录你来过
一个网站如何证明你来过
- 客户端操作
- 服务端操作
两种会话技术
- cookie客户端技术
- session服务器技术
Cookie
public class CookieDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
Cookie[] cookies = req.getCookies();
if(cookies!=null){
out.write("你上一次访问的时间是:");
for (Cookie cookie : cookies) {
if(cookie.getName().equals("lastLoginTime")){
long l = Long.parseLong(cookie.getValue());
Date date = new Date(l);
out.write(date.toLocaleString());
}
}
}else {
out.print("这是你第一次访问本站");
}
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
cookie.setMaxAge(24*60*60);
resp.addCookie(cookie);
}
}
=====================================让上面的cookie存活期为0s
public class CookieDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
cookie.setMaxAge(0);
resp.addCookie(cookie);
}
}
- 一个cookie只能保存一个信息name:value
public class SessionDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
HttpSession session = req.getSession();
session.setAttribute("name","庆林");
String id = session.getId();
if(session.isNew()){
resp.getWriter().write("session创建成功,ID="+id);
}else {
resp.getWriter().write("session已经存在,ID="+id);
}
}
}
=================================================
public class SessionDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
HttpSession session = req.getSession();
String name = (String) session.getAttribute("name");
System.out.println(name);
}
}
================================================================