JSTL标签、MVC开发模式、注解

一、jstl标签

jsp标准的标签库语言,是apache的,用来代替java脚本

1.jstl的使用步骤
*导入标签库的jar包
*通过taglib指令引入jstl标签
*一般来说,配合EL表达式,在页面上使用标签
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 prefix前缀,别名       uri核心库
2.jstl的分类
core:核心类库
fmt:格式化|国际化
xml:过时了
sql:过时了
函数库:很少使用
3.c:if判断
<c:if test="${el表达式,来判断条件的真假}">
  满足条件时输出的内容
</c:if>

小案例:可以给登录成功页面加上判断有没有经过后台

<c:if test="${empty username}">
    你尚未登录,请<a href="/index.jsp">登录</a>
</c:if>
<c:if test="${username!=null}">
    ${username}欢迎你
</c:if>
4.c:forEach循环

(1).普通for循环

<%
  String[] arr={"aaa","bbb","ccc","ddd"};
  request.setAttribute("arr",arr);
%>

<c:forEach begin="0" end="3" var="index" step="1" varStatus="v">
  ${arr[index]}---${v.index}
</c:forEach>

begin起始索引  end终止索引   var遍历的当前元素的索引   step步长
varStatus用来记录循环的状态
(count记录次数,从1开始;current当前遍历的内容;index索引,从0开始)

(2).新式for循环

<c:forEach items="${arr}" var="ele">
  ${ele}
</c:forEach>

items容器     var当前元素

新式for循环进行遍历

<%--遍历数组--%>
<%
  String[] arr={"aaa","bbb","ccc"};
  request.setAttribute("arr",arr);
%>
<c:forEach items="${arr}" var="ele">
  ${ele}
</c:forEach>
<hr>

<%--遍历集合--%>
<%
  ArrayList<Student> list = new ArrayList<>();
  list.add(new Student("s001",11));
  list.add(new Student("s002",22));
  list.add(new Student("s003",33));
  request.setAttribute("list",list);
%>
<c:forEach items="${list}" var="ele">
  ${ele.name}---${ele.age}
</c:forEach>
<hr>

<%--遍历双列结合--%>
<%
  HashMap<String, Student> map = new HashMap<>();
  map.put("s001",new Student("张三",11));
  map.put("s002",new Student("李四",22));
  map.put("s003",new Student("王五",33));
  request.setAttribute("map",map);
%>
<c:forEach items="${map}" var="ele">
  ${ele.key}---${ele.value.name}---${ele.value.age}
</c:forEach>
5.c:url

功能:自动补全项目路径;自动进行URL重写,自动拼上JsessionID

  • 跳转页面
<c:url value="/login.jsp"/>自动补全项目路径
//方式1:将路径写死
  <a href="/login.jsp">登录1</a>
//方式2:通过EL表达式动态获取项目路径
  <a href="${pageContext.request.contextPath}/login.jsp">登录2</a>
//方式3:c标签跳转页面
  <a href="<c:url value="/login.jsp"/>">登录3</a>
  • 重定向
<c:redirect url="/login.jsp"></c:redirect>
6.set、out标签

set标签:保存数据,默认保存在page域

 <c:set var="name" value="zhangsan" scope="session"></c:set>
 <c:out value="${name}"></c:out>

out标签:获取数据(从域中)
(default:当value值为null时,使用默认值
excapeXml:是否对value值转义,false不转义,true转义)

${name}取不出来,以空串展示
<c:out value="${name}" default="abc"></c:out>取不出来,展示默认值
7.choose,when,otherwise标签(多重条件语句)
<c:set var="score" value="76"></c:set>
  <c:choose>
      <c:when test="${score>90&&score<=100}">
          真棒
      </c:when>
      <c:when test="${score>80&&score<=90}">
          优秀
      </c:when>
      <c:when test="${score>70&&score<=80}">
          良好
      </c:when>
      <c:when test="${score>60&&score<=70}">
          及格
      </c:when>
      <c:otherwise>
          不及格
      </c:otherwise>
  </c:choose>
8.forToken标签:循环特殊字符串
<%
    String str="java-php-net-平面";
    pageContext.setAttribute("str",str);
%>
<c:forTokens items="${str}" delims="-" var="s">
    ${s}<br>
</c:forTokens>

二、MVC开发模式

为了我们项目后期的扩展与维护。B/S架构的应用我们一般都遵循MVC开发模式。
M:Model数据模型,封装数据,处理业务逻辑
V:View视图层,界面展示
C:Controller控制器,servlet请求处理页面调度

三、JavaWeb三层架构

web层:显示层(JSP、Servlet),页面的调度以及显示
Service层:业务层(具体功能),业务逻辑的处理
Dao层:持久层,对数据库的操作,封装数据

通常的分包
Web层——Servlet页面的调度
Service层——业务逻辑的处理
Dao层——对数据库的操作
domain层——封装JavaBean实体类
utils——工具类
test——测试包

四、BeanUtils工具类

BeanUtils工具类,就是使用第三方的工具类,来把请求的数据集合,封装JavaBean中。

1.使用步骤
  • 导包
commons-beanutils-1.8.3
commons-logging-1.1.1
  • 使用
//1.一次性的把表单里的数据全部取出来
            Map<String, String[]> map = request.getParameterMap();
//2.使用第三方的工具类,来把请求的数据集合,封装到JavaBean中
            User user = new User();
            BeanUtils.populate(user,map);
2.注意:Date日期类型

针对JavaBean中的日期类型,想要封装进去,得转换注册一下

			Map<String, String[]> map = request.getParameterMap();
            User user = new User();
//1.日期转换器
            DateConverter converter = new DateConverter();
//2.设置日期的格式
            converter.setPattern("yyyy-MM-dd");
//3.注册日期类型
            ConvertUtils.register(converter, Date.class);
//4.把提交的数据封装到JavaBean中
            BeanUtils.populate(user,map);

五、注解

  1. 注解(Annotation):也叫元数据。一种代码级别的说明。
    它是JDK1.5及以后的版本引入的一个特性。与类、接口、枚举是在同一个层次。
    它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,对这些元素进行一些限定或解释,给程序看的。
  2. 格式
@interface 注解名{}
  1. 作用:
* 为了替代配置文件的方式,简化配置
* 会对类、接口、变量、形参做出一些限定或检测(编译检查、定义注解[元注解:注解上的注解]、分析代码[用到反射])
1.Java中常见的注解
@Override 检测此方法是否被重写(加在方法上)
@FunctionalInterface 检测此方法是否是函数式接口
lambda表达式需要函数式接口的支持,函数式接口(此方法只有一个抽象方法)
@SuppressWarnings(value = "unused")  压制黄色警报线(未被使用的)
@SuppressWarnings("all")  压制住所有的警报线
@Deprecated  标注此方法、类过期
2.自定义注解

(1)语法

@interface 注解名{}

(2)使用

@注解名

(3)本质:注解本质就是一个接口;接口中可以有常量和抽象方法;抽象方法在注解中称为注解属性

  • 注解属性
注解属性支持的类型有:
基本数据类型(byte、short、int、long、float、double、char、boolean)
字符串类型、枚举类型、注解类型、class类型,以及他们的数组类型
*不支持Date类型
  • 一旦注解有属性了,使用注解的时候必须赋值(除非这个注解属性有默认值)
注解中有多个属性时,在给属性赋值时,用逗号隔开
  • 赋值的格式
@注解名(属性名=属性值)
* 若注解类型为数组时,当属性值只有一个时,大括号可写可不写
* 当属姓名为value时,且只为value赋值时,value可写可不写
* 我们可以通过default关键词来给属性设默认值
3.元注解

(1)元注解:是java提供给我们的注解
(2)作用:限定我们的自定义注解
限定自定义注解加在什么上面;限定自定义注解保留多长时间

  • Target
规定注解作用在什么上面,值为ElementType的枚举类型
	TYPE作用在类、接口等上面
	METHOD作用在方法上面
	FIELD作用在字段上面
	CONSTRUCTOR作用在构造方法上
	LOCAL_VARIABLE作用在局部变量上
	PACKAGE作用在包上
	PARAMETER作用在参数上
  • Retention
规定注解保留到什么阶段,值为RetentionPolicy的枚举类型
	SOURCE只在代码中保留,在字节码中就删除了
	CLASS保留在编译器(在代码和字节码中都存在)
	RUNTIME保留在运行期(在任何阶段都存在)

六、小案例(注解替代配置文件)

获取连接对象,通过配置四个参数

  • 注解类
@Target(ElementType.METHOD)//我们自定义的注解只能加在方法上
@Retention(RetentionPolicy.RUNTIME)//我们自定义的注解保留在运行时期
public @interface JDBCAnnotation {
    String ClassName() default "com.mysql.jdbc.Driver";
    String url() default "jdbc:mysql://localhost:3306/mydb";
    String username();
    String password();
}
  • 工具类
public class JDBCUtils {
    @JDBCAnnotation(username = "root",password = "123456")
    public static Connection getConnection() throws NoSuchMethodException, ClassNotFoundException, SQLException {
        //通过反射获取该类的字节码文件对象
        Class<JDBCUtils> jdbcUtilsClass = JDBCUtils.class;
        //获取方法对象
        Method method = jdbcUtilsClass.getMethod("getConnection");
        //判断方法上有没有注解,如果有获取到该注解
        //参数:是注解的class类型
        boolean b = method.isAnnotationPresent(JDBCAnnotation.class);
        if(b){
            //获取注解的字节码类型
            JDBCAnnotation annotation = method.getAnnotation(JDBCAnnotation.class);
            //获取注解属性的值
            String className = annotation.ClassName();
            String url = annotation.url();
            String username = annotation.username();
            String password = annotation.password();
            //获取连接对象
            Class.forName(className);
            Connection connection = DriverManager.getConnection(url, username, password);
            return connection;
        }else{
            return null;
        }
    }
}

  • 测试类
public class MyTest {
    public static void main(String[] args) throws NoSuchMethodException, SQLException, ClassNotFoundException {
        Connection connection = JDBCUtils.getConnection();
        System.out.println(connection);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值