JSP入门和进阶

JSP 入门

为什么使用JSP?先要从Servlet开发的痛点说起。

Servlet的缺点

1 静态HTML与动态Java代码混合在一起,难以维护。
2 Servlet利用out.println()语句输出,开发效率低下。
3 Eclipse很难在开发过程中发现错误,调试困难。

  • JSP全称是(Java Server Pages),Java服务器页面。
  • JSP是J2EE的功能模块,由Web服务器执行。
  • JSP的作用就是降低动态网页开发难度。

JSP的特点:
JSP使用简单,短时间学习便可以上手使用
JSP可将Java代码与HTML分离,降低开发难度
JSP的本质就是Servlet

JSP运行要求:
可正常运行的Tomcat
所有JSP页面扩展名必须是 .jsp
JSP页面应放在Web应用程序目录中。

开发第一个JSP…

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<table>
		<tr>
			<th>year</th>
			<th>salary</th>
		</tr>
		<%
			for(int i = 0; i <= 50 ; i++){
			    out.println("<tr>");
			    out.println("<td>"+ i +"</td>");
			    int sal = 0;
			    if(i <= 5){
			        sal = 1500 + i * 150;
			    }else if(i<=10){
			        sal = 1500 + 1500 * 5 + 300 * (i-5);
			    }else{
			        sal = 1500+150*5+300*5+375*(i-10);
			    }
			    out.println("<td>"+ sal +"</td>");
			    out.println("</tr>");
			}	
		%>
	</table>
</body>
</html>

上面的文件是一个.jsp的文件,它与html非常相似,但是它可以在网页的动态执行部分添加程序
添加的程序都写在 <% content… %> 里面。


JSP基本语法

JSP代码块 JSP声明构造快
JSP输出指令 JSP处理指令
JSP代码块用于在JSP中嵌入java代码
JSP代码块的语法:<% java代码 %>
例如: <% Ssystem.out.println(“Hello World!”); %>
JSP声明构造快:
JSP声明构造快用于声明变量或者方法
JSP声明构造代码块语法:<%! 声明语句 %>
例如:<%! public int add(int a,int b){ return a+b; } %>
JSP输出指令:
JSP输出指令用于在JSP页面中显示Java代码执行的结果
JSP输出指令语法:<%= java代码块 %>
例如:<%= “”+ name +"" %> //将name的值加粗显示在页面中。
上面的代码就是 out.println(name) 的简写形式,两者输出结果相同
JSP处理指令:
JSP处理指令用于提供JSP执行过程中的辅助信息
JSP的处理指令语法:<%@ jsp指令 %>

例如:<%@ page import="java.util.*" %> //导入util包下所有的文件


JSP常用的处理指令

<%@ page %> 定义当前JSP页面全局设置
<%@ include file="url"%> 将其他JSP页面与当前JSP页面合并
<%@ taglib %>引入JSP标签库

JSP中注释的区别

<%-- 注释 --%> JSP注释,被注释的语句不做任何处理
// 、 /* */ 用于注释 <%%>java代码,被注释代码不执行。 HTML注释,被注释的语句不会被浏览器解释。


请求体的结构:包括三部分 请求行,请求头与请求体三部分。
响应体结构:包括响应行、响应头与响应体。

第二章:请求转发与定向

2-1 请求转发与响应重定向的使用。
问题:前面操作的servlet都是在单个servlet文件中进行操作的,那么如何的实现多个文件之间的通信呢?

多个Servlet(JSP)之间跳转有两种方式:
request.getRequestDispatcher().forward(); --请求转发方式
response.sendRedirect() --响应重定向。

对于第一种方式:在Servlet类当中使用:
request.getRequestDispatcher("\url-pattern").forward(request,response);
//这种方式实现不同servlet之间的通信其浏览器页面种的url不会发生变化
//具体原因是这个servlet类处理完成后直接跳转到要转到的servlet类接着进行处理,而不会先返回给浏览器。

第二种方式是响应重定向:response.sendRedirect("/工程名/url-pattern");
响应重定向是需要增加contextPath。
这种方式跳转页面会使得浏览器页面的url自动跳转。
两者的差异是:第二种是浏览器发送页面请求到到目标servlet,处理完成后,返回给
浏览器结果,然后浏览器在按返回的信息又访问第二个servlet的类,故浏览器的url栏内容会产生变化。


请求转发

请求转发是服务器跳转,只会产生一次请求。转发的内容完全相同。
请求转发的语句是:request.getRequestDispatcher("/urlpattern").forword(request,response);

响应重定向原理

响应重定向则是浏览器端跳转,会产生两次请求。
响应重定向的语句是:response.sendRedirect("/projectname/url-pattern");

自定义属性:
请求是运行创建自定义属性
设置请求属性:request.setAttribute(属性名,属性值); //属性名必须是字符串
获取请求属性:Object attr = request.getAttribute(属性名);
如果在面试的时候被面试官问到请求转发与响应重定向的区别,一定要说,响应重定向是两次请求,而请求转发是一次请求。


浏览器Cookie

Cookie(小甜饼)是浏览器保存在本地文件的内容
Cookie常用于保存登陆状态、用户资料等小文本
Cookie具有时效性,Cookie内容会伴随请求发送给Tomcat
下面代码是设置Cookie
Cookie cookie = new Cookie("user","admin"); //创建Cookie对象必须为其传递两个参数,分别是参数名和参数值。
response.addCookie(cookie); //核心方法。将Cookie对象加入响应体中。
cookie.setMaxAge(60 * 60 * 24 * 7); //设置最大有效期,时间为秒。
//说明:响应体将带有cookie属性的内容返回给浏览器,之后每次浏览器再进行请求的时候就会将这个cookie的内容带上,
而服务器解析出带有cookie属性的请求时,就不必进行再次的验证
//如何再程序中解析cookie
再程序中调用request.getCookies();//该方法返回所有Cookies信息的数组。
//然后使用for循环遍历出Cookie中的信息
中间需要一点逻辑的判断:
Cookie[] cs = request.getCookies();
//当Cookie失效时,此处返回的时一个空值,对空值进行遍历会报空指针异常,因此再此处需要增加一个逻辑判断。

	if(cs == null){
	      response.getWriter().println("登陆失效");
	      return ;    //程序在此结束运行。
	}
	for(Cookie c:cs){
	      if(c.getName().equals("user"))
		{//如有相同,则代表存在user的值,用户无需再次登陆}      	
	}

Cookie的存在周期:当没有给Cookie设置存在周期的时候,它的周期就是当前的浏览器窗口。


Session - 用户会话

Session(用户会话)用于保存与“浏览器窗口“对应的数据
Session的数据存储在Tomcat服务器的内存中,具有时效性(时长30分钟)
Session通过浏览器Cookie的Sessionld值提取用户数据。

在servlet类当中使用:

HttpSession session = request.getSession(); //这样就获取到了一个session的对象。
session.setAttribute(“name”,“张三”); //为Session对象设置属性通过请求转发,将请求发送至另一个类request.getRequestDispatcher("/url-padding").forward(request,response);//在另一个类当中使用Session对象HttpSession session = request.getSession();String name = (String)request.getSession();`
//此处的name值与上面的是同一个对象。
//Session就是与浏览器窗口相绑定的,且保存在Tomcat服务器内存当中的对象


ServletContext(应用程序全局对象)

ServletContext(Servlet上下文对象),是Web应用全局对象。
一个Web应用只会创建一个ServletContext对象
ServletContext随着Web应用启动而自动创建。
初始化ServletContext对象

ServletContext context = request.getServletContext();
		context.setAttribute("属性名A","属性值");
		context.setAttribute("属性名B", "属性值");

	//初始化完成后便可以在任意Servlet类访问这个全局变量	
	ServletContext context = (ServletContext)request.getServletContext();
		String copyright = (String)context.getAttribute("copyright");
		String title = (String)context.getAttribute("title");
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().println("<h3>"+title+"</h3>");
		response.getWriter().println("<p>"+copyright+"</p>");

Java Web三大作用域对象

HttpServletRequest -请求对象
/它的声明周期最短,当一个请求被送往Tomcat,那么这个对象也就被创建了。
/当Servlet处理完成后,产生了响应并且返回给浏览器,那么这个对象也就被销毁了

HttpServletSession -用户会话对象
/用于保存于浏览器窗口所对应的数据,它的生命周期比Request要大一点。
/Session是用户第一次发来请求时被创建的,默认情况下该session在30min内没有被
/访问就会被自动的销毁。

ServletContext -web应用全局对象
/它在web应用启动的时候就被创建了,在web应用程序关闭或者重启才会被销毁。

它们的作用域是从上往下一次递增的。
建议:能用小作用域完成的功能就不要用大的作用域。


Web应用中的中文乱码由来

Tomcat默认使用字符集ISO-8859-1,属于西欧字符集。
解决乱码的核心思路是将ISO-8859-1转换为UTF-8
Servlet中请求与响应都需要设置UTF-8字符集
将乱码的字符串转化为utf-8的字符集:
String str = new String( address.getBytes("iso-8859-1"),"utf-8");
/目的就是将字符串address由原来的iso-8859-1字符集转换为utf-8的字符集并输出。request.setCharacterEncoding("UTF-8");
该方法将请求体中的字符集转换为UTF-8,而且该方法必须写在第一行。
使用该方法必须注意,该方法只能用于请求体中,也就是post请求当中。对于get是无效的。

对于get的请求://对于Tomcat 8.x版本,默认请求发送中文就是UTF-8格式,因此无需转换
对于Tomcat 7.0(包含)以前的版本:在tomcat文件夹中的conf文件夹中是tomcat服务器的重要
配置文件,找到servlet.xml文件,使用编辑器打开,然后再63附近找到如下的信息:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8" />
//在上面的这个文件中为其设置URIEncoding的选项为"UTF-8",这在Tomcat 8.x版本中无需设置,再7.0(包括)及其以下的版本中默认被设置为"ISO-8859-1";
//对于响应,则需要设置 response.setContextType(“text/html;charset=utf-8”);

小结:对于处理请求中的乱码问题,get与post请求的处理方式不相同
对于post来说,只需要设置request.setCharacterEncoding(“UTF-8”);
而对于get请求来说,tomcat 8.0的版本及其以上都不需要去特别设定
但是对于tomcat 7.0(包含)及其以下的版本,我们再其配置文件servlet.xml中设置URIEncoding=“UTF-8” ;
如果是响应中出现的乱码问题,则需要设置response.setContextType(“text/html;charset=utf-8”);


web.xml常用配置

修改web应用的默认首页
Servlet 通配符映射及初始化参数
设置404、500等状态码默认页面
web.xml文件当中默认设置了如下内容:

<welcome-file-list>
 	<welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
 	</welcome-file-list>

这是一个欢迎体,当访问的服务器值是指明了工程名时,它就会再webcontent的目录中需要上述的
描述文件,如果找到,就进行输出。
在url中设置不同的内容,然后在Servlet程序中获取到请求体中的url。
获取方法:request.getRequestURL(); //该语句返回的是StringBuilder
对象需要调用toString()方法获取字符串。
在web.xml的url-pattern中设置<index/> 其中是通配符,允许用户端使用任意字符。
在Servlet程序中使用:String id = url.substring(url.lastIndexOf("/")+1);
这样就可以对获取到的字符串信息进行处理。
在web.xml中设置全局变量:]

<context-param>
  		<param-name>copyright</param-name>
  		<param-value>2019 Baidu 使用百度前必读 意见反馈 京ICP证030175号</param-value>
  	</context-param>
  	<context-param>
  		<param-name>title</param-name>
  		<param-value>程序员的梦工厂</param-value>
  </context-param>

在程序中获取如下:
ServletContext context = request.getServletContext();
String copyright = context.getInitParameter("copyright");//获取web.xml中的配置变量。


设置404、500等状态码默认页面

将显示错误的html页面专门在一个文件夹进行管理,这里我再webContent的文件夹下新建一个error的文件夹
将其命名为404.html 500.html 分别对应出现两种错误时所要展现的页面
在web.xml文件中对其进行配置:

	<error-page>
	       <error-code>400</error-code>	//错误码
	       <location>/error/400.html</location>
	</error-page>

	<error-page>
	       <error-code>500</error-code>    //错误码
	       <location>/error/500.html</location>
	</error-page>

这样tomcat系统出现异常的时候就会显示我们自己设定的相应html网页。


面试或者面试的时候经常会问到:
在找工作之前要对这些对象进行强化的记忆。

JSP的九大内置对象
内置对象 描述
request 请求对象 -HttpServletRequest
response 相应对象 -HttpservletResponse
session 用户会话 -HttpSession
application 应用全局对象 -ServletContext
out 输出对象 -PrintWriter
page 当前页面对象 -this
pageContext 页面上下文对象 -PageContext
config 应用配置对象 -ServletConfig
exception 应用异常对象 -Throwable

exception的对象需要在标题首行增加 :isErrorPage="true"的设置。


Java Web 打包与发布

Java Web 应用采用war包进行发布
发布路径为:{TOMCAT_HOME}/webapps
Eclipse 支持war包导出。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值