一、JSP

1.1 什么是JSP

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

最大的特点

  • 写JSP就像在写HTML代码
  • 区别
    1.HTML只给用户提供静态的数据
    2.JSP页面钟可以嵌入Java代码,为用户提供动态数据。

1.2 JSP基础语法

JSP表达式

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

jsp脚本片段

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

脚本片段的再实现

<%
    int x=10;
    out.println(x);
%>
<p>这是一个jsp文档</p>
<%
    int y=20;
    out.println(y);
%>
<hr/>

<%--在代码中嵌入HTML元素--%>
<%
    for (int i = 0; i <= 5; i++) {
%>
<h1>hello world<%=i%> </h1>
<%
    }
%>

jsp声明

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

    private int globalVar=0;

    public void yan(){
        System.out.println("进入了此方法");
    }
%>

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

1.3 九大内置对象

  • PageContext
  • Request
  • Response
  • Session
  • Application
  • config
  • out
  • page
  • exception

pageContextDemo01.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%--内置对象--%>

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

<%--脚本片段中的代码,会被原封不动的生成.jsp.java
要求:这里面的代码:必须保证Java语法的正确性
--%>
<%
    //通过pageContext取出,我们通过寻找的方式来
    //从底层到高层(作用域):page->session -> application
    String name1=(String) pageContext.findAttribute("name1");
    String name2=(String) pageContext.findAttribute("name2");
    String name3=(String) pageContext.findAttribute("name3");
    String name4=(String) pageContext.findAttribute("name4");
%>

<%--使用EL表达式输出 ${}--%>
<h1>取出的值为:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>

</body>
</html>

  • request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用了;
  • session:客户端向服务器发送请求,产生的数据,用户用完一定还有用,比如:购物卡;
  • application:客户端向服务器发送请求,产生的数据,其他用户还能使用,比如:聊天数据

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

EL表达式:${}

  • 获取数据
  • 执行运算
  • 获取wb开发的常用对象
  • jsp标签
<jsp:forward page="/jsptag2.jsp">
    <jsp:param name="name" value="xiaoyan"/>
    <jsp:param name="age" value="20"/>
</jsp:forward>

  • JSTL表达式
    JSTL标签库的使用就是为了弥补HTML标签的不足,它自定义了许多标签,可以供我们使用,标签的功能和Java代码一样。
  • JSTL标签使用步骤
    1.引入对应的taglib
    2.使用其中的方法

核心标签
在这里插入图片描述

coreif.jsp
<c:if> 标签

<%--引入JSTL核心标签库,我们才能使用JSTL标签--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<h4>if测试</h4>
<hr>
<form action="coreif.jsp" method="get">
    <%--
    EL表达式获取表单中的数据
    ${param.参数}
    --%>
    <input type="text" name="username" value="${param.username}">
    <input type="submit" value="登录">
</form>

<%--判断如果提交的用户名是管理员,则登录成功--%>
<c:if test="${param.username=='admin'}" var="isAdmin">
    <c:out value="管理员欢迎你"/>
</c:if>
<c:out value="${isAdmin}"/>

</body>
</html>

结果图展示


在这里插入图片描述

corewhen…jsp
<c:choose>, <c:when>标签

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%--定义一个变量score,值为85--%>
<c:set var="score" value="90"/>

<c:choose>
    <c:when test="${score>=90}">
        你的成绩为优秀
    </c:when>
    <c:when test="${score>=80}">
        你的成绩为一般
    </c:when>
    <c:when test="${score>=70}">
        你的成绩为良好
    </c:when>
    <c:when test="${score<=60}">
        你的成绩为不及格
    </c:when>
</c:choose>
</body>
</html>

结果图展示

在这里插入图片描述

coreforeach.jsp
<c:forEach>标签

<%@ page import="java.util.ArrayList" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%
    ArrayList<String> 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,步长
--%>

<c:forEach var="people" items="${list}">
    <c:out value="${people}"/>
</c:forEach>
<hr>

<c:forEach var="people" items="${list}" begin="1" end="3" step="2">
    <c:out value="${people}"/>
</c:forEach>
</body>
</html>

结果图展示

在这里插入图片描述

二、JavaBean

实体类
JavaBean有特定的写法:

  • 必须要有一个无参构造
  • 属性必须私有化
  • 必须有对应的get/set方法;

一般用来和数据库的字段做映射 ORM;
ORM:对象关系映射

  • 表—>类
  • 字段—>属性
  • 行记录---->对象

people表

idnameageaddress
1小言1号6长沙
2小言2号18衡阳
3小言3号20河源
class People{
	private int id;
	private String name;
	private int age;
	private String address;
}

class A{
	new People(1,"小言1号"18"长沙");
	new People(1,"小言2号"20"衡东");
	new People(1,"小言3号"22"花都");
}

实体类

package com.yan.pojo;

//实体类,我们一般都是和数据库中的表结构一一对应
public class People {
    private  int id;
    private String name;
    private int age;
    private  String address;

    public People(){

    }

    public People(int id, String name, int age, String address) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

JavaBean,jsp

<%@ page import="com.yan.pojo.People" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%
//    People people=new People();
//    people.getAddress();
//    people.setAge();
//    people.getId();
//    people.setName();
%>

<jsp:useBean id="people" class="com.yan.pojo.People" scope="page"/>
<jsp:setProperty name="people" property="address" value="长沙"/>
<jsp:setProperty name="people" property="id" value="1"/>
<jsp:setProperty name="people" property="age" value="20"/>
<jsp:setProperty name="people" property="name" value="小言"/>

姓名:<jsp:getProperty name="people" property="name"/>
id:<jsp:getProperty name="people" property="id"/>
年龄:<jsp:getProperty name="people" property="age"/>
地址:<jsp:getProperty name="people" property="address"/>
</body>
</html>

结果图展示

在这里插入图片描述

三、MVC三层架构

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

早些年
在这里插入图片描述

用户直接访问控制层,控制层就可以直接操作数据库;
servlet–CRUD–>数据库
弊端:程序十分臃肿,不利于维护
servlet的代码中:处理请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码

MVC三层架构
在这里插入图片描述
Model

  • 业务处理:业务逻辑(Service)
  • 数据持久层:CRUD(Dao)

View

  • 展示数据
  • 提供链接发起Service请求(a,form,img…)

Controller(Servlet)

  • 接收用户请求:(req:请求参数、session信息…)
  • 交给业务层处理对应的代码
  • 控制视图的跳转

登录-----> 接收用户登录请求------>处理用户的请求(获取用户登录的参数:username,password)----->交给业务层处理登录业务(判断用户名密码是否正确)------> Dao层查询用户名和密码是否正确---->数据库

四、Filter

Filter:过滤器,用来过滤网站的数据;

  • 处理中文乱码

在这里插入图片描述
Filter开发步骤:

  1. 编写过滤器
package com.yan.pojo;

import javax.servlet.*;
import java.io.IOException;

public class CharacterEncodingFilter implements Filter {

    //初始化
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("CharacterEncodingFilter初始化");
    }

    //filterChain:链
    /*
    1.过滤中的所有代码,在过滤特定请求的时候都会执行
    2.必须要让过滤器继续通行
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=UTF-8");

        System.out.println("CharacterEncodingFilter执行前....");
        filterChain.doFilter(servletRequest,servletResponse);//让我们的请求继续走,如果不写,程序到这里就会被拦截停止
        System.out.println("CharacterEncodingFilter执行后....");
    }

   //销毁
    public void destroy() {
        System.out.println("CharacterEncodingFilter销毁");

    }
}

  1. 配置web.xml
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>com.yan.pojo.CharacterEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  
  1. 用此servlet测试过滤器
package com.yan.pojo;

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

@WebServlet(urlPatterns = "/servlet")
public class ShowServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("你好,世界");
    }

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

  1. 测试结果

在这里插入图片描述


Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐