JavaWeb基础一

JavaWeb

IDEA 快捷键:

  • 导包:alt + enter
  • 看方法的具体:ctrl + b /鼠标左键
  • 重写 父类方法:ctrl + o
  • 补充左边代码:ctrl + alt + v 或 alt + enter
  • 代码规范:ctrl + alt + l
  • :alt + insert
  • 注释:Ctrl + / 或 Ctrl +Shift+ /

基本

  • 新的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>
            <servlet-name>login</servlet-name>
            <servlet-class>com.requst.test.loginServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>login</servlet-name>
            <url-pattern>/login</url-pattern>
        </servlet-mapping>
    
  • maven依赖包 pom.xml

            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
                <scope>test</scope>
            </dependency>
        
        <!--  jsp-api:项目依赖-->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
            <scope>provided</scope>
        </dependency>
    
  • 编码和解码

    // string 编码为 utf-8
    URLEncoder.encode("string","utf-8");
    // string 解码为 utf-8
    URLDecoder.decode("string","utf-8");
    

1. 基本概念

1.1 前言

web开发

  • 静态web
    • html,css
    • 页面不会发生改变
  • 动态web
    • 技术栈:Servlet/jsp。。。
    • 数据会始终发生改变,不同的时间,不同的地点页面都会不同

1.2 web应用程序

2. web服务器

3. Tomcat

3.1下载tomcat

3.2 启动tomcat

  • 现在暂时通过bin目录下的 startup.bat 启动 tomcat

  • 访问http://localhost:8080若出现如下图,则表示启动成功

3.3 tomcat配置

  • tomcat默认端口号:8080
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
  • 服务器默认名:localhost
  • 默认网站应用存放的位置为:webapps
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

3.4 发布网站

  • 如何访问:

    • 将自己写的网站,放到服务器( Tomcat中指定的web应用的文件夹( webapps)下,就可以访问了
    • http://localhost:8080/myWeb/
  • 网站结构:

    --webapps:Tomcat服务器的web目录
    	-ROOT 
    	-webName:网站的目录名
    		-WEB-工NF
    			-c1asses:java程序
    			-lib:web应用所依赖的jar包
    			-web.xml:网站配置文件
    		-index.htm默认的首页
    

4. HTTP

5. Maven

5.1 需求:

  • 1.在javaweb开发中,需要使用大量的jar包,我们手动去导入;
  • 2.如何能够让一个东西自动帮我导入和配置这个ar包。
    由此, Maven诞生了!

5.2 Maven项目架构管理工具

Maven的核心思想;约定大于配置

5.3 maven 下载 安装

  1. 打开 maven官网

  2. 选择 Download

  3. 找到Files,下载 Binary 和 Source

  4. 解压 第一个即可

5.4 maven 配置

  • 打开环境变量
  • 在系统变量 中 新建
    • 变量名:MAVEN_HOME
    • 变量值:maven的目录
  • 在path中添加:%MAVEN_HOME%\bin
  • 在cmd中输入 mvn -version,若弹出如图,则成功

5.5阿里云镜像

  • 先打开 setting.xml

  • 找到 mirrors 标签,配置

    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <url>
    http://maven.aliyun.com/nexus/content/groups/public class="hljs-tag">
    </url>
    

5.6 本地仓库

  • 先新建 一个文件夹做为本地仓库

  • 再 打开 setting.xml

  • 找到 localRepository

 <localRepository>你的本地仓库路径</localRepository>
  • 如图 我的配置

5.7 在 IDEA 中使用maven模板配置 Maven

  1. 打开 IDE 新建项目
  2. 创建Maven项目

  1. 等待项目初始化完成

  2. 观察 本地仓库

  3. IDEA 的 Maven 配置 注意

5.8 在 IDEA 中创建干净的Maven项目

  1. 新建项目

  2. 创建maven项目 不用选,直接Next

  3. 输入项目名 ---》完成

  4. 如图,这是干净的maven项目

5.9 标记文件功能

方法一:

方法二:

  1. 先找到 项目结构

  2. 1 --> 2--> 3--> 4

5.10 IDEA 配置 Tomcat

5.11 启动

  1. 点击 启动

  2. 效果 如图:

5.12 pom 文件

Maven 功能

pom.xml 是maven核心

 <?xml version="1.0" encoding="UTF-8"?>

<!--这里就是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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <!--这里是项目 组id,名称 -->
  <groupId>org.example</groupId>
  <artifactId>javaweb-01-maven</artifactId>
  <version>1.0-SNAPSHOT</version>
<!--  packag:项目打包方式
  jar:java 应用
  war:javaWeb 应用
-->
  <packaging>war</packaging>

  <name>javaweb-01-maven Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

<!--  配置-->
  <properties>
<!--    默认编码格式-->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--    编码版本-->
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

<!--  项目依赖-->
  <dependencies>
    <dependency>
<!--      具体依赖的 jar包 配置文件-->
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

<!--  项目构建的东西-->
  <build>
    <finalName>javaweb-01-maven</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

6. Servlet

6.1 Servlet简介

  • Sun在这些AP中提供一个接口叫做:Servlet,如果你想开发一个 Servlet程序,只需要完成两个小步骤:
    • 编写一个类,实现 Servlet接口
    • 把开发好的ava类部署到web服务器中。

把实现了 Servlet接口的ava程序叫做, Servlet

6.2 HelloServlet

  1. 构建一个普通的 Maven项目,删掉里面的src目录,以后我们的学习就在这个项目里面建立 Moudle;这个空的工程就是 Maven主工程;

  2. 再创建一个模板maven,作为子工程

  • 关于 Maven 父子工程的理解:

    • 父项目中会有:

      <modules>
      <module>servlet_01</module>
      </modules>
      
    • 子项目中会有:

      <parent>
      <artifactId>javaWeb_study</artifactId>
      <groupId>org.example</groupId>
      <version>1.0-SNAPSHOT</version>
      </parent>
      

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

  1. 编写一个Java类,继承 HttpServlet (实现servlet接口)
public class HelloServlet extends HttpServlet {

    public HelloServlet() {
        super();
    }

//    由于get或都post只是请求实现的不同的方式,所以可以相互调用,业多逻都一样;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        ServletOutputStream outputStream = resp.getOutputStream();
        PrintWriter pw =    resp.getWriter();
        pw.println("hello servlet");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
  1. 编写 servlet 映射

    为什么需要映射:

    ​ 想要通过浏览器访问Java程序,而浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的 Servlet,还需给他一个浏览器能够访问的路径;

    <!--注册Servlet-->
        <servlet>
            <servlet-name>hello</servlet-name>
            <servlet-class>com.study.servlet.HelloServlet</servlet-class>
        </servlet>
    <!--    Servlet的请求路径-->
        <servlet-mapping>
            <servlet-name>hello</servlet-name>
            <url-pattern>hello</url-pattern>
        </servlet-mapping>
    
  2. 配置Tomcat

    5.1 先创建Facets

    ​ 5.2 创建 Artifacts

    ​ 5.3 添加Tomcat

  3. 启动测试

    首页:

    通过映射的:

6.3 Servlet原理

6.4 Mapping

  1. 一个 servlet 指定一个映射路径

    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/ppx</url-pattern>
    </servlet-mapping>
    
  2. 一个 servlet 指定多个映射路径

    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/ppx</url-pattern>
        <url-pattern>/gkd</url-pattern>
        <url-pattern>/hello/*</url-pattern>
        <url-pattern>/ok</url-pattern>
    </servlet-mapping>
    
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/ppx</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
    	<url-pattern>/gkd</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/ok</url-pattern>
    </servlet-mapping>
    
  3. 一个 servlet 指定通用映射路径

    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    
  4. 一个 servlet 指定映射路径后缀

    <!--  注意: * 前面不能加 / 和 映射路径
    	例:<url-pattern>/whh/*.ppx</url-pattern>  tomcat会报错
    -->
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>*.ppx</url-pattern>
    </servlet-mapping>
    
  5. 优先级问题:

    指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求

6.5 ServletContext

​ Web容器在启动的时候,它会为每个Web程序都创建一个对应的 ServletContext对象,它代表了当前的Web应用

1、共享数据

//  HelloServlet 中
	@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
//        this.getInitParameter();
//        this.getServletConfig();
//        this.getServletContext();
        ServletContext context = this.getServletContext();
        String uname = " ppx ";
        context.setAttribute("username",uname); //将一个数据保存在了 ServletContext中,名字为:username。值:uname
        System.out.println("come to HelloServlet");
    }
//	GetServlet 中
	@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;charset=utf-8");
        resp.getWriter().print("名字是:" + username);
        System.out.println("come to GetServlet,name --->"+username);
    }
<!--  HelloServlet-->
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.study.servlet_03.HelloServlet_03</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>

  <!--  GetServlet-->
  <servlet>
    <servlet-name>getC</servlet-name>
    <servlet-class>com.study.servlet_03.GetServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>getC</servlet-name>
    <url-pattern>/getC</url-pattern>
  </servlet-mapping>

2、测试:

​ 首先进入 GetServlet.java ,这时 ServletContext 的 username值为null

​ 进入 HelloServlet ,将 username 的值 ppx 存入 ServletContext 中

​ 再次进入 GetServlet.java ,这时 ServletContext 的 username值为 ppx

3、请求转发

public class ServletDome_02 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
//        resp.getWriter().println("这里是ServletDome_02");

        ServletContext context = this.getServletContext();
//		请求转发
      context.getRequestDispatcher("/getC").forward(req,resp);
        System.out.println("come to ServletDome_02");
    }

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

4、读取资源文件

Properties

  • 在Java目录下新建properties
  • 在resources目录下新建properties

发现都被打包到了classes目录下,一般称这个路径为classpath

思路:同过文件流来读取

public class PropertiesServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        System.out.println("come to PropertiesServlet ");
        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
        Properties prop = new Properties();
        prop.load(is); //本地路径
        String user = prop.getProperty("username");
        String pwd = prop.getProperty("password");
        resp.getWriter().print(user+":"+pwd);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
  <!--  PropertiesServlet-->
  <servlet>
    <servlet-name>ps</servlet-name>
    <servlet-class>com.study.servlet_03.PropertiesServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ps</servlet-name>
    <url-pattern>/ps</url-pattern>
  </servlet-mapping>

测试结果:

6.6 HttpServletResponse

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

  • 如果要获取客户端请求过来的参数:找 HttpServletRequest

  • 如果要给客户端响应一些信息:找 HttpServletResponse

1、文件下载

  1. 获取文件的下在路径

  2. 下载的文件名称

  3. 设置支持浏览器下载需要的东西

  4. 获取下载文件的输入流

  5. 创建缓冲区

  6. 获取OutputStream对象

  7. 将FileOutputStream流写入到buffer缓冲区

  8. 使用OutputStream将缓冲区中的数据输出到客户端

        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //        1. 获取文件的下在路径
            String realPath = "E:\\java  学习代码\\IDEAJavaProject\\javaWeb_study_01\\response_01\\target\\classes\\007.png";
                    // this.getServletContext().getRealPath("src/main/resources/007.png");
            System.out.println("现在的文件下载路径为:"+realPath);
    //        2. 下载的文件名称
            String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
    //        3. 设置支持浏览器下载需要的东西
            resp.setHeader("Content-Disposition","attachment; filename"+ URLEncoder.encode(fileName,"utf-8"));
    //        4. 获取下载文件的输入流
            FileInputStream in = new FileInputStream(realPath);
    //        5. 创建缓冲区
            int len = 0;
            byte[] buffer = new byte[1024];
    //        6. 获取OutputStream对象
            ServletOutputStream out = resp.getOutputStream();
    //        7. 将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端
            while((len = in.read(buffer)) != -1){
                out.write(buffer,0,len);
            }
    //        8. 关闭流
            out.close();
            in.close();
        }
    

2、简单验证码

验证实现

  • 前段实现

  • 后端实现

    @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 如何让浏览器 3s 刷新一次
            resp.setHeader("refresh","3");
    
            // 在内存中创建一张图片
            BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_3BYTE_BGR);
            // 得到图片
                //得到笔
            Graphics2D g = (Graphics2D) image.getGraphics();
                //画出背景
            g.setColor(Color.WHITE);
            g.fillRect(20,20,80,20);
                // 画出随机数字
            g.setColor(Color.BLUE);
            g.setFont(new Font(null,Font.BOLD,20));
            g.drawString(makeNum(),0,20);
    
            // 告诉浏览器 用图片方式打开
            resp.setC ontentType("image/jpeg");
            // 网站存在缓存 , 不让图片进行缓存
            resp.setDateHeader("expirse",-1);
            resp.setHeader("cache-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(999999) + 100000 + "";
            return num;
        }
    

3. 重定向

一个web资源收到客户端请求后,他会通知客户端去访问另外一个web资源,这个过程叫重定向。一般是跳转页面。

测试:

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*
         resp.setHeader("Location","/r/img");
         resp.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
         */
        resp.sendRedirect("/r/img");    //重定向
    }

重定向和转发的区别:

  • 相同点:
    • 页面都会跳转
  • 不同点
    • 请求转发的时候,url 不会发生变化 ,编码307
    • 重定向时,url 会发生改变,编码302

6.7 HttpServletRequest

HttpServletRequest代表客户端的所有请求

获取前端传递的参数,再转发

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("utf-8");
        req.setCharacterEncoding("utf-8");
        // 获取参数
        String name = req.getParameter("username");
        String pwd = req.getParameter("password");
        String[] hobbies = req.getParameterValues("hobbies");
        // 打印参数
        System.out.println("----------------------------");
        System.out.println(name);
        System.out.println(pwd);
        System.out.println(Arrays.toString(hobbies));
        System.out.println("----------------------------");
        // 通过请求转发
        req.getRequestDispatcher("/succse.jsp").forward(req,resp);
    }

7、Cookie、Session

7.1 会话

会话:用户打开一个浏览器,点击了很多超链接,访问多个Web资源,关闭浏览器,这个过程可以称之为会话 。

有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之为有状态会话。

7.2 保存会话的两种技术

cookie

  • 客户端技术(响应、请求)

session

  • 服务器技术、利用这个技术、可以保存用户的会话信息。我们把信息放在Session 中

常见应用:网站会

1、从请求得到 Cookie

2、服务器相应给客户端cookie

Cookie[] cookies = req.getCookies();	//获得 cookie
cookie.getName();	//获得cookie中的 key
cookie.getValue();	//获得cookie中的 value
new Cookie("lastLoginTime",String.valueOf(System.currentTimeMillis()));	//新建一个 cookie
cookie.setMaxAge(60*60);	//设置cookie的有效期 1小时
resp.addCookie(cookie);		//响应给客户端一个cookie

cookie:一般会保存在本地的用户目录 appdate 下

删除cookie:

  • 不设置有效期,关闭浏览器,自动失效
  • 设置有效期的时间为 0

7.4 Session(重点)

什么是 Session :

  • 服务器会给每个浏览器创建一个 Session 对象;
  • 一个Session 独占一个浏览器,只要浏览器没有关闭,这个Session 就会一直存在
  • 用户登录后,整个网站都可以访问。保存用户信息
 @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 解决乱码问题
        req.setCharacterEncoding("utf-16");
        resp.setCharacterEncoding("utf-16");
        resp.setContentType("text/html;charset=utf-8");
        //得到Session
        HttpSession session = req.getSession();
        //给Session中存入信息
        session.setAttribute("name","皮皮虾");
        session.setAttribute("object",new preson("七仔",15));
        //获取Session 的 ID
        String id = session.getId();
        //判断Session 是不是新创建的
        if (session.isNew()){
             resp.getWriter().write("\r\nSession 创建成功,ID为"+id);
        }else{
            resp.getWriter().write("\r\nSession 已经存在,ID为"+id);
        }
    }

		//得到Session中的信息
        String name = (String) 		session.getAttribute("name");
        resp.getWriter().println("name--->"+name);
		// 移除 session 的值
        session.removeAttribute("name");
        //注销 Session
        session.invalidate();

自动失效:

<!--  设置 Session 的失效时间 ,以分钟为单位-->
  <session-config>
    <session-timeout>1</session-timeout>
  </session-config>

8、 JSP

8.1 什么是 JSP

Java Server Pages:Java服务器端页面,也和 Servlet一样,用于动态Web技术!

最大的特点:

  • 写JSP就像在写HTML
  • 区别:
    • HTML只给用户提供静态的数据
    • JSP页面中可以嵌入JAVA代码,为用户提供动态数据

8.2 JSP原理

思路:JSP是怎么执行的

  • 将html内容变为Java语法执行

  • 服务器内部工作

    tomcat中有一个work目录

    本机地址:C:\Users\ASUS.IntelliJIdea2019.3\system\tomcat\Unnamed_javaWeb_study_02\work\Catalina\localhost\rq\org\apache\jsp

页面转变为了Java程序

image-20200719112020070

JSP的本质是Servlet

//初始化
public void _jspInit() {
  }
//销毁
  public void _jspDestroy() {
  }
//JSPServer
  public void _jspService(HttpServletRequest request,HttpServletResponse response)

1、判断方法的代码

if ("OPTIONS".equals(_jspx_method)) {
        response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
        return;
      }
      if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) {
        response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
        response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
        return;
      }

2、内置的对象:

final javax.servlet.jsp.PageContext pageContext;	//页面上下文
javax.servlet.http.HttpSession session = null;		//session
final javax.servlet.ServletContext application;		//applicationContext
final javax.servlet.ServletConfig config;			//config
javax.servlet.jsp.JspWriter out = null;				//out
final java.lang.Object page = this;					//page:当前
HttpServletRequest request							//请求
HttpServletResponse response						//响应

3、输出页面前增加的代码

response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;

4、内置的对象能在JSP中直接使用

访问JSP页面的流程

image-20200719114412226

在JSP页面中;
只要是JAVA代码就会原封不动的输出;
如果是HTML代码,就会被转换为:

out.write("<h1>登录</h1>\r\n");

8.3 JSP基本语法

EL表达式:${ }

JSP表达式

  <% = new java.util.Date() %>

JSP脚本片段

<% for (int i = 0; i < 5; i++) { %>
<h2> Start ${i} </h2>
<% }%>

JSP声明

<%! static {
    System.out.println("这是 PIG");
}
    private  int  value = 20;
    public void domeFuncation(){
        System.out.println("PIG AGE IS"+value);
    }
%>

JSP声明:会被编 译到JSP生成Java的类中!其他的,就会被生成到 _jspService方法中!

JSP的注释不会显示在客户端,而HTML会显示

8.4 JSP 指令

1、定制错误页面

<%--JSP里:定制错误页面--%>
	<%--<%@ page errorPage="error/500.jsp"  %>--%>
<%--web.xml里:定制错误页面--%>
 <error-page>
        <error-code>404</error-code>
        <location>/error/404.jsp</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/error/500.jsp</location>
</error-page>

2、404页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>404 ERROR</title>
</head>
<body>
    <h1>糟糕,访问丢失了...</h1>
    <img src="../images/404.jfif" title="访问丢失">
</body>
</html>

2、添加网页头和网页尾

<%--第一种:两个页面和当前页面 合在一起 --%>
    <%@ include file="/common/Header.jsp"%>
    <h2>Start</h2>
    <%@ include file="/common/footer.jsp"%>
<%--第二种:3个页面拼接在一起,本质还是3个--%>
	<jsp:include page="common/Header.jsp"/>
    <h2>Start</h2>
    <jsp:include page="common/footer.jsp"/>

8.5 9大内置对象

  • PageContext 存东西
  • Request 存东西
  • Response
  • Session 存东西
  • Application【ServletContext】 存东西
  • config 【ServletConfig】
  • out
  • page
  • exception

image-20200723193009983

8.6 JSP标签、JSTL标签、EL表达式

 <!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api -->
        <!-- JSTL表达式 依赖-->
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/taglibs/standard -->
        <!-- standard 标签库-->
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>

EL表达式:$ { }

  • 获取数据

  • 执行运算

  • 获取web开发的常用对象

JSTL标签

JSTL标签库的使用就是为了弥补HTML标签的不足;它自定义许多标签,可以供我们使用,标签的功能和Java代码一样!

<jsp:forward page="dome03.jsp">
    <jsp:param name="name" value="ppx"/>
    <jsp:param name="age" value="18"/>
</jsp:forward>

格式化标签
SQL 标签
XML 标签
JSTL 函数

核心标签

image-20200724160354659

JSTL标签库使用步骤:

  • 引入对应的 taglib

  • 使用其中的方法

  • 在 Tomcat也需要引入jstl的包,否则会报错:JSTL解析错误

JSTL:if测试

  <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  
  <%--引入JSTL核心标签库,才能使用JSTL标签--%>
  <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  <html>
  <head>
      <title>JSTL if测试</title>
  </head>
  <body>
      <h2>  测试 DOME </h2>
  <%--    <div>--%>
          <form action="jstlDome01.jsp" method="get">
              <input type="text" name="username" value="${param.username}" >
  
              <input type="submit" value="Login...">
          </form>
      <%--
      test:条件
      var:存储 变量名
      value:赋值
      --%>
      <hr/>
  <c:if test="${param.username == '123'}"  var="isAdmin" >
      <c:out value="jin ru le"></c:out>
  </c:if>
      <c:out value="${isAdmin}"></c:out>
  </body>
  </html>

JSTL:choose when 测试

<body>
    <h1>choose when 判断</h1>
    <hr/>
    <form action="jstlDome02.jsp" methon="get">
        <input type="number" name="score" />
        <input type="submit" value="start">
    </form>
    <hr/> 

<c:choose>
    <%-- param . name :可以取得 name 的值  --%>
    <c:when test="${param.score >= 90}">优秀</c:when>
    <c:when test="${param.score >= 80}">良好</c:when>
    <c:when test="${param.score >= 60}">及格</c:when>
    <c:when test="${param.score <= 59}">失败</c:when>
</c:choose>
    <hr/>
</body>

9、JavaBean

IDEA连接MySQL出现错误,解决地址:连接地址

10、 MVC三层架构

什么是MVC:Model view Controller 模型、视图、控制器

10.1 以前的架构

image-20200730192124971

用户直接访问控制层,控制层就可以直接操作数据库

servlet --> CRUD --> 数据库
弊端:程序十分的臃肿,不利于维护
    
servlet的代码中:处理请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码

image-20200730193523738

猜你喜欢

转载自www.cnblogs.com/myswift/p/13406257.html