javaEE 笔记(二)JSP基础+JSP指令+JSP动作+JSP隐式对象(重点)+JSP的表单处理(超级重点)

JSP基础

Jsp:java服务器页面技术,允许在页面上使用jsp元素来插入动态的java代码
Jsp元素有如下几种:
1).jsp脚本,以<%开头,%>结尾,语法<% xxxx %>,如果要在脚本中输出内容
,使用out.print()方法
2).jsp表达式,语法:<%=java表达式 %>,java表达式后面没有分号
3).jsp注释,语法:<%-- 注释内容 --%>
注意:jsp注释和html注释的不同之处:
1.语法不同, Html注释的语法:
2.Html注释在网页源代码中可以看到,而jsp注释是不可见的
在这里插入图片描述
查看网页源码时,只能看到html注释
在这里插入图片描述
Jsp的本质就是一个Servlet(servlet是一种运行在服务器端的组件,接收并处理请求,生成响应给客户端),而servlet就是一个java类。
后面学习了servlet后,jsp和servlet就各司其职,jsp负责显示数据到页面上,而servlet负责处后台理的业务逻辑,因为如果servlet去展示并输出网页数据到页面需要用到大量的println()或print()方法,很麻烦。在没学servlet前,我们把数据的显示和业务逻辑处理都写到jsp页面上

JSP的处理过程

浏览器通过url(访问路径)来访问jsp页面–>web服务器调用jsp引擎从硬盘上加载相应的jsp文件,并将该jsp文件转换为Servlet(就是java类),这个转换过程叫翻译—>
将servlet编译成可执行的字节码文件(.class)—>servlet引擎载入并执行字节码文件,通过println()生成html字符串发送给浏览器—>最终浏览器解析html字符串,将html页面展示到浏览器上
所有的动态页面技术的处理和jsp处理过程类似,最终浏览器端接收到的都是静态的html页面.
思考:
为什么说同一个jsp页面在第一次访问时,比较慢,后续再访问就很快了?
因为第一次请求jsp页面时,它需要经过翻译和编译的过程,后续再访问该页面时,servlet引擎就直接载入并执行已生成好的字节码文件,速度就变快了。
真实项目在上线前,所有的jsp页面都会被内部工作人员访问一次,后面的所有用户访问jsp页面就很快了
注意:1)web应用中的jsp页面都会翻译到tomcat的work目录中,访问过的每个jsp页面都对应一个java文件(就是一个servlet)
在这里插入图片描述
2)当修改了jsp页面的代码后,再次请求该页面,会自动被tomcat服务器重新翻译和编译,不需要重启服务器

2.JSP指令

语法:<%@ 指令名 属性名1=值1 属性名2=值2… %>
常用的三个指令
1)page指令
errorPage属性:指定当页面出错时,要跳转到哪个错误处理页面
2)include指令
该指令可以将其它文件包含进来,被包含的文件可以是jsp文件,html文件等等.被包含的文件和主文件一起翻译和编译。当前文件是主文件.
通常被包含的文件只需要保留page指令和它body里面的内容,其它标签都可以删除
例如
<%@ page language=“java” import=“java.util.*” pageEncoding=“UTF-8”%><divstyle=“background-color: gray;color:red;”>我是页面的头部

jsp动作

语法:<jsp:动作名 属性名=值 >
1)include动作:将html或jsp文件包含到当前文件中,当前文件是主文件
语法:<jsp:include page=“相对 URL 地址” flush=“true” />
使用include动作包含时,被包含的文件和主文件是单独的翻译和编译的。而include指令包含的时候,被包含的文件和主文件一起翻译和编译
项目中何时需要用到包含文件?
当项目中多个页面共享相同的css样式布局时,就可以把公共的css样式布局代码抽取到单独的jsp文件中,再在多个页面上使用include指令或include动作将jsp文件包含进去
2)forward动作:将当前请求转发到其它资源上
在转发过程中,浏览器的地址栏没有变化,还是原来的请求路径,转发是在服务器内部发生的跳转,对于用户来说是不知道的(因为url没有变化)
补充知识点:
在jsp页面的page指令下方的变量意义

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

变量path:值是web应用的根路径,即/xxx,xxx就是web应用的名称,前面的/代表web应用根路径是参照web服务器的根路径的,只要将/xxx接在web服务器根路径后面就行了
量basePath:获取协议及版本号(getScheme())+“: / /”+主机名(比如localhost或127.0.0.1)+”:”+端口号+web应用根路径+“/”
例如:
在这里插入图片描述
应用:当在webRoot的某个文件夹里的页面中通过点击超链接跳转到上一级页面时,不能使用…/,因为会丢失web应用的根路径
在这里插入图片描述
解决方案:不要使用…/来退回到上一级,把…换成path或basePath都行
在这里插入图片描述
代码示例点击此处

4.JSP隐式对象(重点)

隐式对象:tomcat服务器为每个页面提供的对象,开发人员可以直接使用这些对象,不需要手动去创建,又称为”内置对象”.
Jsp的九个内置对象,分为如下几类
1).作用域对象:page,request,session,application
2).响应对象:response
3).输出对象:out
4).其它对象:config,pageContext,exception
Out对象的print()或println()都可以输出任意类型的数据,println()方法在输出内容后并不会换行,只是产生了空格
在这里插入图片描述
在浏览器上显示:
Out对象的write()方法只能输出与字符类型相关的数据,例如:char[],String,int(字符对应的ascii码值)

Print()和println()区别:println()在输出内容后会多出空格,而print()不会多出空格
作用域对象:4个,都可以存储数据,存储数据有自己的作用范围,所以称为作用域对象
page:代表当前页面,它所存储的数据的作用范围是当前页面,即只能在当前页面中使用。
request:代表当前的一次请求,它所存储的数据可以在一次请求中使用(共享)
session:代表一次会话(浏览器和服务器之间的完整交互过程),一次会话可包含多个请求和响应,存储在session中的数据可以在一个会话中共享,即可以被多个请求共享
application:代表当前web应用,只要服务器没有关闭,存储在web应用中的数据可以被多个会话共享(一个web应用包含了多个会话)
根据作用域对象的范围从小到大排序:page—>request–>session–>application
4个作用域对象共同的方法:
1).setAttribute(String key,Object value):保存数据,以key/value形式存储数据,key是属性名,value是值
2).getAttribute(String key):获取属性值,根据属性名来获取
特殊:page对象存数据时,要用pageContext对象来调用setAttribute()方法

<%
       //将数据存储到page域对象
       pageContext.setAttribute("page_book", "三国");
    //将数据存储到request域对象
      request.setAttribute("request_book", "红楼梦");
      //将数据存储到session域对象
      session.setAttribute("session_book", "西游记");
   //将数据存储到application域对象
     application.setAttribute("application_book", "水浒传");
    %>

获取作用域对象中的数据(getAttribute):

page域中的数据:
	<%=pageContext.getAttribute("page_book")%><br> 
	request域中的数据:
	<%=request.getAttribute("request_book")%><br> 
	session域中的数据:
	<%=session.getAttribute("session_book")%><br> 

其它3个对象:
1)pageContext:代表页面上下文,它存储了其它对象的引用,即可以通过pageContext来访问其它的内置对象.

通过pageContext对象访问request对象:<%=pageContext.getRequest() %><br>
       通过pageContext对象访问session对象:<%=pageContext.getSession() %>

2)config:代表Servlet的配置对象,对应的类型是javax.servlet.ServletConfig
3)exception:代表异常对象
只有当jsp页面是错误处理页面时,才能使用exception对象
指定jsp页面是错误页面的方法:在页面的page指令上添加
isErrorPage=“true”
然后就可以在页面上调用exception对象

在这里插入图片描述
9个内置对象中的重点对象:4个作用域对象
代码示例点击此处

5.JSP表单处理(超级重点)

表单处理,即在服务器端通过java代码获取表单发送过来的请求参数的值

GET方法提交表单:请求参数会追加到url的后面,格式
Url?请求参数1=值&参数2=值2
在这里插入图片描述
POST方法提交表单:请求参数在Form Data中
在这里插入图片描述
注意:如果在写表单了,省略了method属性,那么默认使用GET方法提交

获取表单数据的常用方法
1)getParameter(String name):根据请求参数名来获取参数的值,只获取一个值
2)getParameterValues():根据请求参数名获取一组参数的值,只针对checkbox元素,
即多个参数的name相同
以上两个方法中的请求参数名就是表单中元素的name

获取请求参数数据时,中文乱码怎么解决?
1.对于GET方法提交,可以有2种解决方案:
方案1:将获取的数据先转换为byte[],再把byte数组重新编码为UTF-8格式的字符串

 String  sitename=request.getParameter("sitename");
              byte[] bt= sitename.getBytes("ISO8859-1");
                sitename=new String(bt,"UTF-8");

方案2:修改tomcat安装目录下的conf里的server.xml文件,找到第1个有效的Connector节点,在它上面加上属性URIEncoding=“UTF-8”,保存并重启web服务器
在这里插入图片描述
2.对于POST方法提交,解决中文乱码很简单:在第一次获取表单数据的前面
加上设置请求编码的语句:,request.setCharacterEncoding(“UTF-8”)

<%
         request.setCharacterEncoding("UTF-8");
         String  sitename=request.getParameter("sitename");
         String url=request.getParameter("url");
        %>

获取checkbox选中的一组值
调用request.getParameterValues(“checkbox的name”)
例如: String[] citys= request.getParameterValues(“city”);
6.综合案例
在上次课基础上增加学生的添加和删除功能
添加的思路:
1).创建添加学生页面add.jsp,该页面提交表单到doAdd.jsp页面

<h2>添加学生页面</h2>
  <form action="doAdd.jsp" method="post">
    姓名:<input type="text" name="uname"> <br>
  性别:<input type="radio" name="sex" value="男" checked><input type="radio" name="sex" value="女"><br>
 邮箱 :<input type="text" name="email"> <br>
年龄:<input type="text" name="age"> <br>
 <input  type="submit"  value="添加新学生">
   <br>  
  </form>

2)在doAdd.jsp页面上接收传过来的所有参数数据,封装成对象,调用dao的方法完成添加功能

<%
		//设置请求编码,防止中文乱码
		request.setCharacterEncoding("UTF-8");
		//获取表单中传过来的参数的值
		String name = request.getParameter("uname");
		String sex = request.getParameter("sex");
		String email = request.getParameter("email");
		int age = Integer.parseInt(request.getParameter("age"));
		//调用Dao中的添加方法
		Student stu = new Student();
		stu.setName(name);
		stu.setSex(sex);
		stu.setEmail(email);
		stu.setAge(age);

		StudentDao dao = new StudentDaoImpl();
		int i = dao.insert(stu);
		if (i > 0) {
			//跳转到list.jsp页面,刷新页面,response.sendRedirect:重新发请求到新页面
			response.sendRedirect("list.jsp");
		}
	%>

注意:修改jsp代码,要重启Tomcat服务器.
代码示例点击此处

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值