javaweb03(6-9)

6、servlet

6.1、servlet简介

  • Servlet就是sun公司开发动态web的一门技术

  • Sun在这些API中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤:

    • 编写一个类,实现Servlet接口

    • 把开发好的Java类部署到web服务器中。

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

6.2、helloservlet

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

  2. 关于Maven父子工程的理解:

    父项目中会有

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

​ 子项目会有

<parent> 
	<artifactId>javaweb-02-servletartifactId> 
	<groupId>com.kuanggroupId>
	<version>1.0-SNAPSHOTversion> 
parent>

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

son extends father
  1. Maven环境优化

    1. 修改web.xml为最新的
    2. 将maven的结构搭建完整
  2. 编写一个Servlet程序
    javaweb03(6-9)_第1张图片 1. 编写一个普通类
    2. 实现Servlet接口,这里我们直接继承HttpServlet

    public class HelloServlet extends HttpServlet { 
    //由于get或者post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样; 
    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //ServletOutputStream outputStream = resp.getOutputStream(); 
    PrintWriter writer = resp.getWriter(); //响应流 
    writer.print("Hello,Serlvet");
    }
        
    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    doGet(req, resp);
    } 
    }
    
  3. 编写servlet的映射

    为什么需要映射:我们写的是JAVA程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要再web服务中注册我们写的Servlet,还需给他一个浏览器能够访问的路径;

     
    <servlet> 
        <servlet-name>helloservlet-name> 
        <servlet-class>com.kuang.servlet.HelloServletservlet-class> 
    servlet> 
     
    <servlet-mapping> 
        <servlet-name>helloservlet-name> 
        <url-pattern>/hellourl-pattern> 
    servlet-mapping>
    
  4. 配置tomcat

  5. 启动测试

6.3、servlet原理

Servlet是由Web服务器调用,web服务器在收到浏览器请求之后,会:
javaweb03(6-9)_第2张图片#### 6.4、Mapping问题

  1. 一个Servlet可以指定一个映射路径
<servlet-mapping> 
	<servlet-name>helloservlet-name> 
	<url-pattern>/hellourl-pattern> 
servlet-mapping>
  1. 一个Servlet可以指定多个映射路径
<servlet-mapping> 
	<servlet-name>helloservlet-name> 
	<url-pattern>/hellourl-pattern> 
servlet-mapping>

<servlet-mapping> 
	<servlet-name>helloservlet-name> 
	<url-pattern>/hello2url-pattern> 
servlet-mapping> 

<servlet-mapping> 
	<servlet-name>helloservlet-name> 
	<url-pattern>/hello3url-pattern> 
servlet-mapping> 

<servlet-mapping> 
	<servlet-name>helloservlet-name> 
	<url-pattern>/hello4url-pattern> 
servlet-mapping> 

<servlet-mapping> 
	<servlet-name>helloservlet-name> 
	<url-pattern>/hello5url-pattern> 
servlet-mapping>
  1. 一个Servlet可以指定通用映射路径
<servlet-mapping> 
	<servlet-name>helloservlet-name> 
	<url-pattern>/hello/*url-pattern> 
servlet-mapping> 
  1. 默认请求路径
 
<servlet-mapping> 
	<servlet-name>helloservlet-name> 
	<url-pattern>/*url-pattern> 
servlet-mapping>
  1. 指定一些后缀或者前缀等等….
 
<servlet-mapping> 
	<servlet-name>helloservlet-name> 
	<url-pattern>*.qinjiangurl-pattern> 
servlet-mapping>
  1. 优先级问题

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

 
<servlet> 
	<servlet-name>errorservlet-name> 
	<servlet-class>com.kuang.servlet.ErrorServletservlet-class> 
servlet> 
<servlet-mapping> 
	<servlet-name>errorservlet-name> 
	<url-pattern>/*url-pattern> 
servlet-mapping> 

6.5、ServletContext

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

1、共享数据

我在这个Servlet中保存的数据,可以在另外一个servlet中拿到;

public class HelloServlet extends HttpServlet { 
	@Override 
	protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException { 
        
    	//this.getInitParameter() 初始化参数 				
    	//this.getServletConfig() Servlet配置 			
    	//this.getServletContext() Servlet上下文
        
    	ServletContext context =this.getServletContext(); 
        
    	String username = "秦疆"; //数据
        
    	context.setAttribute("username",username); //将一个数据保存在了 ServletContext中,名字为: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); 
	}
    @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
        doGet(req, resp);
    } 
}
<servlet> 
	<servlet-name>helloservlet-name> 
	<servlet-class>com.kuang.servlet.HelloServletservlet-class> 
servlet> 

<servlet-mapping> 
	<servlet-name>helloservlet-name> 
	<url-pattern>/hellourl-pattern> 
servlet-mapping> 

<servlet> 
	<servlet-name>getcservlet-name> 
	<servlet-class>com.kuang.servlet.GetServletservlet-class> 
servlet> 

<servlet-mapping> 
	<servlet-name>getcservlet-name> 
	<url-pattern>/getcurl-pattern> 
servlet-mapping>

测试访问结果

2、获取初始化参数

 
<context-param> 
    <param-name>urlparam-name> 
    <param-value>jdbc:mysql://localhost:3306/mybatisparam-value> 
context-param>
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    ServletContext context = this.getServletContext(); 
    String url = context.getInitParameter("url");		
    resp.getWriter().print(url); 
}

3、请求转发

@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    ServletContext context = this.getServletContext(); 
    System.out.println("进入了ServletDemo04"); 
    //RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp"); //转发的请求路径 
    //requestDispatcher.forward(req,resp); //调用forward实现请求转发; 
    context.getRequestDispatcher("/gp").forward(req,resp); 
}

4、获取资源文件

Properties

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

发现:都被打包到了同一个路径下:classes,我们俗称这个路径为classpath:

思路:需要一个文件流;

username=root12312 
password=zxczxczxc
public class ServletDemo05 extends HttpServlet { 
    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
		InputStream is = this.getServletContext().getResourceAsStream("/WEB- INF/classes/com/kuang/servlet/aa.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 { 
        doGet(req, resp); 
    } 
}

访问测试即可

6.6、HttpServletResponse

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

  • 如果要获取客户端请求过来的参数:找HttpServletRequest
  • 如果要给客户端响应一些信息:找HttpServletResponse
1、简单分类

负责向浏览器发送数据的方法

ServletOutputStream getOutputStream() throws IOException; 
PrintWriter getWriter() throws IOException;

负责向浏览器发送响应头的方法

void setCharacterEncoding(String var1);
void setContentLength(int var1); 
void setContentLengthLong(long var1); 
void setContentType(String var1); 
void setDateHeader(String var1, long var2); 
void addDateHeader(String var1, long var2); 
void setHeader(String var1, String var2); 
void addHeader(String var1, String var2); 
void setIntHeader(String var1, int var2); 
void addIntHeader(String var1, int var2);

响应的状态码

int SC_CONTINUE = 100; 
int SC_SWITCHING_PROTOCOLS = 101; 
int SC_OK = 200; int SC_CREATED = 201;
int SC_ACCEPTED = 202;
int SC_NON_AUTHORITATIVE_INFORMATION = 203;
int SC_NO_CONTENT = 204;
int SC_RESET_CONTENT = 205; 
int SC_PARTIAL_CONTENT = 206;
int SC_MULTIPLE_CHOICES = 300; 
int SC_MOVED_PERMANENTLY = 301; 
int SC_MOVED_TEMPORARILY = 302;
int SC_FOUND = 302;
int SC_SEE_OTHER = 303;
int SC_NOT_MODIFIED = 304;
int SC_USE_PROXY = 305;
int SC_TEMPORARY_REDIRECT = 307;
int SC_BAD_REQUEST = 400; 
int SC_UNAUTHORIZED = 401;
int SC_PAYMENT_REQUIRED = 402;
int SC_FORBIDDEN = 403;
int SC_NOT_FOUND = 404;
int SC_METHOD_NOT_ALLOWED = 405;
int SC_NOT_ACCEPTABLE = 406; 
int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
int SC_REQUEST_TIMEOUT = 408; 
int SC_CONFLICT = 409; 
int SC_GONE = 410;
int SC_LENGTH_REQUIRED = 411;
int SC_PRECONDITION_FAILED = 412; 
int SC_REQUEST_ENTITY_TOO_LARGE = 413;
int SC_REQUEST_URI_TOO_LONG = 414;
int SC_UNSUPPORTED_MEDIA_TYPE = 415;
int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
int SC_EXPECTATION_FAILED = 417;
int SC_INTERNAL_SERVER_ERROR = 500;
int SC_NOT_IMPLEMENTED = 501;
int SC_BAD_GATEWAY = 502; 
int SC_SERVICE_UNAVAILABLE = 503;
int SC_GATEWAY_TIMEOUT = 504; 
int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
2、下载文件
  1. 向浏览器输出消息 (一直在讲,就不说了)

  2. 下载文件

    1. 要获取下载文件的路径
    2. 下载的文件名是啥?
    3. 设置想办法让浏览器能够支持下载我们需要的东西
    4. 获取下载文件的输入流
    5. 创建缓冲区
    6. 获取OutputStream对象
    7. 将FileOutputStream流写入到buffffer缓冲区
    8. 使用OutputStream将缓冲区中的数据输出到客户端!
@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    // 1. 要获取下载文件的路径 
    String realPath = "F:\\班级管理\\西开【19525】\\2、代码\\JavaWeb\\javaweb- 02-servlet\\response\\target\\classes\\秦疆.png";
    System.out.println("下载文件的路径:"+realPath);
    // 2. 下载的文件名是啥? 
    String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1); 
    // 3. 设置想办法让浏览器能够支持(Content-Disposition)下载我们需要的东西,中文文件 名URLEncoder.encode编码,否则有可能乱码
    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))>0){ 
        out.write(buffer,0,len); 
    }
    in.close();
    out.close(); 
}
3、验证码功能

验证怎么来的?

  • 前端实现

  • 后端实现,需要用到 Java 的图片类,生产一个图片

package com.kuang.servlet; 

import javax.imageio.ImageIO; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.util.Random; 

public class ImageServlet extends HttpServlet { 
    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
        
        //如何让浏览器3秒自动刷新一次;
        resp.setHeader("refresh","3"); 
        
        //在内存中创建一个图片 
        BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB); 
        
        //得到图片 
        Graphics2D g = (Graphics2D) image.getGraphics();
        //笔 //设置图片的背景颜色 
        g.setColor(Color.white);
        g.fillRect(0,0,80,20);
        //给图片写数据 
        g.setColor(Color.BLUE); 
        g.setFont(new Font(null,Font.BOLD,20)); 
        g.drawString(makeNum(),0,20); 
        
        //告诉浏览器,这个请求用图片的方式打开
        resp.setContentType("image/jpeg"); 
        //网站存在缓存,不让浏览器缓存 
        resp.setDateHeader("expires",-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(9999999) + "";
        StringBuffer sb = new StringBuffer(); 
        for (int i = 0; i < 7-num.length() ; i++) {
            sb.append("0"); 
        }
        num = sb.toString() + num;
        return num; 
    }
    
    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
        doGet(req, resp); 
    }
}
4、实现重定向

B一个web资源收到客户端A请求后,B他会通知A客户端去访问另外一个web资源C,这个过程叫重定向

常见场景:

  • 用户登陆
void sendRedirect(String var1) throws IOException;

测试:

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

面试题:聊聊重定向和转发的区别?

相同点:

  • 页面都会实现跳转

不同点:

  • 请求转发的时候,url不会产生变化
  • 重定向时候,url地址栏会发生变化
5、简单实现登陆重定向
<%--这里提交的路径,需要寻找到项目的路径--%> 
<%--${pageContext.request.contextPath}代表当前的项目--%>

用户名:
密码:
@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); 
    
    //重定向时候一定要注意,路径问题,否则404;
    resp.sendRedirect("/r/success.jsp"); 
}
<servlet> 
    <servlet-name>requsetservlet-name>
    <servlet-class>com.kuang.servlet.RequestTestservlet-class> 
servlet>

<servlet-mapping> 
    <servlet-name>requsetservlet-name> 
    <url-pattern>/loginurl-pattern> 
servlet-mapping>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html> 
    <head>
        <title>Titletitle>
    head> 
    
    <body> 
        <h1>Successh1>
    body> 
html>

6.7、HttpServletRequest

HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息;
javaweb03(6-9)_第3张图片javaweb03(6-9)_第4张图片javaweb03(6-9)_第5张图片

@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));
    System.out.println("=============================");
    
    System.out.println(req.getContextPath()); 
    //通过请求转发 
    //这里的 / 代表当前的web应用
    req.getRequestDispatcher("/success.jsp").forward(req,resp);
} 

面试题:请你聊聊重定向和转发的区别?

相同点:

  • 页面都会实现跳转

不同点:

  • 请求转发的时候,url不会产生变化 307

  • 重定向时候,url地址栏会发生变化; 302

7、Cookie、Session

7.1、会话

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

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

你能怎么证明你是西开的学生?

​ 你 西开

  1. 发票 西开给你发票

  2. 学校登记 西开标记你来过了

一个网站,怎么证明你来过?

客户端 服务端

  1. 服务端给客户端一个 信件,客户端下次访问服务端带上信件就可以了; cookie

  2. 服务器登记你来过了,下次你来的时候我来匹配你; seesion

7.2、保存会话的两种技术

**cookie:**客户端技术(响应和请求)

**session:**服务器技术,利用这个技术,可以保存用户的会话信息? 我们可以把信息或者数据放在Session中!

7.3、cookie

javaweb03(6-9)_第6张图片

  1. 从请求中拿到cookie信息

  2. 服务器响应给客户端cookie

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

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

一个网站cookie是否存在上限!聊聊细节问题

  • 一个Cookie只能保存一个信息;

  • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie;

  • Cookie大小有限制4kb;

  • 300个cookie浏览器上限

删除Cookie;

  • 不设置有效期,关闭浏览器,自动失效;

  • 设置有效期时间为 0 ;

编码解码

URLEncoder.encode("秦疆","utf-8") 
URLDecoder.decode(cookie.getValue(),"UTF-8")

7.4、session(重点)

javaweb03(6-9)_第7张图片

什么是Session:

  • 服务器会给每一个用户(浏览器)创建一个Seesion对象;

  • 一个Seesion独占一个浏览器,只要浏览器没有关闭,这个Session就存在;

  • 用户登录之后,整个网站它都可以访问!–> 保存用户的信息;保存购物车的信息……

javaweb03(6-9)_第8张图片

Session和cookie的区别:

  • Cookie是把用户的数据写给用户的浏览器,浏览器保存 (可以保存多个)

  • Session把用户的数据写到用户独占Session中,服务器端保存 (保存重要的信息,减少服务器资

源的浪费)

  • Session对象由服务创建;

使用场景:

  • 保存一个登录用户的信息;

  • 购物车信息;

  • 在整个网站中经常会使用的数据,我们将它保存在Session中;

使用session:

package com.kuang.servlet; 

import com.kuang.pojo.Person; 
import javax.servlet.ServletException; 
import javax.servlet.http.*; 
import java.io.IOException; 

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");
        
        //得到Session
        HttpSession session = req.getSession(); 
        //给Session中存东西 
        session.setAttribute("name",new Person("秦疆",1)); 
        //获取Session的ID 
        String sessionId = session.getId(); 
        
        //判断Session是不是新创建 
        if (session.isNew()){ 
            resp.getWriter().write("session创建成功,ID:"+sessionId);
        }else { 
            resp.getWriter().write("session以及在服务器中存在 了,ID:"+sessionId); 
        }
        
        //Session创建的时候做了什么事情;
        // Cookie cookie = new Cookie("JSESSIONID",sessionId); 
        // resp.addCookie(cookie); 
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
        doGet(req, resp);
    }
}

//得到Session
HttpSession session = req.getSession();
Person person = (Person) session.getAttribute("name"); System.out.println(person.toString());
HttpSession session = req.getSession();
session.removeAttribute("name"); 
//手动注销
Session session.invalidate();

会话自动过期:web.xml配置


<session-config>
    
    <session-timeout>15session-timeout>
session-config>

8、jsp

8.1、什么是jsp

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

最大的特点:

  • 写JSP就像在写HTML

  • 区别:

    • HTML只给用户提供静态的数据
    • JSP页面中可以嵌入JAVA代码,为用户提供动态数据;

8.2、jsp原理

思路:JSP到底怎么执行的!

  • 代码层面没有任何问题

  • 服务器内部工作

tomcat中有一个work目录;

IDEA中使用Tomcat的会在IDEA的tomcat中生产一个work目录

javaweb03(6-9)_第9张图片

浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet**!**

JSP最终也会被转换成为一个Java类!

jsp的本质就是一个servlet

//初始化
public void _jspInit() {
} 

//销毁
public void _jspDestroy() {
} 

//JSPService
public void _jspService(.HttpServletRequest request,HttpServletResponse response)

1.判断请求

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"); //设置响应的页面类型 
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;
  1. 以上的这些个对象我们可以在JSP页面中直接使用!

javaweb03(6-9)_第10张图片

在jsp页面中:

只要是java代码就会原封不动的输出

如果是HTML代码就会转换为:

out.write("\r\n");

这样的格式,输出到前端!

8.3、jsp基础语法

任何语言都有自己的语法,JAVA中有,。 JSP 作为java技术的一种应用,它拥有一些自己扩充的语法(了解,知道即可!),Java所有语法都支持!

jsp表达式

<%--JSP表达式 
作用:用来将程序的输出,输出到客户端
<%= 变量或者表达式%> 
--%> 
<%= new java.util.Date()%>

jsp脚本片段

<%--jsp脚本片段--%>
<%
	int sum = 0;
	for (int i = 1; i <=100 ; i++) { 
		sum+=i; 
	}
	out.println("

Sum="+sum+"

"); %>

脚本片段的再实现

<%
	int x = 10; 
	out.println(x);
%>

这是一个JSP文档

<% int y = 2; out.println(y); %>
<%--在代码嵌入HTML元素--%> <% for (int i = 0; i < 5; i++) { %>

Hello,World <%=i%>

<% } %>

JSP声明

<%!
    static { 
    System.out.println("Loading Servlet!");
	}

	private int globalVar = 0;

	public void kuang(){
    System.out.println("进入了方法Kuang!"); 
	}
%>

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

在JSP,嵌入Java代码即可!

<%%> 
<%=%> 
<%!%> 
<%--注释--%>

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

8.4、jsp指令

<%@page args.... %> 
<%@include file=""%>

<%--@include会将两个页面合二为一--%> 

<%@include file="common/header.jsp"%> 

网页主体

<%@include file="common/footer.jsp"%>
<%--jSP标签 jsp:include:拼接页面,本质还是三个 --%>

网页主体

8.5、9大内置对象

  • PageContext 存东西

  • Request 存东西

  • Response

  • Session 存东西

  • Application 【SerlvetContext】 存东西

  • confifig 【SerlvetConfifig】

  • out

  • page ,不用了解

  • exception

pageContext.setAttribute("name1","秦疆1号"); //保存的数据只在一个页面中有效 
request.setAttribute("name2","秦疆2号"); //保存的数据只在一次请求中有效,请求转发会携 带这个数据 
session.setAttribute("name3","秦疆3号"); //保存的数据只在一次会话中有效,从打开浏览器 到关闭浏览器 
application.setAttribute("name4","秦疆4号"); //保存的数据只在服务器中有效,从打开服 务器到关闭服务器

request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用的!

session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车;

application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据;

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


<dependency> 
    <groupId>javax.servlet.jsp.jstlgroupId> 
    <artifactId>jstl-apiartifactId> 
    <version>1.2version> 
dependency> 

 
<dependency> 
    <groupId>taglibsgroupId> 
    <artifactId>standardartifactId>
    <version>1.1.2version> 
dependency>

EL表达式:${}

  • 获取数据
  • 执行运算
  • 获取web开发的常用对象

JSP标签

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

格式化标签

SQL标签

XML 标签

核心标签(掌握)

javaweb03(6-9)_第11张图片

JSTL标签库使用步骤

  • 引入对应的 taglib
  • 使用其中的方法
  • 在Tomcat 也需要引入 jstl的包,否则会报错:JSTL解析错误

c:if


    Title 
 

    

if测试


<%-- EL表达式获取表单中的数据 ${param.参数名} --%>
<%--判断如果提交的用户名是管理员,则登录成功--%> <%--自闭合标签--%>

c:choose c:when

 

<%--定义一个变量score,值为85--%>
 
    

	 
        你的成绩为优秀 
	 
	 
         你的成绩为一般 
     
     
         你的成绩为良好 
    
    
         你的成绩为不及格 
     

    

c:forEach

<%

	ArrayList people = new ArrayList<>();
	people.add(0,"张三"); 	
	people.add(1,"李四"); 
	people.add(2,"王五"); 
	people.add(3,"赵六"); 
	people.add(4,"田六"); 
	request.setAttribute("list",people); 
%>

<%-- 
    var , 每一次遍历出来的变量 
    items, 要遍历的对象 
    begin, 哪里开始 
    end, 到哪里 
    step, 步长 
--%> 
 
     


9、JavaBean

实体类

JavaBean有特定的写法:

  • 必须要有一个无参构造

  • 属性必须私有化

  • 必须有对应的get/set方法;

一般用来和数据库的字段做映射 ORM;

ORM :对象关系映射

  • 表—>类

  • 字段–>属性

  • 行记录---->对象

people表

id name age address
1 秦疆1号 3 西安
2 秦疆2号 18 西安
3 秦疆3号 100 西安
class People{ 
    private int id;
    private String name; 
    private int id; 
    private String address; 
}

class A{ 
    new People(1,"秦疆1号",3"西安"); 
    new People(2,"秦疆2号",3"西安"); 
    new People(3,"秦疆3号",3"西安"); 
}
  • 过滤器

  • 文件上传

  • 邮件发送

  • JDBC 复习 : 如何使用JDBC , JDBC crud, jdbc 事务

你可能感兴趣的:(java,maven,服务器)