JavaWeb入门到实战[狂神]-1

web基本概念

1.1
web开发:
web:网页的意思www.baidu.com
静态web
html.css(提供给所有人看的数据,不会变化)
动态web
提供给所有人的数据始终会发生变化 ,不同的时间,不同地点数据都不一样
技术栈:Servlet/JSP ,ASP ,PHP
在java中,动态web资源开发的技术统称为javaweb

1.2
web应用程序
web应用程序,可以提供给浏览器访问的程序:
1、a.html\b.html..多个web资源 ,这些资源可以被外界访问
2、访问的每一个页面或资源,都存在于世界上某一个角落的计算机
3、URL
4、这些统一web资源会被放在同一个文件夹,它就是web应用程序---》例如:Tomcat服务器
5、一个web应用由多部份组成(静态web,动态web)
--html,css,js
--jsp,servlet
--java程序
--jar包
--配置文件(Properties)
web应用程序编写完毕后,若想提供给外界访问,需要一个服务器来统一管理

1.3静态web
html\htm都是网页的后缀,如果服务器上存在这些东西,我们就可以直接进行读取

缺点:
1、web页面无法动态更新,所有用户看到都是一个页面,所以为了能动起来(伪动态),用轮播图,点击特效,javaScript(实际开发),VBScript
2、无法和数据库交互(数据无法持久化,用户无法交互)
1.4动态web
页面动态展示,展示效果因人而异

缺点:
1、假如服务器动态web资源出现了错误,要重新编写后台程序,重新发布-停机维护
优点:
1、可以动态更新
2、可以和数据库交互(数据可以持久化:注册,商品信息,用户信息)

web服务器

技术讲解
ASP
--微软:国内最早流行
--在HTML中加入了VB的脚本,ASP+COM
--在ASP开发中,基本一个页面,有几千行的业务代码,维护成本高
--IIS

JSP/Servlet
--sun公司,主推的B/S架构
--基于JAVA语言,所有的大公司,或者一些开源的组件,都是用JAVA
--可以承载三高带来的影响(高并发,高可用,高性能)
--语法像ASP

PHP
--开发速度快,功能很强大,跨平台,代码简单
--无法承载大访问量

web服务器

服务器是一种被动的操作,用来处理用户的一些请求和给用户一些响应
IIS
--微软:ASP,在window中自带的

Tomcat

--servlet\jsp

Tomcat

常见问题:
1、JAVA环境变量没有配置
2、闪退:需要配置兼容性
3、乱码问题:配置文件设置

服务器配置文件:conf/server.xml
--可以配置端口号:8080

--可以配置主机名称
默认的主机名:localhost-->127.0.0.1
默认网站应用存放的位置:webapps,8080默认是进入webapps-ROOT文件
--webapps:Tomcat服务器的web目录
--ROOT
--JJF:网站的目录名
--web-INF(一般放网站程序)
--class:java程序
--lib:web应用所依赖的jar包
--web.xml:网站的配置文件
--index.html
--static
--css
--js
--img

Http讲解

http(超文本传输协议)是一个简单的请求-响应协议,通过运行在TCP之上
--文本:html,字符串
--超文本:图片,音乐,视频,定位
--80
https:安全的
--443

HTTP请求
1、请求行
请求行中的方式:GET
请求方式:GET/POST,
---get:请求携带的参数比较少,大小有限制,会在浏览器显示数据内容,不安全,但高效
---post:和get相反
2、请求头

HTTP响应
1、响应体

2,响应状态码
200,请求成功
3XX:请求重定向
4XX:找不到资源
5XX:服务器代码错误 502:网关错误

Maven

目前用来就是方便导入jar包
Maven核心思想:约定大于配置
--有约束,不要去违反
--会规定你要如何去编写我们的java代码,要按照这个规范

注意,IDEA是有带maven插件,如果不在idea改启用maven的配置的话,是会将仓库放到默认地址C盘,如果确实要用idea的maven的话,要换镜像,要去idea的maven插件文件改配置表,如果要用自己安装的maven,先在配置里面改manven的启动来源,再建立maven项目,重点,改配置不要在设置那里改,在新建项目设置-为新项目设置,这里改maven的配置,不然每次新建项目又会恢复回idea自带的maven

1\下载安装
2、配置环境变量
3、阿里云仓库
4、本地仓库
--本地仓库,远程仓库
先改IDEA配置,再建项目

创建一个原生的maven项目

标记文件夹
文件夹右键-将目录标记为

配置tomcat
运行-编辑配置

pom.xml就maven的核心配置表

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <!-- 上面是MAVEN的版本和文件 -->
  <!-- 下面是配置的GAV -->
  <groupId>org.example</groupId>
  <artifactId>maventest2</artifactId>
  <!-- 下面是包的打包方式,war包是java web的打包方式,jar包是java应用的打包方式 -->

  <packaging>war</packaging>

  <version>1.0-SNAPSHOT</version>
  <name>maventest2 Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <!-- 这里是项目的依赖信息 -->
  <dependencies>
    <!-- 依赖的jar包 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <!-- 这里是项目的构建信息 -->
  <build>
    <finalName>maventest2</finalName>
  </build>
</project>

如果建立一个干净的项目,pom.xml表是没有依赖的信息的,此时右边maven也没有任何依赖项,如果xml写了依赖的信息,右边就会有
maven的高级之处在于它能导入这个jar包所依赖的其他jar包

由于Maven是约定大于配置,有时可能在把文件放在不规定的文件中会导致导出不了,这时要在配置文件中,更新下buildr的信息

Servlet

-servlet是sun公司开发动态web的一门技术
-sun公司在这些API提供了一个接口叫servlet,如果你想开发一个servlet程序,只需要完成两个步骤
1,编写一个类,实现servlet接口
2,把开发好的java类部署到web服务器
把实现servlet接口的java程序(java类)叫做servlet

HelloServlet

1,构建一个maven项目,删除src,在这个项目建立Moudel(模块),这个空的工程就是主工程,在里面建立子maven
导入javax.servlet-api和javax.servlet.jsp,两个maven依赖,如果xml文件报红,要加上标签
2、关于maven父子工程的理解
--父项目xml会有

 <modules>
        <module>servlet-01</module>
    </modules>

--子项目xml会有

<parent>
        <groupId>com.cjj</groupId>
        <artifactId>javaweb-02-servlet</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

父项目的java包,子项目可以直接使用

3、Maven环境优化
--修改web.xml为最新的,用tomcat的xml
--将maven的结构搭建完整,加一个java文件夹
4、编写一个servlet程序
--编写一个普通类
--实现servlet接口,这里直接继承httpServlet,GenericServlet 这里是直接写好的类已经继承了servlet接口

package com.jj.servlet;

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.PrintWriter;

public class HelloServlet extends HttpServlet {
    //由于get和post只是请求实现的不同方式,可以相互调用,业务逻辑都一样
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();
        writer.println("hello Servlet");
        
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

5、编写Servlet的映射
为什么需要映射,我们写的是java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们要在web服务中注册我们写的servlet,还需要给他一个目标浏览器能够访问的路径
就是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">
<!--注册Servlet,class就是java中的servlet类-->
  <servlet>
  <servlet-name>HelloServlet</servlet-name>
  <servlet-class>com.jj.servlet.HelloServlet</servlet-class>
  </servlet>
  <!--注册Servlet请求路径-->
  <servlet-mapping>
  <servlet-name>HelloServlet</servlet-name>
  <url-pattern>/hello</url-pattern>
  </servlet-mapping>

6、配置tomcat



注意:配置项目发布的路径就可以了
7、启动测试

Servlet原理

servlet是由web服务器调用,web服务器在收到浏览器的请求之后

Mapping问题

配置web-xml文件
1、一个servlet可以指定一个映射路径、

 <servlet-mapping>
  <servlet-name>Hello</servlet-name>
  <url-pattern>/hello</url-pattern>
  </servlet-mapping>

2、一个servlet可以指定多个路径

 <servlet-mapping>
  <servlet-name>Hello</servlet-name>
  <url-pattern>/hello1</url-pattern>
  </servlet-mapping>
 <servlet-mapping>
  <servlet-name>Hello</servlet-name>
  <url-pattern>/hello2</url-pattern>
  </servlet-mapping>

3、一个servlet可以指定通用映射路径

 <servlet-mapping>
  <servlet-name>Hello</servlet-name>
  <url-pattern>/hello/*</url-pattern>
  </servlet-mapping>

4、默认请求路径
/什么都不写会默认走这个请求,不走首页了,会走这个请求,尽量不写
5、自定义后缀实现请求映射
.haah不过前面是什么/,只要是以.haah结尾,都会走这个请求
6、优先级问题
指定了固定有映射路径优先级最高,如果找不到就会走默认的处理请求
像404也是可以指定请求页面,然后用/*表示路径,如果没页面,请响应指定的页面

ServletContext-共享对象

web容器(tomcat)启动的时候,它会为每个web程序创建一个对应的servletContext对象,代表当前的web应用:

相当于servletContext成为了可以共享的对象,你可以往一个java程序中的servletContext放东西,从另一个java程序取出来
第一步:往一个java程序中的sevletContext放东西

package com.jj.servlet;

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;

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Hello ");
       //this.getInitParameter(); 初始化参数
        //this.getServletConfig(); 获取Servlet配置信息
       //this.getServletContext(); servlet上下文
        ServletContext context = this.getServletContext();
        String username="cccccj";//数据
        context.setAttribute("username", username);//将一个数据存入到ServletContext中,名字为username,值为ccccc
    }
}

第二步,往一个java程序中的sevletContext取东西

package com.jj.servlet;

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;

public class GetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String username = (String) context.getAttribute("username");
        response.setContentType("text/html");
        response.getWriter().println("Welcome " + username + "!");
    }
}

第三步:配置好web-xml文件,当访问GetServlet所对应的路径时,就能用于访问HelloServle丢进去的内容

<?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">

  <display-name>Archetype Created Web Application</display-name>

        <!--注册Servlet,class就是java中的servlet类-->
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.jj.servlet.HelloServlet</servlet-class>
</servlet>
        <!--注册Servlet请求路径-->
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
  <servlet>
    <servlet-name>getc</servlet-name>
    <servlet-class>com.jj.servlet.GetServlet</servlet-class>
  </servlet>
  <!--注册Servlet请求路径-->
  <servlet-mapping>
    <servlet-name>getc</servlet-name>
    <url-pattern>/getc</url-pattern>
  </servlet-mapping>
</web-app>

ServletContext-获取初始化参数

先在web-xml定义参数

<!--配置一些web应用初始化参数-->
  <context-param>
<param-name>url</param-name>
  <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
  </context-param>
  <display-name>Archetype Created Web Application</display-name>

定义一个类,然后注册到web.xml可以访问

public class ServletDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String url = context.getInitParameter("url");
        response.getWriter().println("url: " + url);
    }
}

ServletContext-请求转发

访问时跳到另一个页面,但是路径不会变
不像重定向,重定向路径会变

上面是请求转发原理
下面是重定向

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;

public class ServletDemo04 extends HttpServlet {

    @Override
    public void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
        ServletContext context = this.getServletContext();
        System.out.println("ServletDemo04 进入了");
        RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp");//转发的请求路径,demo03的请求路径
        requestDispatcher.forward(request, response);//调用forward实现请求转发


    }
}

ServletContext-读取资源文件

在java中配置了resources但是发现没被打包,可以在配置文件中加上

<!--在build中配置resources,来防止我们资源导出失败的问题-->
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

配置完可以先clean,然后再重启一下tomcat
就会发现target中class有properties文件,需要从target读取资源文件

package com.jj.servlet;

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;
import java.util.Properties;

public class ServletDemo05 extends HttpServlet {
    @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 user = prop.getProperty("username");
        String password = prop.getProperty("password");
        resp.getWriter().println("Username: " + user + password);

HttpServletResponse

web服务器接收到客户端的请求,针对这个请求,分别创建一个代表请求的httpservletrequest对象,代表响应的一个httpservletresponse

--如果要获取客户端请求过来的参数:找httpservletquest(会将客户端的响应信息封装到这个对象中,如果需要对象的信息就用它的方法

--如果要给客户端响应一些信息:找httpservletresponse(如果要向浏览器响应的信息,用这个对象封装好信息进行响应

1,简单分类
负责向浏览器发送数据的方法
负责给浏览器发送响应头的方法

2、常见应用
向浏览器输出消息(上面的案例)
下载文件
--要获取下载文件的路径
--下载的文件名是啥
--设置想办法让浏览器支持下载我们需要的东西
--获取下载文件的输入流
--创建缓冲区
--获取outputstream对象
--将fileoutputstream流写入到buffer缓冲区
--使用Outputstream将缓冲区中的数据输出到客户端

t javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;

public class FileServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        --要获取下载文件的路径
        String realPath = "D:\\learn\\idea\\javaweb-02-servlet\\response\\target\\response\\WEB-INF\\classes\\1.png";
        System.out.println("下载文件的路径:"+realPath);
//                --下载的文件名是啥


        String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
//                --设置想办法让浏览器支持下载我们需要的东西
        resp.setHeader("Content-Disposition", "attachment;filename="+fileName);
//                --获取下载文件的输入流
        FileInputStream in = new FileInputStream(realPath);
//                --创建缓冲区
        int len = 0;
        byte[] buffer = new byte[1024];
        //                --获取outputstream对象
        ServletOutputStream out = resp.getOutputStream();
        //                --将fileoutputstream流写入到buffer缓冲区
//                --使用Outputstream将缓冲区中的数据输出到客户端
        while((len=in.read(buffer))>0){
            out.write(buffer,0,len);
        }
        in.close();
        out.close();



    }
}

生成验证码

实现重定向
一个web资源收到客户端请求后,会通知客户端去访问另一个web资源,这个过程叫重定向
不同上面的转发,转发是web资源自动转,不会跳其它链接

常见场景:
--用户登录

package com.cjf.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect("r/down");
    }
}

重定向和转发的区别
相同点:页面都会实现跳转
不同点:请求转发时候,URL不会变化;重定向,链接会发生变化
404说明是找不到页面资源,500是说明代码有问题了

定义一个登陆主页请求到后台,同时实现重定向
web.xml记得加上servlet的地址

<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
<h2>Hello World!</h2>
<form action="${pageContext.request.contextPath}/login" method="get">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    <input type="submit" value="登录">
</form>
</body>
</html>
package com.cjf.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class RequestTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username + " " + password);
resp.sendRedirect("test.jsp");
    }


    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}



HttpServletRequest

HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息;

1、获取请求的参数,请求转发

package com.cjf.www;

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.util.Arrays;

public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
       String[] hobbys = req.getParameterValues("hobbys");
       System.out.println(username);
       System.out.println(password);
       System.out.println(Arrays.toString(hobbys));
       //通过请求转发
        //这里的/是指当前web应用
        req.getRequestDispatcher("/success.jsp").forward(req, resp);

    }
}
posted @ 2025-03-16 21:10  乘加法  阅读(26)  评论(0)    收藏  举报