JavaWeb学习(较全较简)

标签: JSP学习  java  web  servlet  jsp

JSP

jsp(javascript page)服务端脚本语言,用于写动态网页。就是可以在html中写java代码。

一个JSP页面是由传统的HTML页面标记加上JSP标记和嵌入的Java代码组成
由以下4种元素组成:HTML标记、JSP标记、JSP脚本和注释。

执行过程:

第一次访问:jsp -> java(servlet文件) -> .class
第二次访问:直接访问.class文件
tips: 所以第一次访问网页都比较慢,后面后好点了,如果服务端代码修改时,服务器会重新编译。

架构

CS:Client Server

BS:Browser Server
内容较多,可查看:cs和bs架构的区别

tomcat服务器

目录结构:

bin:可执行文件都放在这(startup.bat开启服务器 shutdown.bat关闭服务器)
只有开启了服务器才能够访问部署在tomcat的网页

conf:(configure)配置文件都放在这

lib:tomcat依赖的jar文件

log:日志文件

temp:临时文件

webapps:可执行的项目(一般我们的项目都放在这里面)

work:存放由jsp翻译成java以及编译后的class文件

常见状态码

200:一切正常

404:资源不存在

403:权限不足

3开头:重定向

5开头:服务器内部出错(一般是代码写错)

虚拟路径

先来看看conf/server.xml文件中常用的一些配置吧
在这里插入图片描述
很多人不知道去哪里看自己设置的端口号或者想要自己重新设置端口号,这里就可以解决你的问题!

那我们再来看看一张图:
在这里插入图片描述
所以我们在输入url的时候需要localhost:端口号/文件夹/文件名

<welcome-file-list>

服务器一开始是怎么知道哪些文件是默认文件的呢?

原来在WEB-INF/web.xml中设置了 默认的 初始页面

<welcome-file-list>

	<!--你也可以添加一些默认的初始页面-->

	<welcome-file>index.jsp</welcome-file>

<welcome-file-list>

当你输入localhost:端口号时,服务器会先在这里找文件,如果没有找到就404

JSP中写java代码

<%@ %>、<% %>,<%= %>,<%! %>跟<%-- --%>标签

<%@ 指令%>:指令标签,将有关页面的特殊处理信息传送到JSP容器,告诉容器如何处理JSP网页。
指令主要包括:page 指令include 指令taglib指令

page指令:用来定义和操作许多重要的依赖于页面的属性,这些属性影响整个JSP文件
语法:<%@ page 一些配置属性 %>
其属性:

  • language: 指定jsp页面使用的脚本语言
  • import: 导入类或包,导入多个时用,分割。如果不写该属性,JSP页面自动引入以下4个包:java.servlet.*; java.lang.*; java.servlet.http.*; java.servlet.jsp.*;
  • pageEncoding: 指定jsp文件本身的编码
  • contentType: 指定浏览器解析jsp的编码
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

include指令:引入静态资源文件。
语法:<%@ include file="relativeURL" %>
注意事项:

  • 可以让页面内容分成几个组成部分分别管理。
  • 被包含文件的URL路径一定是和发出指令的JSP页面相对的路径,即这些文件应该和当前JSP页面在同一个Web应用中。
  • 该指令采取的是静态插入方式,所谓静态插入,是指当前的JSP页面和被嵌入的文件合并成一个新的JSP页面,然后JSP引擎再将这个新页面转换成Servlet。

taglib指令:自定义指令
语法:<%@ taglib uri ="tagLibraryURI" prefix = "tagPrefix" %> 其中uri是用户自定义标记所在的标记库描述文件的url地址,prefix是标记库描述文件的前缀

有关自定义指令更详细的内容可自行百度。


<% %>:可编写java代码块以及定义局部变量

  1. 一个JSP页面可以有多个代码段,它们被JSP引擎按顺序执行,并且这些代码段之间可以插入一些标记元素。
  2. 在代码段中也可以声明变量,但这些变量是_jspService()中的局部变量,它们在JSP页面内所有代码段部分和表达式部分有效。
  3. 当客户请求一个JSP页面时,JSP引擎为每个客户产生一个线程,每个线程分别执行各自的_jspService()方法,因此一个客户对局部变量的操作不会影响其它客户。
<%  // 这里定义局部变量,常规java代码
	init(9);
	for(int i = 0; i < 3; i++){
		// 换行用<br/>
		out.print(i*i + "<br/>");
%>

<%= %> 称为输出表达式 功能与out.print()等价

<%=  
	// 可以在这里写一些简单的表达式
	"你好啊" + name
%>

<%! %> 一般在此定义/声明全局变量,方法

<%! 
	public String name; 
	public void init(int n){
		name = "codekiang" + n;
	}
%>

注意:out.print()以及输出表达式可以解析html标签


<%-- --%> 注释标签,网页中不可见。

<%-- 
	 <%@ page %> => page 指令
 --%>

到了这里,一些代码你就可以得心应手的写出来啦。那么如果遇到需要在java代码中写html标签那该怎么办呢?
在这里插入图片描述
我们可以这样做:

<%  // 这里定义局部变量,常规java代码
	for(int i = 0; i < 3; i++){
	out.print("哈哈哈")
%>
<h2>CodeKiang好帅</h2>
<% }%>

这是我们可以把java代码用<% %>分开来,中间写html标签。


注意项:以上出现的标签%跟其他符号之间都不能存在空格,如<%= %>以及<%! %>中的%跟!,=之间不要有空格!!

九大内置对象

jsp的九大内置对象(不用new就可以直接使用的对象)

out、request、response、session、application、page、pagecontent、config、exception

out:输出对象,向客户端输出内容


request:请求对象,存储“客户端向服务端发送的请求信息”,数据只在同一次请求有效

常见方法:

String getParameter(String name):根据请求字段名返回字段值

String[] getParameterValues(String name):根据字段名返回多个值

void setcharacterEncoding(“编码格式”):设置请求服务器时所用编码,如UTF-8

void getRequestDispacher(“路径”).forward(request,response):请求转发,即跳转到其他页面

Cookie[] get Cookies():获取多个cookie


response:响应对象

常见方法:

void addCookie(Cookie cookie):服务端向客户端增加cookie对象

void sendRedirect(“路径”):重定向

void setContentType(“编码格式”):设置服务端响应的编码,如text/html;charset=UTF-8

tips:重定向与请求转发的区别

重定向:数据丢失 地址跳转
请求转发:保留数据 并且仍然保留转发时的页面

session:会话对象,同一会话共享数据 (注意:cookie不是内置对象)

用户第一次访问服务端时会自动产生一个session对象(拥有唯一sessionID)和cookie,
此时cookie的name=JSESSIONID,value=sessionID的值
客户端的cookie跟服务端的session一一对应就是靠JSESSIONID跟sessionID进行匹配
若匹配失败则创建session对象。
	cookie和session的区别:
					session			  cookie
		保存的位置		服务端			 客户端
		安全性			 较安全		   较不安全
		保存的内容		Object			String

常用方法:
String getID():获取sessionID

boolean isNew():判断是否第一次访问

void invalidate():注销session

setMaxInactiveInterval(秒):设置最大非活动时间

int getMaxInactiveInterval(秒):获取最大非活动时间

void setAttribute(key,value) :设置属性

Object getAttribute(key) :获取属性


application:全局对象

常见方法:

Object getAttribute(String name):根据属性名获取属性值
void setAtrribute(String name,Object obj):新增属性
void removeAttribute(String name) :根据属性名删除属性


config:配置对象(如服务器位置信息)


page:当前JSP页面对象(相当于java的this)


pageContent:JSP页面的上下文,常用于调用其他内置对象

ServletResponse getResponse(): 获取response对象

ServletRequest getRequest(): 获取request对象

HttpSession getsession():获取session对象


exception:异常对象


四大范围对象(小->大):

  1. pageContent 当前页面有效
  2. request 同一请求有效
  3. session 同一会话有效
  4. application 全局有效

共有方法:
Object getAttribute(String name) 根据属性名获取属性值
void setAtrribute(String name,Object obj) 新增或创建
void removeAttribute(String name) 根据属性名删除属性


cookie:由服务端生成再发送给客户端保存,除了自定义的cookie之外,还有自带JSESSION的cookie

创建cookie对象:new Cookie(key,value)
获取key:getName()
获取值:getValue()
设置最大有效期:setMaxAge(int time)

JavaBean

与数据库操作时,通常会把需要操作的数据封装成一个javaBean。以提高代码的复用性和减轻jsp复杂度

javaBean定义(必须同时满足以下两点):

  1. public修饰的类,public修饰的无参构造
  2. 所有属性(如果有)都是private修饰,并且都提供了set跟get方法。(boolean:get替换成is)

javaBean分为两大类

  1. 封装业务逻辑的javaBean(Dao层)
  2. 封装数据的javaBean(实体类) 对应数据库的一张表

tips:

  1. xxxDao.java的一般是跟数据库操作有关的

  2. 如果jsp出现错误:The import xxx cannot be resolved
    尝试解决方案:
    1. 可能没有给类创建一个包,为其加入个包然后用的时候带上包名,即可解决问题。
    2. 可能是jdk、tomcat版本问题,右键项目->build path,将其中报错的libary删除后重新导入。
    3. 缓存问题,清空各种缓存即可。右键服务器->clean tomcat

MVC设计模式

目的:为了解耦合、提高代码复用

M (model):封装了对数据的操作,是与数据库交互的地方。一般是 JavaBean

V (view):负责界面的显示。一般是 JSP

C (controller):控制器负责视图和模型之间的转接,即将视图的处理请求分配给哪一个模型来处理。一般是 Servlet

Servelet

定义:(满足以下条件的Java类)

  1. 必须继承 javax.servelet.http.HttpServelet

  2. 重写其中的doGet()或doPost()方法

    doGet():接受并处理所有的get方式的请求
    doPost():接受并处理所有的post方式的请求

要想使用servelet必须进行以下配置

Servelet2.5:配置web.xml文件

<servelet>
	<servelet-name>与servelet-mapping的servelet-name对应</servelet-name>
	<servelet-class>处理请求的文件</servelet-class>
</servelet>
<servelet-mapping>
	<servelet-name>与servelet的servelet-name对应</servelet-name>
	<servelet-pattern>/请求提交的路径(注意不要忘了'/')</servelet-pattern>
</servelet-mapping>

Servelet3.0@WebServelet('/请求提交的路径')

tips:

  • web.xml的 / 代表 项目 根目录
  • jsp的 / 代表 服务器 根目录

JSP动作

JSP动作标记是JSP页面中使用的一种特殊的标记,它利用XML语法格式的标记来控制JSP引擎完成某种功能。

<jsp:include>:在页面被请求的时候引入一个文件

如:<jsp:include page="relativeURL|<%=expression%>" flush="true"|false" /> 其中,page属性表示要包含的文件的相对地址,它可以是一个字符串,也可以是一个JSP表达式。flush属性默认为false,若为true则表示当缓冲区满时,缓冲区将被清空。

include指令和include 动作区别 (1)嵌入的内容。include指令嵌入的是静态的文本或页面,而include动作包含的可以是静态或动态内容。 (2)嵌入被包含页面的时间。include动作在处理请求时才将被包含页面嵌入进来,而include指令是在JSP文件被转换成Servlet的时候引入文件。 (3)共享局部变量。用include动作时,在页面中声明的变量不可用于另一文件;而在用include指令时,当前页面和被包含页面可以共享变量。 (4)修改的生效时间。用include指令时,修改的生效需刷新页面或去掉已经编译成的Servlet;而用include动作时,被包含页面的修改会随时生效。 (5)变量名冲突。用include指令时注意新生成的JSP页面要符合JSP语法要求,应该避免变量名的冲突。而用include动作不存在变量名冲突问题

<jsp:param>:提供了“名称——值”信息,用于将附加在request中的参数发送至转发的页面。
语法:<jsp:param name="parameterName" value="{parameterValue | <%= expression %> }" /> name属性指定参数的名称,value属性指定参数的值。

还可与 <jsp:include><jsp:forward><jsp:plugin> 标记一起使用。

<jsp:include page="relativeURL|<%=expression%>" flush="true"|false" >
	<jsp:param name="paramName" value="paramValue|<%=expression%>" />
</jsp:include>

<jsp:forward>:把请求转到一个新的页
语法:<jsp:forward page={"relativeURL" | "<%= expression %>"} />

使用<jsp:forward>标记时,JSP页面必须使用缓冲机制,不能将page指令中的buffer属性设为none。否则它将清空缓存里的内容,浏览器里将得不到任何输出。

tips:一旦JSP页面中加入<jsp:forward>,则它之后的程序将无法执行 ,<jsp:forward>标记将停止当前页面的处理而转向目标页面。

<jsp:plugin>:根据浏览器类型为Java插件生成OBJECT或EMBED标记
<jsp:useBean>:寻找或者实例化一个JavaBean
<jsp:setProperty>:设置JavaBean的属性
<jsp:getProperty>:输出某个JavaBean的属性


EL和JSTL

EL:Expression Language
	操作符:
		点操作符 	. 	--使用方便
		中括号	[]	--功能强大;属性名可以包含特殊字符(.、-)
	语法:${ 域对象.属性/key } 或 ${ 域对象["属性/key"] }可以是单引号      等价于<%= %>
	关系运算符: >(gt) >=(ge) ==(eq) <(lt) <=(le) !=(ne)
		例:${ 2>1 } 或${ 2 gt 1 } 结果为true
	逻辑运算符:||(or) &&(and) !(not)
	Empty运算符:判断值是否为null,若是则为true
		例:${Empty a.b } 
	隐含对象:
		作用域对象:pageScope、requestScope、sessionScope、applicationScope
			tips:如果不指定作用域对象,则默认从小范围到大范围找
		参数对象:获取表单数据/超链接的参数
			${ param.属性名 } 获取单个参数
			${ paramValues.属性名 } 获取多个参数
		JSP隐式对象:可以通过pageContent获得JSP的其他隐式对象
		    例:${ pageContent.session } 得到Seesion对象  与JSP的pageContent.getSession()等价
			${ pageContent.response } 得到response对象 与JSP的pageContent.getResponse()等价


JSTL:需要引入两个jar包(JSTL.jar standard.jar)
	然后引入tablib:<%@ taglib prefix="前缀名" uri="http://java.sun.com/jsp/jstl/core"%> 
	核心标签库:通用标签库、条件标签库、迭代标签库
		通用标签库:
			set标签:赋值操作
				在某个作用域中给变量赋值 
				<前缀:set var="变量名" value="变量值" scope="作用域对象"  /> 等价于 setAttribute("","")
				在某个作用域中给对象赋值 
				<前缀:set target="对象" proprety="属性名" value="值" />
					例:<c:set target="${request.student}" proprety="属性名" value="值" />
				tips:set标签可以给不存在的变量赋值。
			
			out标签:输出操作
				<前缀:out value="要输出的值" default="" escapeXml="true"  />
				default:当value为不存在的数据时,输出default
				escapeXml:默认true。 为false时value可以显示html代码
				
			remove标签:删除变量
				<前缀:remove var="" scope="">
                    
		条件标签库:
			if标签:
				<前缀:if test="${表达式}" var="结果值">
					为真时显示我
				</前缀:if>
				
			choose标签:
				<前缀:choose>
					<前缀:when test=""></前缀:when>
					<前缀:when test=""></前缀:when>
					<前缀:otherwise></前缀:otherwise>
				</前缀:choose>
			tips:test里面的${}的后面不要有空格
                    
         迭代标签库:
			forEach标签:同java的for
				<前缀:forEach begin="" end="" step=""></前缀:forEach>
				例:
					//for(int i=0;i<5;i++){ System.out.print(111) }
					<c:forEach begin="0" end="5" step="1">
						111
					</c:forEach>
					
					//for(int name : names){ System.out.print(name) }
					<c:forEach var="name" items="names">
						${ name }
					</c:forEach>

过滤器

如果要想给一个普通的class变成一个具有特定功能的类(过滤器、拦截器等),要么继承父类,要么实现接口,要么添加注解。

  1. 过滤器需要实现Filter接口

  2. 需要实现的方法:

    init:初始化时执行

    doFilter(ServeletRequest request,ServletResponse response,chain):处理拦截操作

    ​ 过滤器放行chain.doFilter(request,response)

    ​ 与Servlet中方法的参数:HttpServeletRequest

    destroy:销毁时执行

  3. 配置web.xml(类似于servlet)

    <filter>
    	<filter-name></filter-name>
        <filter-class></filter-class>
    </filter>
    <filter-mapping>
    	<filter-name></filter-name>
        <url-pattern>/需拦截的路径,为*时全拦截</url-pattern>
        <dispatcher>通配符请求:只拦截通配符设置的请求</dispatcher>
    </filter-mapping>
    
    常用通配符:
    REQUEST:拦截http请求(get、post)
    FORWORD:只拦截请求转发的请求
    

特点:

  1. 请求跟响应时都会被过滤器拦截。
  2. 需要过滤器放行

过滤器链

当有多个过滤器时,需配置多个 <filter-mapping> ,而过滤器的先后顺序由<filter-mapping>的位置决定

监听器

监听的对象:request、session、application

监听步骤:

  1. 编写类,实现接口

  2. 配置web.xml

    <listener>
    	<listener-class>类名的限定名</listener-class>
    </listener>
    

监听对象的创建和销毁:

request:ServeletRequestListener

session:HttpSessionListener

application: ServletContextListener

每个监听器各自提供了两个方法:监听开始和监听结束

监听对象中属性的变更:

request:ServletRequestAttributeListener

session:HttpSessionAttributeListener

application:ServletContextAttributeListener

每个监听器各自提供了三个方法:监听属性增加、属性更改、属性删除

xx.setAttribute("object",ob)触发对应的attributeAdded事件
xx.removeAttribute("object")触发对应的attriubteRemoved事件
xx.replaceAttribute("object",obs)触发对应的attributeRepalced事件

session的四种状态

  1. 钝化:把session对象从内存放进硬盘

  2. 活化:把session对象从硬盘放进内存

    操作:
    	1.实现HttpSessionActionListener和Serializable
    	2.配置tomcat目录/conf/context.xml
    		<Manager className="指定的Manager类名">
    			<Store className="指定的FileStore类名" 								directory="session存放位置">
                </Store>
    		</Manager>
    
    提供了钝化之前、活化之后的监听方法。
    
    实质:序列化、反序列化。需要继承Serializable
    钝化和活化不需要配置web.xml
    
    
    
  3. 绑定:session.setAttribute(“user”,user),触发valueBound事件

  4. 解绑:session.removeAttribute(“user”),触发valueUnbound事件;session失效或 超时。

    操作:
    	1.实现HttpBindingListener
    	2.不需要配置web.xml
    
    提供了session对象的绑定对象、解绑对象时的监听方法。
    
    this跟event区别:
    this:绑定的对象
    event:绑定了对象的session
    

tips:

  • 只有实现了HttpSessionBindingListener的类,在和session绑定、解除绑定时触发其相关事件。
  • 实现了HttpSessionAttributeListener后,任何对象(不论其是否实现了AttributeListener)在变化时均触发对应的事件

Ajax

使用jquery方式使用ajax

$.ajax({
	url:"服务器地址",
	type:post|get,
	data:"请求数据",
	success:function(result,testStatus){
		result为返回的结果,testStatus为状态码
    },
})
$.get({
	url:"服务器地址",
	data:"请求数据",
	function(result){},
	dataType:"test"|"json"|"xml"
})

$.post({
	url:"服务器地址",
	data:"请求数据",
	function(result){},
	dataType:"test"|"json"|"xml"
})
$("显示结果信息的元素").load({
	"服务器地址",
	"请求数据",
})
$.getJson({
	"服务器地址",
	json格式的请求数据
})
版权声明:本文为weixin_43521592原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43521592/article/details/106595149

智能推荐

【Sublime】使用 Sublime 工具时运行python文件

使用 Sublime 工具时报Decode error - output not utf-8解决办法   在菜单中tools中第四项编译系统 内最后一项增添新的编译系统 自动新建 Python.sublime-build文件,并添加"encoding":"cp936"这一行,保存即可 使用python2 则注释encoding改为utf-8 ctr...

java乐观锁和悲观锁最底层的实现

1. CAS实现的乐观锁 CAS(Compare And Swap 比较并且替换)是乐观锁的一种实现方式,是一种轻量级锁,JUC 中很多工具类的实现就是基于 CAS 的,也可以理解为自旋锁 JUC是指import java.util.concurrent下面的包, 比如:import java.util.concurrent.atomic.AtomicInteger; 最终实现是汇编指令:lock...

Python 中各种imread函数的区别与联系

  原博客:https://blog.csdn.net/renelian1572/article/details/78761278 最近一直在用python做图像处理相关的东西,被各种imread函数搞得很头疼,因此今天决定将这些imread总结一下,以免以后因此犯些愚蠢的错误。如果你正好也对此感到困惑可以看下这篇总结。当然,要了解具体的细节,还是应该 read the fuc...

用栈判断一个字符串是否平衡

注: (1)本文定义:左符号:‘(’、‘[’、‘{’…… 右符号:‘)’、‘]’、‘}’……. (2)所谓的字符串的符号平衡,是指字符串中的左符号与右符号对应且相等,如字符串中的如‘(&r...

JAVA环境变量配置

位置 计算机->属性->高级系统设置->环境变量 方式一 用户变量新建path 系统变量新建classpath 方式二 系统变量 新建JAVA_HOME,值为JDK路径 编辑path,前加 方式三 用户变量新建JAVA_HOME 此路径含lib、bin、jre等文件夹。后运行tomcat,eclipse等需此变量,故最好设。 用户变量编辑Path,前加 系统可在任何路径识别jav...

猜你喜欢

常用的伪类选择器

CSS选择器众多 CSS选择器及权重计算 最常用的莫过于类选择器,其它的相对用的就不会那么多了,当然属性选择器和为类选择器用的也会比较多,这里我们就常用的伪类选择器来讲一讲。 什么是伪类选择器? CSS伪类是用来添加一些选择器的特殊效果。 常用的为类选择器 状态伪类 我们中最常见的为类选择器就是a标签(链接)上的为类选择器。 当我们使用它们的时候,需要遵循一定的顺序问题,否则将可能出现bug 注意...

ButterKnife的使用介绍及原理探究(六)

前面分析了ButterKnife的源码,了解其实现原理,那么就将原理运用于实践吧。 github地址:       点击打开链接 一、自定义注解 这里为了便于理解,只提供BindView注解。 二、添加注解处理器 添加ViewInjectProcessor注解处理器,看代码, 这里分别实现了init、getSupportedAnnotationTypes、g...

1.写一个程序,提示输入两个字符串,然后进行比较,输出较小的字符串。考试复习题库1|要求:只能使用单字符比较操作。

1.写一个程序,提示输入两个字符串,然后进行比较,输出较小的字符串。 要求只能使用单字符比较操作。 参考代码: 实验结果截图:...

小demo:slideDown()实现二级菜单栏下拉效果

效果如下,鼠标经过显示隐藏的二级菜单栏 但是这样的时候会存在一个问题,就是鼠标快速不停移入移出会导致二级菜单栏闪屏现象,一般需要使用stop()来清除事件  ...

基于docker环境的mysql主从复制

1、安装docker 可以参考之前的博客,之前写过了~ 2、拉取mysql镜像 3、创建mysql01和mysql02实例 主: 从: 4、进入容器修改配置 1)修改主数据库配置 进入主数据库容器 切换到 etc/mysql/目录下 查看可以看到my.cnf文件,使用vim编辑器打开,但是需要提前安装 安装vim命令: 安装成功后,修改my.cnf文件 新增配置后的my.cnf: binlog 日...