文章目录
资源
菜鸟教程JSP
写代码这种事还是纸上得来终觉浅
建议一边敲一边学
不要觉得看完一遍就都会了
Servelet和JSP的分工
JSP用来写请求发起页和响应页
Servlet用来写后台的业务逻辑处理、数据库交互等
How does JSP works?
- Browser发送http请求给服务器
- Web服务器识别出其为对JSP网页的请求,将该请求传给JSP引擎
- JSP引擎将对应的JSP文件转换为Servlet,然后将其编译成可执行类,再将原始请求传给Servlet引擎
- 服务器某组件调用Servlet引擎,载入并执行Servlet类
- 执行时Servlet产生HTML格式的输出并将其内嵌于Response中交给Web服务器
- Web服务器将静态HTML返回到Browser
- Browser对其作解析
JSP生命周期
编译阶段
Servlet容器编译Servlet源文件,生成Servlet类
初始化阶段
加载与JSP对应的Servlet类,创建实例并调用 jspInit()
进行初始化
执行阶段
调用此Servlet实例的服务方法
void _jspService(HttpServletRequest request, HttpServletResponse response)
销毁阶段
调用此Servlet实例的销毁方法public void jspDestroy()
销毁此实例
基础语法####################
脚本程序的语法格式
<%
代码
%>
任何文本、HTML标签、JSP元素都要写在脚本程序之外
示例代码
<html>
<head>
<title>Hello World</title>
</head>
<body>
Hello World!<br/>
<%
out.println("Your IP address is " + request.getRemoteAddr());
%>
</body>
</html>
变量、方法声明
<%!
声明
%>
注意:声明就是声明,不能出现表达式、输出等
示例代码
<%! int i = 0; %>
<%! int a, b, c; %>
<%! Circle a = new Circle(2.0); %>
表达式
<%=
表达式
%>
表达式的值会被转换为String类型,所以可以在文本行中使用
表达式中不能使用分号
示例代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<p>
今天的日期是: <%= (new java.util.Date()).toLocaleString()%>
</p>
</body>
</html>
注释
<%--注释内容--%>
此种为JSP注释,仅服务器端可以看到,不会被编译或发送至Browser
<!--注释内容-->
此种为HTML注释,Browser查看源码时可以看到
判断语句
8.1 if-else 可以与HTML标签搭配使用
示例代码
<h3>IF...ELSE 实例</h3>
<% if (day == 1 | day == 7) { %>
<p>今天是周末</p>
<% } else { %>
<p>今天不是周末</p>
<% } %>
8.2 if-else 也可以全部封装到脚本程序标签中
示例代码
<%
if (i+b==15){
out.println("结果是15");
}
else {
out.println("结果不是15");
}
%>
8.3 switch-case只能全部封装到脚本程序标签中
示例代码
<% switch(i+b){
case(0):
out.println("switch 是0吗");
break;
case(15):
out.println("switch 是15吗");
break;
}
%>
循环语句
以for循环为例
可以与HTML标签搭配使用,也可全部封装
示例代码
<%for ( fontSize = 1; fontSize <= 3; fontSize++){ %>
<font
color="green" size="<%= fontSize %>">
Hello World!
</font>
<br/>
<%}%>
结果展示
运算符
字面量
即表达式右值
高级语法####################
JSP指令
用于设置与整个JSP页面相关的属性
JSP动作
<jsp:action_name attribute="value" />
JSP隐式对象
request:每当客户端请求一个JSP页面时都会有一个新的request对象代表这个请求,你可以从中获取HTTP头信息、Cookies、HTTP方法等
response:当创建一个request对象时就会创建一个对应的response对象,开发者通过它可以添加新的Cookies、返回HTTP状态码等
表单处理
方法
getParameter(): 使用 request.getParameter() 方法来获取表单参数的值。
getParameterValues(): 获得如checkbox类(名字相同,但值有多个)的数据。 接收数组变量
getParameterNames():该方法可以取得所有变量的名称,该方法返回一个 Enumeration。
getInputStream():调用此方法来读取来自客户端的二进制数据流。
示例代码
input.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<form action="receiver.jsp" method="POST">
站点名: <input type="text" name="name">
<br />
网址: <input type="text" name="url" />
<input type="submit" value="提交" />
</form>
</body>
</html>
reveiver.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<h1>使用 POST 方法读取数据</h1>
<ul>
<li><p><b>站点名:</b>
<%
// 解决中文乱码的问题
String name = new String((request.getParameter("name")).getBytes("ISO-8859-1"),"UTF-8");
%>
<%=name%>
</p></li>
<li><p><b>网址:</b>
<%= request.getParameter("url")%>
</p></li>
</ul>
</body>
</html>
GET&POST
示例代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>参数提取</title>
</head>
<body>
<table width="100%" border="1" align="center">
i love
<br>
<%=request.getParameter("name")%>
</table>
</body>
</html>
request.getParameter("参数名")
这个方法类似于
PHP的$_REQUEST["参数名"]
的使用
并不区分是GET还是POST传过来的
Cookie处理
什么是Cookie
简单说就是存放在客户端的一个文件
服务器可以给浏览器发送如包含用户名密码等的Cookie
浏览器把这些Cookie保存下来
下一次浏览器访问服务器时就会把对应的Cookie一块发过去
服务器利用它可以识别用户或做别的事情
如何使用JSP设置Cookie
- 创建一个Cookie对象,名称中不能包含空格或[ ] ( ) = , " / ? @ : ;
Cookie cookie = new Cookie("key","value");
- 设置有效期,单位为s
cookie.setMaxAge(60*60*24);
- 发送给客户端
response.addCookie(cookie);
请求Cookie
每次访问服务器上的站点时Browser都会向Server发送的数据
这个站点对tomcat来说就是一个工程的范围
也就是说不同的工程同时运行在tomcat上
访问A工程时B工程的Cookie是不会发送给Server的
响应Cookie
访问某个页面时Server给Browser发送的Cookie
用于增加/修改/删除Browser端的Cookie
EL和JSTL
- 下载jar包
- 解压后进入lib目录下有jstl.jar和standard.jar
- 把两个jar包放到工程的WEB-INF/lib目录下
- 新建JSP文件JSTL.jsp进行测试
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:out value="Hello JSTL"/>
</body>
</html>
访问时输出Hello JSTL表示成功
过滤器(Filter)
首先新建一个filter
右击包名myfilter -> New -> Filter -> 命名为 UserViewFilter
然后配置web.xml
在<web-app>
下添加
<filter>
<filter-name>UserViewFilter</filter-name>
<filter-class>myfilter.UserViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UserViewFilter</filter-name>
<url-pattern>/UserView.jsp</url-pattern>
</filter-mapping>
最主要的配置项是<url-pattern>
,这项参数指定了客户端请求何内容时触发过滤器,可以配置为/*
,即所有请求都走过滤器。
我这里配置的是/UserView.jsp
,即当客户端请求此页面时要经过滤器检测一些属性值,通过后方可放行到UserView.jsp,否则由过滤器作出响应
然后写Filter的代码,最主要是写doFilter方法
package myfilter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet Filter implementation class UserViewFilter
*/
@WebFilter("/UserViewFilter")
public class UserViewFilter implements Filter {
/**
* Default constructor.
*/
public UserViewFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
// 用传入的request和response初始化新的request和response对象
HttpSession session = req.getSession(true);
// 拿到req对象的session
resp.setContentType("text/html;");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
Enumeration e = session.getAttributeNames();
Boolean Check_islogin = false;
while(e.hasMoreElements()) {
if(session.getAttribute(e.nextElement().toString()).equals("islogin")) {
//如果session中有islogin的属性名
Check_islogin = true;
//再去检查islogin的值
}
}
if(Check_islogin) {
if(session.getAttribute("islogin").equals("yes")) {
//如果拿到session中islogin属性的值是"yes"
chain.doFilter(request, response);
// 则把原请求回传到过滤链,即放行请求
}
}
else {
//如果session中没有islogin属性名则直接拒绝访问
out.println("非法访问!点击<a href = "+"index.html"+">此处</a>返回首页");
}
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
System.out.println("初始化filter");
}
}
在处理用户登录请求的UserServlet中,如果用户登录成功则向session中添加一项属性
"islogin":"yes"
然后跳转至UserView.jsp
UserServlet部分代码如下
String nexturl = "UserView.jsp";
HttpSession session = request.getSession();
session.setAttribute("islogin", "yes");
//使用过滤器检测此项属性,防止游客不登录直接访问UserView.jsp
getServletContext().getRequestDispatcher(nexturl).forward(request,response);
每次重启服务器时可以看到filter被初始化
正常访问过程:
先登录
经UserServlet检查,确认登录成功session添加属性名"islogin",值为"yes"
然后跳转到UserView.jsp
非法访问过程:
不登录直接访问 UserView.jsp
过滤器作出响应