JavaWeb

概念

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.xmlmaven-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);
    }
}

================================================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值