JSP学习笔记

65 篇文章 1 订阅

计划安排

JSP (Java Server Page) -> JavaEE BS
地位 -> 过渡(承上启下)
Java基础 -> 逻辑 包 集合 持久化
Web基础 -> Html Css JavaScript Jquery


1.JSP -> Servlet 内置对象 Ajax
2.Maven -> 项目架构管理
3.Mybatis -> 基本使用(JDBC)


Java框架 -> Spring全家桶
1.SSH
Spring Struts Hibernate
2.SSM
Spring SpringMVC Mybatis
3.微服务
SpringBoot SpringCloud


Maven:

概念:项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。还提供高级项目管理工具。

1.历史背景


jar包管理上的缺陷
	1)保存和搜集所需的jar包
	2)jar包管理复杂度 兼容性
	3)增加项目冗余度
面向对象核心原则 -> 单一职能原则
maven项目架构管理 -> pom.xml 核心配置文件
简言之:可以通过简单配置文本实现项目依赖项管理

2.环境搭建


1)创建本地仓库
	2)maven配置*** -> F:\maven\apache-maven-3.3.1\conf\settings.xml
		//本地仓库(55行)
		<localRepository>F:/maven/repository</localRepository>
		//远程仓库(155行)
		<mirror>  
		  <id>alimaven</id>  
		  <name>aliyun maven</name>  
		  <url>http://maven.aliyun.com/nexus/content/groups/public/</url>  
		  <mirrorOf>central</mirrorOf>          
		</mirror>  
		//默认JDK版本(255行)
		<profile>  
			<id>jdk-1.8</id>  
			<activation>  
				<activeByDefault>true</activeByDefault>  
				<jdk>1.8</jdk>  
			</activation>  
			<properties>  
				<maven.compiler.source>1.8</maven.compiler.source>  
				<maven.compiler.target>1.8</maven.compiler.target>  
				<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>  
			</properties>  
		</profile>

3)环境变量


MAVEN_HOME=F:\maven\apache-maven-3.3.1
		PATH = %MAVEN_HOME%\bin;

4)测试环境


	//版本
	mvn -v
	//初始化
	mvn help:system
	//Eclipse关联
	Window -> Preferences -> maven -> User settings 

5)Server服务器 -> tomcat 7.0

创建服务器文件夹
		//Eclipse关联
		Window -> Show View -> Others -> Servers 
		为什么要使用服务器?
		将网络资源发布到服务器指定目录中,可允许浏览器通过网络访问。
		在现实业务过程中,可以通过Java逻辑处理,针对不同会话产生对应的内容权限,即为JSP网站开发。	
		文件目录说明
			backup 	-> 备份
			bin		-> 后台运行
						开启 startup.bat(windows) startup.sh(Linux)
						关闭 shutdown.bat(windows) shutdown.sh(Linux)
			conf	-> 核心配置
						server.xml	-> 更改系统参数和配置参数
						context.xml	-> JNDI数据源连接池(性能优化)
						<WatchedResource>WEB-INF/web.xml</WatchedResource>
			lib		-> 依赖项jar包
			logs	-> 日志记录
			temp	-> 临时文件
			webapps	-> 发布目录
			work	-> 工作空间
						工作原理 -> 将响应结果通过html格式展示到浏览器中

3.创建maven项目


1)JavaSE
2)JavaEE
	Java脚本嵌入 -> 注意:在实际项目中尽量避免 逻辑代码比较混乱
		<% %> 	-> 嵌入Java代码
		<%= %>	-> 页面中显示数据 | <% out.print() %>

4.补充 -> 资源文件应用 思想:减少硬编码


1)编写资源文件 xxx.properties
		className=com.mysql.jdbc.Driver
		url=jdbc:mysql://localhost:3306/test
		user=root
		password=root
	2)编写工具类
		public class PropUtils {
			private static ResourceBundle bundle =null;
			static{
				//加载资源文件 注意:省略后缀名
				bundle = ResourceBundle.getBundle("jdbc");
			}
			public static String getValue(String key){
				if(bundle.containsKey(key)){
					return bundle.getString(key);
				}
				return null;
			}
		}
	3)获取资源信息
		PropUtils.getValue("className") -> com.mysql.jdbc.Driver

OOP思想 -> 类是对象的抽象 对象是类的实例 万事万物皆对象

OOP宗旨 -> 高内聚 低耦合 简称:解耦 | 原则:单一职能原则



Java核心架构 -> MVC

1.概念

M Model 		模型层 	-> 持久化 业务逻辑
V View 			显示层	-> 交互平台 
C Controller	控制层	-> 模型层与显示层之间桥梁和纽带


MVC包括三类对象。模型Model是应用对象,视图View是它在屏幕上的表示,
控制器Controller定义用户界面对用户输入的响应方式。不使用MVC,
用户界面设计往往将这些对象混在一起,而MVC则将它们分离以提高灵活性和复用性。

主导思想->通过控制器将显示与业务分离(显示与业务解耦)

2.JSP架构MVC

M -> JDBC Service(业务逻辑)

V -> JSTL

C -> Servlet

3.对于业务层理解 *

业务接口	-> 确定系统边界(做什么?做到什么程度?)

所有业务为需求服务 所有技术为业务服务

4.Servlet *

1)创建Servlet -> 通过路由映射调用业务方法
	定义类继承 javax.servlet.http.HttpServlet
	
2)生命周期 -> 时间顺序
	1>实例化(构造器)
	2>初始化(init())
	3>服务(server())
	4>销毁(destroy())
	说明:当第一次路由请求时 实例化只执行一次 初始化只执行一次 
		反复请求 服务多次执行 服务器关闭时执行销毁
	
3)配置Servlet ->web.xml
	<servlet>
		<servlet-name>homeServlet</servlet-name>
		<servlet-class>com.uplooking.controller.HomeServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>homeServlet</servlet-name>
		<url-pattern>/home</url-pattern>
	</servlet-mapping>
	
4)Servlet应用
	@Override
	protected void service(HttpServletRequest request, 
							HttpServletResponse response) 
								throws ServletException, IOException {
		System.out.println("服务");
	}
	
	//HttpServletRequest request 请求		-> 获取路由请求信息(一般为请求参数) 或 页面转发
	//HttpServletResponse response 响应		-> 实现数据展示 或 页面重定向
	//内置对象 服务器自行管理 不要手动控制

JSP内置对象 | 页面转发和重定向

JSTL标签应用 | 避免<% %>写法

<!-- JSTL标签应用 -->
<!-- ${} OGNL表达式 通过标签映射服务器数据 -->
<!-- requestScope 作用域 request -->
<!-- items 键值对 -->
${requestScope.items}

在这里插入图片描述

5.路由和网址的区别

网址:http://localhost:8080/JSP32/index.jsp
路由:http://localhost:8080/JSP32/indexServlet?op=1
区别:网址是在页面层的概念,如HTML,JSP,ftl等,路由是服务层的概念,
通过前端发送请求,服务器接受请求后,通过路由转发到相应的Servlet对象(控制层)进行处理,
处理完通过转发完成把信息响应给视图层。

补充:控制层有两种处理方式,一是转发,通过一次请求完成信息传递;二是重定向,
通过多次请求完成信息传递,至少一次路由+一次重定向。

1.服务器内置对象

1)特点:在服务器运行环境中,这些对象可以直接使用,各自有其本身生命周期和作用域范围,能提供相应方法属性。

2)本质:JSP本质Servlet -> JSP继承HttpJspBase HttpJspBase继承HttpServlet

3)对象:

		final javax.servlet.http.HttpServletRequest request 		-> 请求		***
		final javax.servlet.http.HttpServletResponse response		-> 响应		***
		final javax.servlet.jsp.PageContext pageContext				-> 上下文
		javax.servlet.http.HttpSession session = null				-> 会话		***
		final javax.servlet.ServletContext application				-> 服务器	***
		final javax.servlet.ServletConfig config					-> 系统配置
		javax.servlet.jsp.JspWriter out = null						-> 输出(response)
		final java.lang.Object page = this							-> 页面对象(jsp)
		javax.servlet.jsp.JspWriter _jspx_out = null
		javax.servlet.jsp.PageContext _jspx_page_context = null

4)解析:

内置对象					生命周期					作用域范围						常用方法属性				备注说明
request			每次路由发起都是一次新的请求		请求级别	requestScope		setAttribute(key,value)				存储
																			getAttribute(key)				获取
session			重新打开新的浏览器产生一次会话	会话级别 sessionScope		setAttribute(key,value)				存储
																			getAttribute(key)				获取
application		服务器重新启动产生一次服务		服务级别 applicationScope	setAttribute(key,value)				存储
																			getAttribute(key)				获取
response		每次请求都会伴随一次新的响应

页面跳转

	转发		request.getRequestDispatcher();
				由请求对象处理 转发路由不会改变(一次请求) 路由URL 请求级别数据保留
	重定向		response.sendRedirect();
				由响应对象处理 重定向路由被重置(多次请求) 网页URL 请求级别数据不保留
				推论:重定向保存数据至少是会话级别

总结:

	一般而言,推荐使用转发配合请求作用域实现数据传递,原因如下:
	1> 转发只有一次请求 避免服务器多次访问 减少TPS
	2> 请求级别数据及时释放 大大减少服务器内存开销 -> 会话资源非常珍贵(一般存储登录状态)

2.JSTL标签

1)信息处理

<c:set var="" value="" />	-> 页面级存储	
	${pageScope.key}			页面
	${requestScope.key}			请求
	${sessionScope.key}			会话
	${applicationScope.key}		服务
	${key} -> 从页面开始检索 没有继续上行 直至服务级别为止 因此:在实际应用中不推荐使用 原因:效率太低

2)分支处理

<c:if test="" />
	</c:if>
		test 逻辑判断表达式
	
	注意:
		null判断 关键字 empty -> <c:if test="${empty pageScope.list}">
		集合中没有元素 -> <c:if test="${pageScope.list.size()==0}">

3)循环遍历

循环 
	<c:forEach var="index" begin="1" end="10" step="1">
		<a href="#">第${index}页</a>
	</c:forEach>
	
	var 循环变量
	begin 起始值
	end 结束值
	step 步长 增长量

遍历
	<c:forEach var="num" items="${nums}" varStatus="status">
		<li>${num} - ${status.index}</li>
	</c:forEach>
	
	var 循环变量
	items 集合或数组
	varStatus -> 索引下标

3.Servlet注解

作用 -> 另一种更加简洁的编码模式 与配置方式目的一致 但可读性更强 俗称:"配置减肥"
技巧 -> 按模块划分Servlet

在这里插入图片描述

1.服务器参数 -> request对象获取

	<%=request.getContextPath()%><br/>	-> 网站名 路由定位
	<%=request.getLocalAddr() %><br/>	-> 服务器ip地址
	<%=request.getLocalName() %><br/>	-> 服务器机器名
	<%=request.getLocalPort() %><br/>	-> 服务器端口
	<%=request.getRemoteAddr() %><br/>	-> 客户端ip地址
	<%=request.getRealPath("") %><br/>	-> 网站发布目录

2.关于"删除"业务说明

在实际业务过程中,并不存在物理化删除操作,取而代之的为逻辑删除(修改)
对于删除的记录添加一个状态字段,通过该状态筛选过滤业务操作。

3.多表处理

4.数据分页

SELECT XXX FROM XXX LIMIT (当前页数-1)*显示行数,显示行数

例如:eg 每页显示10条  第二页 (2-1)*10,10

分页表现形式

1) 首页 前页 后页 末页 【】GO

2) 前页 1 2 3 4 5 6 7 8 9 10 后页 【】GO

回顾:

1.Maven

1)配置文件
	本地仓库
	远程仓库
	JDK版本
2)环境变量
	MAVEN_HOME=xxx
	%MAVEN_HOME%\bin
3)关联Eclipse
	settings.xml
	pom.xml

2.tomcat

1)服务器作用
	将用户url请求(request)转换为html响应(response),
	在浏览器中展示数据信息。
2)关联Eclipse
	Servers -> 更改指定服务器的发布目录
3)目录说明
	backup 	备份
	bin		启动停止
	conf	配置文件
	lib		依赖项jar包
	logs	日志文件
	temp	临时文件
	webapps	发布目录 
	work	工作空间
	
	http协议 -> 超文本传输协议(请求url | 响应html)
	url格式  -> http://服务器域名(ip地址)
	https协议 -> 认证加密协议(指定机构注册申请) ***

3.JSP

1)JavaEE项目创建
	Eclipse Maven -> 修改web_app版本 引入tomcat服务器
2)所在目录
	WebContent
		WEB-INF
			lib		->jar包目录(忽略)
			web.xml	->核心配置文件
3)服务器脚本
	<html 客户端脚本> + <% 服务器脚本 %>

1.OOP相关概念

1)思想 -> 万事万物皆对象 类是对象的抽象 对象是类的实例 
2)实现 -> 封装 继承 多态
3)目标 -> 高内聚 低耦合

2.MVC相关概念

1)组成 -> Model Controller View
2)意义 -> 实现业务逻辑与数据显示的分离(解耦)
3)组合 -> Model(JDBC) Controller(Servlet) View(JSTL)

3.Servlet相关概念

1)实质 -> javax..HttpServlet
2)作用 -> 控制器(路由映射服务)
3)周期 -> 实例化(构造器) 初始化(init()) 
		  服务(service(HttpServletRequest request,HttpServletResponse response))
		  销毁(destroy()) -> 首次路由 实例化初始化仅一次 每次路由执行服务 服务关闭销毁

4)配置 -> web.xml

 		 <servlet>
			 <servlet-name></servlet-name>
			 <servlet-class></servlet-class>
		  </servlet>
		  <servlet-mapping>
			 <servlet-name></servlet-name>
			 <url-pattern></url-pattern>
		  </servlet-mapping>

5)注解

1.内置对象
	1)每个jsp页面 最终被解析为一个Servlet对象 -> 继承HttpJspBase  HttpJspBase继承HttpServlet
	2)在服务器环境中 这些对象可以直接使用 这些对象可以存储获取传递数据信息
	
	final javax.servlet.http.HttpServletRequest request		请求级别 -> 每次路由都是一次新的请求
	javax.servlet.http.HttpSession session = null;			会话级别 -> 新开浏览器产生新的会话
	final javax.servlet.ServletContext application;			服务级别 -> 开启或关闭服务器
	final javax.servlet.http.HttpServletResponse response
	
	页面跳转
	1)转发		->request.getRequestDispater()
			由请求对象发送 一次请求 URL路由 请求级别数据不过期
	2)重定向	->response.sendRedirest()
			由响应对象发生 多次请求(路由->网址) URL网址 请求级别数据过期
			
	一般而言:在JSP控制器中,尽量使用请求级别数据存储配合转发实现数据中转,原因有二:
	1)减少服务器多次请求
	2)及时回收数据 释放多余的内存消耗

2.jstl基础

1)数据
		<c:set var="" value="" />	-> 页面级别 pageScope
		请求级别	requestScope
		会话级别	sessionScope
		服务级别	applicationScope
		
		${requestScope.k1} -> 效率更高
		
	2)分支
		<c:if test=""></c:if>
	
	3)循环
		<c:forEach var="" begin="" end="" step=""></c:forEach>
		
		<c:forEach var="" items="" varStatus=""></c:forEach>

3.Servlet注解

注解只是另一种编码方式 -> 简洁可读性更强 避免复杂臃肿的配置文件 (俗称:配置减肥)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你不懂、、、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值