一、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);
五、注解
- 注解(Annotation):也叫元数据。一种代码级别的说明。
它是JDK1.5及以后的版本引入的一个特性。与类、接口、枚举是在同一个层次。
它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,对这些元素进行一些限定或解释,给程序看的。 - 格式
@interface 注解名{}
- 作用:
* 为了替代配置文件的方式,简化配置
* 会对类、接口、变量、形参做出一些限定或检测(编译检查、定义注解[元注解:注解上的注解]、分析代码[用到反射])
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);
}
}