Jsp学习笔记

本文详细介绍了JSP的基本概念、原理,包括脚本、指令、注释、内置对象及其在MVC模式中的应用。重点讲解了EL表达式和JSTL的使用,同时通过一个用户信息管理的案例展示了JSP在三层架构中的实际应用,涵盖了列表查询、登录、添加、删除和修改等操作。最后探讨了分页查询和复杂条件查询,为JSP的实践提供了全面的指导。
摘要由CSDN通过智能技术生成

Jsp

JSP入门

概念

Java Servler Pages : Java服务器端页面

- 可以理解为一个特殊的页面,其中即可以指定html标签,又可以定义Java代码

原理

jsp本质上就是一个Servlet

运行tomcat,打开浏览器访问一个jsp文件,看控制台日志信息上面有如下一段

image-20210330220437083

复制该路径,文件打开

image-20210330221004918

即运行的jsp文件产生的资源

image-20210330221127457

由此可以看出:.jsp --> .java --> .class

打开.java文件查看代码:发现index_jsp类继承 HttpJspBase类

image-20210330221503212

而HttpJspBase类是由apache提供的,即tomcat提供的。

下面再看tomcat中HttpJspBase类,

image-20210330221751916

发现他继承自 HttpServlet, 所以说jsp本质上是一个Servlet

脚本

1、代码脚本

格式:<% Java语句 %>
作用:在JSP页面中可以编写需要的Java代码

2、表达式脚本

格式:<%=表达式 %>
作用:在浏览器的JSP页面上输出数据

3、声明脚本

格式:<%! 声明Java代码 %>
作用:可以给JSP翻译出来的Java类定义属性、方法、静态代码块、内部类等

指令

作用:用于配置jsp页面,导入资源文件

格式:
	<%@ 指令名称 属性名1=属性值1 属性2=属性值2……%>

分类:

1、page :配置jsp页面

  • contenType:等同于response.setContentType()

    ​ 1、设置响应体的mime类型以及字符集

    ​ 2、设置当前jsp页面的编码(只能是高级的ide才能生效,低级工具则需要设置pageEncoding属性设置当前页面字符集)

  • import:导包,如使用Java 的list集合就要导包

  • errorPage:当前页面发生异常后,会自动跳转到指定的错误页面

  • isErrorPage:标识当前页面是否是错误页面

    ​ true:是,可以使用内置对象exception(异常信息对象)

    ​ false:否,默认值。不可以使用内置对象exception

2、include :页面包含的。引入页面的资源文件

如很多页面都包含有某个特点,将该特点写到一个页面a,其他页面引入该页面a
<%@ include file="a.jsp" %>

3、taglib :导入资源

多用于导入标签库
<%@ taglib prefix="c" url="http://java.sun.com/jsp/jstl/core"%>
	- prefix :前缀,自定义的

注释

html注释:
	<!-- 注释内容--> 只能注释html代码片段

jsp注释:推荐使用

	<%注释内容%> 可注释所有

内置对象

在jsp页面中不需要获取和创建,可以直接使用的对象、

jsp一共有9个内置对象。

  • request

  • response

  • out : 字符串输出流对象。可以将数据输出到页面上。和response.getWriter()类似

    • response. getWriter() 和 out. writer() 的区别

      ​ 在tomcat服务器真正给客户端做出响应之前,会先找response 缓冲区数据,再找out缓冲区数据。

      ​ 所以response. getWriter() 会比 out. writer() 先输出,为了不影响布局,jsp会都选择用out. writer()

image-20210419233144801

(exception对象只有在 page指令下的isErrorPage属性的属性值为true才有)

MVC:开发模式

1、jsp演变历史

​ 1、早期只有servlet,只能使用response输出标签数据,非常麻烦

​ 2、后来有jsp,简化了servlet的开发,如果过度使用jsp,在jsp中写入大量的Java代码和html结构,造成难于维护,难于分工协作。

​ 3、再后来,Java的web开发,借鉴mvc开发模式,使得程序得设计更加合理

2、MVC:

M:Model,模型。JavaBean

​ - 完成具体得业务操作,如:查询数据库,封装对象

V:View,视图。jsp

​ - 展示数据

C:Controller,控制器。Servlet

​ - 获取用户输入

​ - 调用模型

​ - 将模型返回数据给视图进行展示

image-20210420093707052

EL表达式

1、概念:Expression Language 表达式语言

2、作用:替换和简化jsp页面中的Java代码编写

3、语法:${表达式}

4、注意:

  • jsp默认支持EL表达式,如果要忽略EL表达式

    ​ 1、设置jsp中page指令中:isELIgnored=“true” 忽略当前页面中所有EL表达式

    ​ 2、\ ${表达式} :忽略当前这个EL 表达式

5、使用:

​ 常用于:1、运算;2、获取值

${5+7}
${pageContext.request.contextPath} 获取虚拟目录
action="${pageContext.request.contextPath}/loginServlet"

1、运算符

1、算数运算符:+ - * /(也可div) %(mod)
2、比较运算符:> < >= <= == !=
3、逻辑运算符:&&(and) ||(or) !(not)
4、空运算符:empty
		- 功能:用于判断字符串、集合、数组对象是否为null并且长度是否为0
		- 长度为0或者对象为null则返回true
			- ${empty lists}
			
empty举例:
<%
    String str="";
    ArrayList ali=new ArrayList<>();
    ali.add(str);
%>

${empty ali} <%--长度为0或者 为空,返回true--%>
${not empty ali} <%--不为空   相当于 if(ali != null && ali.lenght !=0)--%>

2、获取值

1、el表达式只能从域对象中获取值

2、语法:

1、${域名称 . 键名} : 从指定域中获取指定键的值

  • 域名称:

    	域名称
    1、pageScope         --->pageContext
    2、requstScope       --->requst
    3、sessionScope      --->session
    4、applicationScope  --->application
    
    - 举例:在request域中存储了name=张三
    - 获取:${requstScope.name}
    
     
     **2、${键名} : 表示依次从最小的域中查找是否有该键对应的值,直到找到为止(即上面的1~4从小到大)**

​```jsp
<%request.getSession().setAttribute("name","李四");%>
${pageContext.request.setAttribute("name","张三")}


${name} <%--张三--%>
${sessionScope.name} <%--李四--%>

3、获取对象、list集合、Map集合的值

1、对象:${域名称.键名.属性名}

​ - 本质上会去调用对象的getter方法

例如:现在有User类,要在jsp中获取其对象内容

public class User {
   
    private String name;
    private int age;
    private Date birthday;
    //省略get/set方法
    }
jsp:
<%@ page import="maindao.User" %> <%--导入java类--%>

<%--获取对象,设置值. 并将对象存储到request域中--%>
<%
    User user = new User();
    user.setName("张三");
    user.setAge(18);
    user.setBirthday(new Date());

    request.setAttribute("u",user);
%>

<%--
    通过的是对象的属性来获取
        - setter或getter方法,去掉set或get,在将剩余部分,首字母变小写。
        - setName --> Name --> name
        实际上是调用成员方法。
--%>

${requestScope.u.name}<br>
${u.name}<br>
${u.age}<br>
${u.birthday}

image-20210424123643939

将时间格式化输出:在Bean类中添加一个方法

public class User {
   
    private String name;
    private int age;
    private Date birthday;
    
    //逻辑视图
   public String getBirStr(){
   
        if (birthday != null){
   
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            return sdf.format(birthday);
        }else {
   
            return "";
        }
    }
    
    //省略get/set方法
    }

jsp:
${
   requestScope.u.name}<br>
${
   u.name}<br>
${
   u.age}<br>
${
   u.birthday}<br>

${
   u.birStr} //调用了getBirStr()方法

image-20210424125910714

2、List集合:${域名称.键名[索引]}

<%--LIst--%>
<% ArrayList list = new ArrayList<>();
    list.add("张三");
    list.add(23);

    request.setAttribute("list",list);
%>

${requestScope.list[0]}
${list[1]}

3、Map集合:${域名称.键名.key名称}${域名称.键名["key名称"]}

<%--Map--%>
<%
    HashMap hash=new HashMap<>();
    hash.put("name","李小龙");
    hash.put("gender","男");
    hash.put("user",user);

    request.setAttribute("map",hash);
%>

${requestScope.map.name}
${map.gender}<br>
${map.user.birStr}

3、隐式对象:

  • el表达式中有11个隐式对象

  • pageContext:

    • 获取jsp其他八个内置对象

      ​ - ${pageContext. request. contextPath } : 动态获取虚拟目录

JSTL

1、概念:JavaServer Page Tag Library Jsp标准标签库

		- 是由Apache组织提供的开源的免费的jsp标签

2、作用:用于简化和替换jsp页面上的Java代码

3、使用步骤:

​ 1、导入jstl相关jar包

image-20210424201347060

​ 2、引入标签库:taglib指令:<%@ taglib %>

jsp中:<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 prefix="c" :前缀

​ 3、使用标签

4、常用标签:

1、if : 相当于Java中的if语句

<c:if test="true">
    你好啊,真的才能进哦
</c:if>

c:if标签:
	属性:test 必须写的属性,接收Boolean表达式
		- 如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
		- 一般情况下,test属性值会结合el表达式一起使用
	注意:c:if标签没有else情况,想要else情况,则可以再定义一个c:if标签

2、choose :相当于Java中的switch语句

<%
    request.setAttribute("number",7);
%>

<c:choose>
    <c:when test="${number==1}">星期1</c:when>
    <c:when test="${number==2}">星期2</c:when>
    <c:when test="${number==3}">星期3</c:when>
    <c:when test="${number==4}">星期4</c:when>
    <c:when test="${number==5}">星期5</c:when>
    <c:when test="${number==6}">星期6</c:when>
    <c:when test="${number==7}">星期天</c:when>
    <c:otherwise>数字输入有误</c:otherwise>
</c:choose>

3、foreach :相当于Java 中的for语句

<%--
1、完成重复的操作
    - 属性:
        begin:开始值
        end:结束值
        var:临时变量
        step:步长
        varStatus:循环状态对象
            index:容器中元素的索引,从0开始(非容器会显示值)
            count:循环次数,从1开始
--%>

<c:forEach begin="1" end="10" var="i" step="2" varStatus="s">
    ${i} ,${s.index} ,${s.count} <br>
</c:forEach>

image-20210425194209779

<%--
  2、遍历容器
        - 属性
           items:容器对象
           var:容器中元素的临时状态对象
           varStatus:循环状态对象
                index:容器中元素的索引,从0开始
                count:循环次数,从1开始
--%>
    

<%
    ArrayList list = new ArrayList();
    list.add("aa");
    list.add("bb");
    list.add("cc");

    request.setAttribute("list",list);
%>

<c:forEach items="${list}" var="str" varStatus="s">
    ${s.index} ${s.count} ${str}<br>
</c:forEach>

image-20210425194802719

案例:

需求:在request域中有一个存有User对象的List集合。需要使用jstl+el将list集合展示到jsp页面的表格中

<%--该User类为上面el表达式哪里的User类--%>
<%
    List list = new ArrayList();
    list.add(new User("张三",23,new Date()));
    list.add(new User("李四",15,new Date()));
    list.add(new User("聂风",26,new Date()));
    list.add(new User("步惊云",20,new Date()));

    request.setAttribute("list",list);
%>

<table width="400" border="1">
    <tr>
        <th>编号</th>
        <th>姓名</th>
        <th>年龄</th>
        <th>生日</th>
    </tr>
    <c:forEach items="${list}" var="s" varStatus="st">
        <tr>
            <td>${st.count}</td>
            <td>${s.name}</td>
            <td>${s.age}</td>
            <td>${s.birStr}</td>
        </tr>
    </c:forEach>
</table>

三层架构

1、界面层(表示层) :用户看的界面。用户可以通过界面上的组件和服务器进行交互

2、业务逻辑层 :处理业务逻辑的。

3、数据访问层 :操作数据存储文件。

image-20210426110655211

案例:用户信息列表展示

1、需求:用户信息的增删改查操作

2、设计:

​ 1、技术选型:Servlet+JSP+MySQL+JdbcTempleat + Duird + BeanUtils + tomcat

​ 2、数据库设计:

create database  day1;  -- 创建数据库
use day1;  -- 使用数据库
create table user(  -- 创建表
	id int primary key auto_increment,
	name varchar(20) not null,
	gender varchar(5),
	age int,
	address varchar(32),
	qq varchar(20),
	email varchar(50)
);

3、开发:

​ 1、环境搭建

​ 1、创建数据库环境

​ 2、创建项目,导入需要的jar包

image-20210426165422952

​ 2、编码

image-20210426172235952

首先创建一些必要的包:

image-20210428093909351
dao包:
UserDao接口:定义一些操作数据库的抽象方法
impl包:定义UserDao接口的实现类,在该类中通过JDBC访问数据库
service包:
UserService接口:定义了一些业务操作(操作数据库)方法
impl包:定义UserService接口的实现类,该类通过调用UserDao接口的实现类完成业务,返回操作后的对象

接口:定义业务方法

//UserService接口,暂时定义了两个业务操作
public interface UserService {
   
    /**
     *查询
     * @return
     */
    public List<User> findAll();

    /**
     * 登录
     * @param user
     * @return
     */
    public User login(User user);
}
//UserDao接口,为完成service对应的业务操作,同时定义了满足业务操作的访问数据库的方法
public interface UserDao {
   
    /**
     * 查找全部属性
     * @return
     */
    public List<User> findAll();

    /**
     * (登录查找)查找用户名和密码
     * @param user
     * @return
     */
    public User findByUsernameAndPassword(User user);
}

实现类:实现接口方法,并编写对应功能

//UserDaoImpl实现类
public class UserDaoImpl implements UserDao {
    JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource());
    @Override
    public List<User> findAll() { //实现UserDao接口的查询全部信息方法
        //jdbc操作数据库
        //定义sql
        try {
            String sql="select * from user";
            List<User> users = template.query(sql, new BeanPropertyRowMapper<User>(User.class));
            return users;
        } catch (DataAccessException e) {
            e.printStackTrace();
            return null;
        }
    }}
//UserServiceImpl实现类
public class UserServiceImpl implements UserService {  //实现UserService接口方法
   private UserDao dao=new UserDaoImpl(); //创建UserDaoImpl实现类对象

    @Override
    public List<User> findAll() {
        //调用UserDaoImpl实现类对象的对应方法完成查询
        return dao.findAll();
    }}
1、简单功能:
1、列表查询
@WebServlet("/userLiseServlet")  //Servlet控制
public class UserListServlet extends HttpServlet {
   
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
        //使用UserService完成查询
        UserService service=new 
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值