一、什么是JSP?
JSP全称Java Server Page, 一种动态网页开发技术。它允许使用EL表达式、JSTL来获取Java代码中的数据,同时允许在JSP中编写HTML代码,使得JSP可以非常容易的显示页面。JSP本质是Servlet,最终以Servlet方式运行,所以可以说JSP是一种特殊的Servlet。
二、JSP是如何组成的?
2.1静态内容
html静态文本
2.2 代码段Scriptlet
<% java代码; %>
2.3表达式
表达式的结果会直接被输出到页面中。要注意表达式的后面不能有;号
<%=pageContext.getAttribute("xxx") %>
2.4声明
JSP用来定义页面级变量(相当于类中的全局变量),以保存信息或定义JSP页面的其余部分可能需要的方法。
<%!int a=1;%>
2.5注释及其区别
第1种: <!-- HTML注释 --> //该注释会被编译,会通过Java代码输出发送至浏览器,浏
览器中可见
第2种: <%-- JSP注释 --%> //该注释只在JSP文件中可见,不会被编译,也不会被发送至
浏览器。
第3种: <% //java单行注释 %> <% /* java多行注释 */ %> //该注释会被编译,但不
会被发送至浏览器,在编译的Java文件中可以看到。
2.6指令
1.page指令用来导入指定类、编码等等。
<%@ page ... %>
属性 | 值 | 缺省值 |
---|---|---|
import | 类名或包名 | 无 |
language | 脚本语言名称 | “java” |
contentType | MIME类型和字符集 | “text/html” |
errorPage | 本地URL | 无 |
isErrorPage | 布尔值 | “false” |
错误页面的配置除了通过page指令中的errorPage跟isErrorPage来配置外,还可以通过web.xml中来配置全局的错误页面。可以通过错误代码跟错误类型来配置。
• 通过错误码来配置error-page
<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>
• 通过异常的类型配置error-page
<error-page>
<exception-type>java.lang.NullException</exception-type>
<location>/error.jsp</location>
</error-page>
2.taglib指令是为了定义标签。
<%@ taglib ... %>
3.include指令用来在JSP文件转换成Servlet时引入其他文件。
<%@ include file="URL" %>
jsp:include动作元素:在页面被请求的时候引入一个文件
<jsp:include page="URL" flush="true" />
include指令与jsp:include动作元素区别:
-
原理不同:
静态包含:先合并再翻译
动态包含:先翻译再包含 -
最终编译成java文件的数目不同。
静态包含在转换成为java文件的时候将包含文件的内容“复制”到主体文件,然后作为一个整体编译。最终编译为一个java文件。 -
静态包含在两个文件中不能有相同的变量,动态包含允许
-
语法不同:
静态包含语法: <%@inclue file=“被包含的页面”%>
动态包含语法: <jsp:include page=“被包含的页面”> -
参数传递不同 :
静态包含不能向被包含页面传递参数
动态包含可以使用jsp:param标签向被包含页面传递参数
2.7动作
1、jsp:useBean:寻找或者实例化一个JavaBean
<jsp:useBean id="sevenbean" class="com.seven.MyBean" scope="request" />
2、jsp:setProperty:设置JavaBean的属性
<jsp:setProperty property="age" name="sevenbean" param="ageParam" />
3、jsp:getProperty:输出某个JavaBean的属性
<jsp:getProperty name="sevenbean" property="name" />
注意:jsp:setProperty
和jsp:getProperty
标签不能单独使用,必须在之前使用<jsp:useBean />
标签。
案例:
1、创建JavaBean --Student
package com;
public class Student {
private String stuName;
private int stuAge;
private String stuSex;
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public int getStuAge() {
return stuAge;
}
public void setStuAge(int stuAge) {
this.stuAge = stuAge;
}
public String getStuSex() {
return stuSex;
}
public void setStuSex(String stuSex) {
this.stuSex = stuSex;
}
@Override
public String toString() {
return "Student{" +
"stuName='" + stuName + '\'' +
", stuAge=" + stuAge +
", stuSex='" + stuSex + '\'' +
'}';
}
}
2、实例化JavaBean
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%-- 实例化JavaBean --%>
<%-- 实例化的id 要与设置属性的name名一致,class表示寻找包下的useBean类(Student) scope表示服务器中四个池子在谁里面进行存取--%>
<jsp:useBean id="student" class="com.Student" scope="session" />
<%--设置JavaBean 属性--%>
<%-- 实例化的id 要与设置属性的name名一致,propety表示设置Java useBean中的哪个属性 value设置值 param表示设置从html页面被服务器getParameter("xxx")的属性,切记要与("xxx")中设置的参数一致 --%>
<jsp:setProperty name="student" property="stuName" value="zhangsan" param="xxx" />
<jsp:setProperty name="student" property="stuAge" value="22" param="xxx"/>
<jsp:setProperty name="student" property="stuSex" value="男" param="xxx"/>
<%-- 获取JavaBean 属性 --%>
<%-- 实例化的id 要与设置属性的name名一致,propety表示获取Java useBean中的哪个属性的值 --%>
<jsp:getProperty name="student" property="stuName"/>
<jsp:getProperty name="student" property="stuAge"/>
<jsp:getProperty name="student" property="stuSex"/>
</body>
</html>
3、启动服务器
就可以取到 - -<zhangsan 22 男 >- -三个值了。
提醒:
<%--当创建的Student类中 paivate String stuName; 与jsp:useBean中的
param="stuName" 一致时可用如下 --%>
<jsp:setProperty name="student" property="*" />
4、jsp:forward:把请求转到一个新的页面
<jsp:forward page="new URL">
比如:
<jsp:forward page="a_02.jsp">
<jsp:param value="zhangsan" name="name"/>
<jsp:param value="123" name="pwd"/>
</jsp:forward>
三、JSP生命周期
jsp本质是一个Servlet,它比Servlet的生命周期多了一个编译阶段。
翻译阶段
编译阶段
实例化阶段
初始化阶段
执行阶段
销毁阶段
回收阶段
四、JSP四大作用域(重点)
page:作用在当前的JSP页面内有效
//设置参数
pageContext.setAttribute(“key”, “value”);
//获取参数
pageContext.getAttribute(“key”);
request:作用在请求阶段,当浏览器刷新页面或跟换浏览器后作用域消失
//设置参数
request.setAttribute(“key”, “value”);
//获取参数
request.getAttribute(“key”);
session:作用在整个会话,当浏览器关闭后作用域消失
//servlet中设置参数
request.getSession().setAttribute(“key”, “value”);
//jsp中设置参数
session.setAttribute(“key”, “value”);
//获取参数
session.getAttribute(“key”);
application:作用在整个应用程序,当服务器关闭后作用域消失
//Servlet设置参数
request.getServletContext().setAttribute(“key”, “value”);
//jsp设置参数
application.setAttribute(“key”, “value”);
//获取参数
application.getAttribute(“key”);
例:用JSP设计一个简单的访问次数计时器
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%!
Integer count=0;
%>
<%
count= (Integer) session.getAttribute("count");
if(count==null||count==0){
//第一次访问
count=1;
}else{
//第二次访问
count++;
}
session.setAttribute("count",count);
%>
访问了<%= count%>次
</body>
</html>
五、Jsp九大隐式对象(内置对象)
- request:HttpServletRequest对象,代表请求
- response:HttpServletResponse对象,代表响应
- out:JspWriter对象,代表输出
- session:HttpSession对象,代表每个会话
- application:ServletContext应用对象,代表整个应用程序
- config:ServletConfig配置对象,代表配置文件中的信息
- pageContext:PageContext对象页面上下文对象,包含页面信息
- page:当前页面对象(this)(基本不使用)
- exception:Throwable异常对象,包含jsp异常信息
六、MVC模式
1、 model1 (现已淘汰)
在Model1模式下,整个Web应用几乎全部由JSP页面组成,JSP页面接受处理客户端请求,对请求处理后直接做出响应。用少量的JavaBean来处理数据库连接、数据库访问等操作。从工程化角度看,它的局限性非常明显;JSP的职责不单一,身兼View和Controller两种角色,将控制逻辑职和表现逻辑混杂在一起,职责过重,代码的可复用性低,不便于维护。
2、model2(常用)
Model2就是MVC的一个成功应用。模型(JavaBean)、视图(JSP)、控制器(Servlet)。正如下图所示,Model2下的JSP不在承担控制器的责任,它仅仅是表现层角色,仅仅用于将结果呈现给用户。浏览器发来的请求与Servlet(控制器)交互,而Servlet负责与后台的JavaBean通信。在Model2模型下,模型(Model)由JavaBean充当,视图(View)有JSP页面充当,而控制器(Controller)则由Servlet充当。
例:用model2设计用户登录
注意:导入相应的包
登录功能项目工程结构:
1、bean层User类实现:
package com.bean;
public class User {
private String userName;
private String userPwd;
public User() {
}
public User(String userName, String userPwd) {
this.userName = userName;
this.userPwd = userPwd;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", userPwd='" + userPwd + '\'' +
'}';
}
}
2.1、dao层impl包下UserDaoImpl类实现:
package com.dao.impl;
import com.bean.User;
import com.dao.UserDao;
import com.util.DBUtils;
public class UserDaoImpl implements UserDao {
@Override
public boolean userLogin(User user) {
String sql="select * from user where user_name=? and user_pwd=?";
User result = DBUtils.queryOneToBean(sql, User.class, user.getUserName(), user.getUserPwd());
return result!=null;
}
}
2.1、dao层UserDao接口实现:
package com.dao;
import com.bean.User;
public interface UserDao {
public boolean userLogin(User user);
}
3.1、service层impl包下UserServiceImp类实现:
package com.service.impl;
import com.bean.User;
import com.dao.UserDao;
import com.dao.impl.UserDaoImpl;
import com.service.UserService;
public class UserServiceImpl implements UserService {
private UserDao userDao=new UserDaoImpl();
@Override
public boolean userLogin(User user) {
return userDao.userLogin(user);
}
}
3.2、service层UserService接口实现:
package com.service;
import com.bean.User;
public interface UserService {
public boolean userLogin(User user);
}
4、servlet层LoginServlet实现:
package com.servlet;
import com.bean.User;
import com.service.UserService;
import com.service.impl.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String name = req.getParameter("userName");
String pwd = req.getParameter("userPwd");
//验证用户名跟密码是否正确,正确显示正确页面,错误显示错误页面
UserService userService = new UserServiceImpl();
User user = new User(name,pwd);
boolean result = userService.userLogin(user);
if(result){
/*这里也可以用res.sendRedirect("xxx");来进行页面跳转*/
req.getRequestDispatcher("success.jsp").forward(req,resp);
}
/*这里也可以用res.sendRedirect("xxx");来进行页面跳转*/
req.getRequestDispatcher("faile.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
5、util工具类DBUtils实现:
package utils;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import org.apache.commons.dbutils.BasicRowProcessor;
import org.apache.commons.dbutils.GenerousBeanProcessor;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import com.alibaba.druid.pool.DruidDataSource;
public class DBUtils {
private static final String DRIVER = "com.mysql.jdbc.Driver";
private static final String DATABASE = "jsp" ;
private static final String USER = "root";
private static final String PWD = "root";
private static final String URL = "jdbc:mysql://127.0.0.1:3306/"+DATABASE+"?useUnicode=true&characterEncoding=UTF-8";
private static QueryRunner runner ;
static{
DruidDataSource ds = new DruidDataSource();
ds.setUrl(URL);
ds.setUsername(USER);
ds.setPassword(PWD);
ds.setDriverClassName(DRIVER);
runner = new QueryRunner(ds);
}
//增删改
public static int udpate(String sql ,Object... param ){
try {
return runner.update(sql, param);
} catch (SQLException e) {
e.printStackTrace();
}
return 0 ;
}
//BeanHandler将查询结果的第一行数据,封装到Bean对象
public static<T> T queryOneToBean(String sql, Class<T> clazz,Object... param ){
try {
BasicRowProcessor brp = new BasicRowProcessor(new GenerousBeanProcessor());
return runner.query(sql, new BeanHandler<T>(clazz,brp),param);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//MapHandler 将查询结果的第一行数据封装到map结合(key=列名,value=列值)
public static Map<String,Object> queryOneToMap(String sql, Object... param ){
try {
return runner.query(sql,new MapHandler(),param);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
// BeanListHandler将查询结果的每一行封装到Bean对象,然后再存入List集合
public static<T> List<T> queryAllList(String sql, Class<T> clazz,Object... param ){
try {
BasicRowProcessor brp = new BasicRowProcessor(new GenerousBeanProcessor());
return runner.query(sql, new BeanListHandler<T>(clazz,brp),param);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//MapListHandler将查询结果的每一行封装到map集合(key=列名,value=列值),再将map集合存入List集合
public static List<Map<String,Object>> queryAllMap(String sql, Object... param ){
try {
return runner.query(sql,new MapListHandler(),param );
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
6、login.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<form action="LoginServlet" method="post">
用户名:<input name="userName" /><br>
密码:<input name="userPwd" /><br>
<input type="submit">
</form>
</body>
</html>
7、success.jsp页面和faile.jsp页面
success.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>登录成功!</h1>
</body>
</html>
faile.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>登录失败!</h1>
</body>
</html>
数据库部分
结果: