JSP速成
有点像php,了解一下就行
文章目录
1. 简介
JSP(Java Server Pages),是Java的一种动态网页技术。
JSP可以看作一个Java Servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。
当第一次访问JSP页面时,Tomcat服务器会将JSP页面翻译成一个java文件,并将其编译为.class文件。JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
JSP生命周期:JSP页翻译->编译JSP页面->类加载->实例化(生成Servlet的对象被创建)->初始化(容器调用jspInit()
)->请求处理(容器调用jspService()
)->销毁(容器调用jspDestroy()
)
2. jsp演示
idea新建java项目,进该项目设置,添加web模块,依次点击create artifact
->apply
->ok
在新出现的web目录下新建index.jsp和index.html
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>hello World</h1>
<%!
int x=50;int y=50;
int add(int a,int b){return a+b;}
%>
<%= "数据是"+add(x,y) %>
<%
String name=request.getParameter("uname");
out.println("welcome "+name);
%>
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="index.jsp">
<input type="text" name="uname">
<input type="submit" value="go"></br>
</form>
</body>
</html>
pom.xml添加
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
点击edit configurations
,添加个tomcat服务器,tomcat的安装配置这里就不赘述了。
3. jsp元素(标签)
1. jsp脚本元素
在JSP中,可以使用脚本元素在jsp页面内编写java代码。脚本元素提供了在jsp中插入Java代码的能力。有三种类型的脚本元素:
//脚本标签
<% java source code %>
等价于xml语句:<jsp:scriptlet>代码片段</jsp:scriptlet>
//表达式标签
<%= statement %>
//声明标签,用于定义类级别的变量和方法
<%! field or method declaration %>
2. jsp指令元素
告诉web容器如何在jsp页面翻译成相应的servlet的消息。
//页面指令,设置jsp页面属性
<%@ page attribute="value" %>
比如:<%@ page contentType="text/html;charset=UTF-8" language="java" %>
//包含指令
<%@ include file="filename" %>
比如:<%@ include file="index.html" %>
//标签库指令,用于引入自定义标签库
<%@ taglib uri="uriofthetaglibrary" prefix="prefixoftaglibrary" %>
比如:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
//前缀是c,用法:<c:out value="taglib demo"></c:out>
3. jsp操作标签
或称动作标签
用于控制页面之间流动并使用java Bean
所有的动作要素都有两个属性:id属性和scope属性。
- id属性是动作元素的唯一标识,可以在JSP页面中引用。动作元素创建的id值可以通过PageContext来调用。
- scope属性用于识别动作元素的生命周期。 id属性和scope属性有直接关系,scope属性定义了相关联id对象的寿命。 scope属性有四个可能的值: (a) page, (b)request, ©session, 和 (d) application。
JSP Action Tags | Desciption |
---|---|
jsp:forward | 将请求转发到其他页面,通常用于实现请求的重定向 |
jsp:include | 包含另一个资源 |
jsp:useBean | 在页面中创建或定位一个 JavaBean 实例,使得页面可以使用该 JavaBean 中的属性和方法 |
jsp:setProperty | 设置 JavaBean 实例的属性值 |
jsp:getProperty | 获取 JavaBean 实例的属性值 |
jsp:plugin | 用于嵌入 Applet 或者其他对象到生成的页面中 |
jsp:param | 用于在包含其他页面或转发请求时,传递参数给被包含的页面或转发的目标页面 |
jsp:fallback | 在组件出现故障的错误时发送给用户错误信息 |
<jsp:forward page="pt.jsp"> <!--重定向至pt.jsp页面 -->
<jsp:include page="date.jsp" flush="true" />
<jsp:useBean id="name" class="package.class" />
<!--class指定Bean的完整包名,id指定Bean的名字-->
<jsp:useBean id="user" class="com.codingman.jspdemo.User" scope="session">
<jsp:setProperty name="user" property="name" value="lihua"/>
<jsp:setProperty name="user" property="pass" value="123456"/>
<jsp:getProperty name="user" property="pass" />
</jsp:useBean>
<jsp:plugin type="applet" codebase="dirname" code="MyApplet.class"
width="60" height="80">
<jsp:param name="fontcolor" value="red" /><!--param元素可用于向Applet 或 Bean 传递参数-->
<jsp:param name="background" value="black" />
<jsp:fallback>
Unable to initialize Java Plugin
</jsp:fallback>
</jsp:plugin>
4. JSP隐式对象
object | type | object | type |
---|---|---|---|
out | JspWriter | session | HttpSession |
request | HttpServletRequest | pageContext | PageContext |
response | HttpServletResponse | page | Object |
config | ServletConfig | exception | Throwable |
application | ServletContext |
out.println(666);
out.flush();
request.getParameter("name");
request.getHeader("headername");
response.sendRedirect("https://baidu.com");//重定向
response.setContentType("text/html");
response.setHeader("headerName", "headerValue");
//config 表示JSP页面的配置对象,包含初始化参数和Servlet上下文。
config.getInitParameter("dname");
ServletContext context = config.getServletContext();
//application 表示Web应用程序的上下文,可以在整个应用中共享数据。
application.setAttribute("appName", "MyApp");
String app = (String) application.getAttribute("appName");
//session 表示一个用户会话,用于在多个请求间保持用户数据。
session.setAttribute("username", "John");
String user = (String) session.getAttribute("username");
session.invalidate();
//pageContext 提供对各种范围对象(如page、request、session、application)的统一访问。
pageContext.setAttribute("age",18,PageContext.SESSION_SCOPE);
pageContext.getAttribute("age",PageContext.SESSION_SCOPE);
//page 表示当前的JSP页面对象,等同于this关键字。
page.getClass().getName()
web目录下新建hello目录
hello目录下新建error.jsp,index.html,second.jsp,welcome.jsp
error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>Sorry, an exception occured!</h3>
Exception is:
<%= exception%>
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="welcome2">
n1: <input type="text" name="n1"></br>
n2: <input type="text" name="n2"></br>
<input type="submit" value="除法"></br>
</form>
</body>
</html>
second.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<p>second page</p></br>
<%= "appName: "+application.getAttribute("appName")%>
<%= "uname: "+session.getAttribute("uname")%>
<%= "age: "+pageContext.getAttribute("age",PageContext.SESSION_SCOPE) %>
<%= page.getClass().getName()%>
<% this.log("message");%>
</body>
</html>
welcome.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
out.println("dname is "+config.getInitParameter("dname"));
String n1=request.getParameter("n1");
String n2=request.getParameter("n2");
int a=Integer.parseInt(n1);
int b=Integer.parseInt(n2);
int c=a/b;
out.println("division of numbers is "+c);
application.setAttribute("appName","myApp");
session.setAttribute("uname","zhangsan");
pageContext.setAttribute("age",18,PageContext.SESSION_SCOPE);
%>
<a href="second.jsp">second jsp page</a>
</body>
</html>
/web/WEB-INF/web.xml参考如下
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>aaa</servlet-name>
<jsp-file>/hello/welcome.jsp</jsp-file>
<init-param>
<param-name>dname</param-name>
<param-value>lihua</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>aaa</servlet-name>
<url-pattern>/hello/welcome2</url-pattern>
</servlet-mapping>
</web-app>
5. 表达式(EL)语言
简化了存储在Java Bean组件中的数据的可访问性,以及其他对象如请求,会话,应用程序等。在EL中,有许多隐含的对象,运算符和保留字。
${expression}
Object | 描述 |
---|---|
pageScope | page 作用域 |
requestScope | request 作用域 |
sessionScope | session 作用域 |
applicationScope | application 作用域 |
param | Request 对象的参数,字符串 |
paramValues | Request对象的参数,字符串集合 |
header | HTTP 信息头,字符串 |
headerValues | HTTP 信息头,字符串集合 |
cookie | cookie值 |
initParam | 获取上下文初始化参数 |
pageContext | 当前页面的pageContext |
${sessionScope.username}
${param["username"]}
${param.username}
${paramValues.arr1[0]} <!--访问数组第一个元素-->
${header["user-agent"]}
${headerValues["user-agent"]}
${cookie.JSEESSIONID.value}
${initParam.root} <!--获取web应用初始化参数-->
${pageContext.request.queryString}
6. JSP中的MVC
MVC代表模型视图合控制器。
控制器充当视图和模型之间的接口。控制器拦截所有传入的请求。比如:servlet
模型表示当前应用程序的状态,即数据。它还可以具有业务逻辑。比如:JavaBean
视图表示呈现,即UI(用户界面)。比如:jsp
在web目录下新建mvc目录
在mvc目录下新建index.jsp,loginSuccess.jsp,loginFail.jsp
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="login" method="post">
name: <input type="text" name="name"></br>
pass: <input type="password" name="pass"></br>
<input type="submit" value="login"></br>
</form>
</body>
</html>
loginSuccess.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" import="com.jk.mvc.loginBean"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<p>you are successfully logged in !</p>
<%
loginBean bean=(loginBean) request.getAttribute("bean");
out.print("welcome, "+bean.getName());
%>
</body>
</html>
loginFail.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<p>you are fail logged in !</p>
<%@ include file="index.jsp" %>
</body>
</html>
/src/main/java/com.jk目录下新建Package,名为mvc
mvc下新建java文件loginBean和LoginServlet
loginBean.java,用于数据封装和校验
package com.jk.mvc;
public class loginBean {
private String name,pass;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public boolean validate(){
if(pass.equals("123456")){
return true;
}else{
return false;
}
}
}
LoginServlet.java,用于处理url请求
package com.jk.mvc;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
public class LoginServlet extends HttpServlet{//Alt+Enter导入包
@Override
protected void doPost(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException{
String name = req.getParameter("name");
String pass = req.getParameter("pass");
loginBean bean=new loginBean();
bean.setName(name);
bean.setPass(pass);
req.setAttribute("bean", bean);
boolean status=bean.validate();
if(status){
RequestDispatcher rd=req.getRequestDispatcher("loginSuccess.jsp");
rd.forward(req,resp);
}else{
RequestDispatcher rd=req.getRequestDispatcher("loginFail.jsp");
rd.forward(req,resp);
}
}
}
web.xml添加一下LoginServlet类的url路径
<servlet>
<servlet-name>s1</servlet-name>
<servlet-class>com.jk.mvc.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>s1</servlet-name>
<url-pattern>/mvc/login</url-pattern>
</servlet-mapping>
7. JavaBean
JavaBean 是特殊的 Java 类,使用 Java 语言书写,并且遵守 JavaBean API 规范。
JavaBean有默认无参构造函数,实现了serializable接口,可能有一系列可读写属性,可能有一系列的 getter 或 setter 方法。
src/main/java/com/jk/student/StudentsBean.java
package com.jk.student;
public class StudentsBean implements java.io.Serializable
{
private String firstName = null;
private String lastName = null;
private int age = 0;
public StudentsBean() {
}
public String getFirstName(){
return firstName;
}
public String getLastName(){
return lastName;
}
public int getAge(){
return age;
}
public void setFirstName(String firstName){
this.firstName = firstName;
}
public void setLastName(String lastName){
this.lastName = lastName;
}
public void setAge(int age) {
this.age = age;
}
}
web目录下新建student文件夹
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<html>
<head>
<title>get 和 set 属性实例</title>
</head>
<body>
<jsp:useBean id="students"
class="com.jk.student.StudentsBean">
<jsp:setProperty name="students" property="firstName"
value="小强"/>
<jsp:setProperty name="students" property="lastName"
value="王"/>
<jsp:setProperty name="students" property="age"
value="10"/>
</jsp:useBean>
<p>学生名字:
<jsp:getProperty name="students" property="firstName"/>
</p>
<p>学生姓氏:
<jsp:getProperty name="students" property="lastName"/>
</p>
<p>学生年龄:
<jsp:getProperty name="students" property="age"/>
</p>
</body>
</html>
crud详见参考链接