一、JSP的概述
1.JSP的概念
JSP是Java Server Pages的简称,跟Servlet一样可以动态生成HTML响应, JSP文件命名为xxx.jsp。
与Servlet不同,JSP文件以HTML标记为主,然后内嵌Java代码段,用于处理动态内容。
2.JSP的示例
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello Time</title>
</head>
<body>
现在的时间是:<%= new Date()%>
</body
3.JSP与Servlet的关系
二、JSP的语法
1.JSP语法结构
● 声明区
● 程序代码区
● 表达式
● 注释
● 指令和动作
● 内置对象
2.声明区
● 基本语法:
<%! %>
● 说明:可以定义全局变量、方法、类。
<%!
int i;
public void show(){
System.out.println("show方法");
}
%>
3.程序代码区
● 基本语法:
<%程序代码区%>
● 说明:可以定义局部变量以及放入任何的Java程序代码。
<%
int ib = 20;
for (int i = 0; i < 3; i++) {
System.out.println(i);
}
%>
4.表达式
● 基本语法:
<%=… …%>
● 说明:可以输出一个变量或一个具体内容,但=后面必须是字符串变量或者可以被转换成字符串的表达式。
● 注意:不需要以;结束,只有一行
<%=“hello world”%>
<%=i+1%>
● 案例
使用for循环输出一个html语言的表格,具体表头如下:
id name age salary
1 1 1 1
2 2 2 2
...
5 5 5 5
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>绘制表格</title>
</head>
<body>
<table>
<tr>
<td>id</td>
<td>name</td>
<td>age</td>
<td>salary</td>
</tr>
<%
for (int i = 1; i < 6; i++) {
%>
<tr>
<td><%= i %></td>
<td><%= i %></td>
<td><%= i %></td>
<td><%= i %></td>
</tr>
<%
}
%>
</table>
</body>
</html>
5.注释
格式:
<!--… …--> HTML文件的注释,浏览器可以查看到
<%--… …--%> JSP文件的注释,浏览器看不到
<%//… …%> Java语言中的单行注释,浏览器看不到
<%/*… …*/%> Java语言中的多行注释,浏览器看不到
注释的内容不会被执行
6.指令和动作
● 指令格式:
<%@指令 属性=“属性值”%>
● 指令的属性可以设定多个。
● JSP常用指令有:page、taglib、include。
①page指令
● page指令用于导包和设置一些页面属性,常用属性如下:
import 导入相应的包,惟一允许在同一文档中多次出现的属性
contentType 设置Content-Type响应报头,标明即将发送到浏览器的文档类型
pageEncoding 设置页面的编码
language 指定页面使用的语言
session 控制页面是否参与HTTP会话
errorPage 处理当前页面中抛出但未被捕获的任何异常
isErrorPage 当前页是否可以作为其他页面的错误处理页面
②taglib指令
● taglib指令用来扩展JSP程序的标签元素,引入其他功能的标签库文件。
<!-- prefix属性用于指定库前缀 -->
<!-- uri属性用于指定库的标识 -->
<%@taglib uri=“tagLibary” prefix=“prefix”%>
③include指令
● include指令用于引入另一个JSP程序或HTML文件等,格式如下:
<%@include file=“被包含的文件地址%>
④jsp:include/jsp:param
● jsp:include动作用于引入另一个JSP程序或HTML文件等。
● 执行到include时,被include的文件才会被编译。
● 如果include的是jsp文件,那它不会被转换成Servlet文件。
<jsp:include page=“URLSpec” flush=“true”/>
<jsp:include page=“URLSpec” flush=“true”>
<jsp:param name=“key” value=“value”/>
</jsp:include>
⑤include指令和include动作的区别
● include指令是在JSP程序的转换时期就将file属性所指定的程序内容嵌入再编译执行(静态包含)。
● include动作在转换时期是不会被编译的,只有在客户端请求时期被执行到才会被动态的编译载入(动态包含,推荐)。
⑥jsp:forward/jsp:param
● forward动作用于在JSP中实现转发,将请求转发到另一个指定的JSP程序或者Servlet中处理。
<jsp:forward page=“urlSpec” flush=“true”/>
<jsp:forward page=“urlSpec”>
<!-- 用于指定参数和其对应的值 -->
<jsp:param name=“key” value=“value”/>
</jsp:forward>
三、JSP内置对象(重点)
1.基本概念
● 在JSP程序中有9个内置对象由容器为用户进行实例化,程序员可以不用定义就直接使用这些变量。
● 在JSP转换成Servlet后,会自动追加这些变量的定义,使用内置对象可以简化JSP的开发。
2.对象名称
3.out内置对象
● out内置对象是一个缓冲的输出流,用来给客户端输出信息。
● 常用方法
4.request内置对象
● request对象封装的是调用JSP页面的请求信息,它是HttpServletRequest接口的一个实例。
● 该对象的属性值只在一个请求中保存。
● 常用方法
5.response内置对象
● response对象用于给客户端相应输出处理结果,它是HttpServletResponse接口的一个实例。
● 经常用于设置HTTP标题,添加cookie、设置响应内容的类型和状态、发送HTTP重定向和编码URL。
● 常用方法
6.session内置对象
● session对象表示浏览器和服务器之间的一次会话,一次会话可以包含多次请求,在多次请求之间可以借助session对象存储信息,它是HttpSession类型的一个实例。
● 该对象的属性值在一次会话范围中保存,保存在服务器端,只要不关闭浏览器,默认半个小时内都可以访问。
● 常用方法
7.application内置对象
● application对象是一个web程序的全局变量,它是ServletContext类型的一个实例。
● 在整个服务器上保存数据,所有用户共享。
● 常用方法
8.pageContext内置对象
● pageContext对象是PageContext类型的对象,可以使用这个对象来管理其他的隐含对象。
● 只在一个页面中保存数据。
● 常用方法
9.exception内置对象
● exception 对象是Throwable的实例,表示的是JSP的异常信息。
● 如果要使用它,必须将对应页面page指令的isErrorPage属性设置成true。
● 单个页面的处理方式
<%@page errorPage="error.jsp" %>
● 在web.xml中配置统一的异常处理页面。
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error.jsp</location>
</error-page>
四、JavaBean组件
1.基本概念
● JavaBean 是使用 Java 语言开发的一个可重用的组件,在 JSP 开发中可以使用 JavaBean 减少重复代码,使整个 JSP 代码的开发更加简洁。
● JavaBean本质上就是Java类,通常要求如下:
属性:全部私有化,通过get和set方法进行访问。
方法:必须是public关键字修饰。
构造器 :必须有无参构造方法。
2.使用方式
● 使用jsp:useBean的方式创建javaBean实例
<jsp:useBean id="对象名" scope="保存范围" class="包名.类名" />
保存范围有:page|request|sessin|application,默认为page范围。
● 使用jsp:setProperty的方式设置javaBean的属性值
<jsp:setProperty name="对象名" property="属性名" value="属性值" param="参数名"/>
● 使用jsp:getProperty的方式获取javaBean的属性值
<jsp:getProperty name="对象名" property="属性名"/>
3.保存范围
JavaBean的保存范围有page、request、session以及application,默认是page范围。
4.删除方式
<%
内置对象.removeAttribute(“JavaBean的名字”);
%>
五、MVC设计模式
1.基本概念
● MVC是模型(Model)和视图(View)以及控制器(Controller)的简写,是一种将数据、界面显示和业务逻辑进行分离的组织方式,这样在改进界面及用户交互时,不需要重新编写业务逻辑,从而提高了代码的可维护性。
● M:主要用于封装业务数据的JavaBean(Bean) 和 业务逻辑的JavaBean(Service)及访问数据库的DAO对象。
● V:主要负责数据收集 和 数据展现,通常由JSP文件完成。
● C:主要负责流程控制 和 页面跳转,通常由Servlet完成。
2.基本模型
<%-- login.jsp --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<form action="login" method="post">
用户名:<input type="text" name="userName"/><br/>
密 码:<input type="text" name="password"/><br/>
<span style="color: red">
<%= request.getAttribute("error")==null?"":request.getAttribute("error")%><br/>
</span>
<input type="submit" value="登录"/>
</form>
</body>
</html>
<%-- main.jsp --%>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>欢迎<%= ((User)session.getAttribute("user")).getUserName()%>使用</h1>
</body>
</html>
//servlet层
//LoginServlet.java
@WebServlet(name = "LoginServlet",urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String userName = request.getParameter("userName");
String password = request.getParameter("password");
System.out.println("获取到的用户名:" + userName);
System.out.println("获取到的密码:" + password);
//创建UserService类型对象实现数据的校验功能
UserService userService = new UserService();
User user = userService.userLoginService(new User(userName, password));
if (null == user){
System.out.println("登陆失败,用户名或密码错误");
request.setAttribute("error","登录失败,用户名或密码错误");
//实现服务器跳转 共享request 和 response
RequestDispatcher requestDispatcher = request.getRequestDispatcher("login.jsp");
requestDispatcher.forward(request,response);
}else {
System.out.println("登陆成功");
//将登录成功的用户信息放入session对象中实现多个请求共享
request.getSession().setAttribute("user",user);
//实现客户端的跳转
response.sendRedirect("main.jsp");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
//dao层
//UserDaoFactory.java
public class UserDaoFactory {
//通过静态工厂方法模式实现UserDao实现类对象的创建并返回
public static UserDao getUserDao(){
return new UserDaoImpl();
}
}
//UserDao.java
public interface UserDao {
public abstract User userLogin(User user);
}
//UserDaoImpl.java
public class UserDaoImpl implements UserDao{
@Override
public User userLogin(User user) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//1.获取数据库连接
connection = DBUtil.getConnection();
//2.准备sql语句
String sql = "select * from t_user where userName= ? and password = ?";
//3.执行sql语句获取返回值并返回
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,user.getUserName());
preparedStatement.setString(2,user.getPassword());
resultSet = preparedStatement.executeQuery();
if (resultSet.next()){
User tu = new User(resultSet.getString("userName"),resultSet.getString("password"));
return tu;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
//4.释放资源
DBUtil.closeResource(connection,preparedStatement);
if (resultSet != null){
resultSet.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return null;
}
}
//util层
//DBUtil.java
public class DBUtil {
private static String jdbcName; //用于描述驱动信息
private static String dbUrl; //用于描述URL信息
private static String dbUserName; //用于描述用户名信息
private static String dbPassword; //用于描述密码信息
//静态成员初始化操作
static {
jdbcName = "com.mysql.jdbc.Driver";
dbUrl = "jdbc:mysql://localhost:3306/db_web";
dbUserName = "root";
dbPassword = "123456";
try {
Class.forName(jdbcName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection() throws SQLException {
Connection con = DriverManager.getConnection(dbUrl,dbUserName,dbPassword);
return con;
}
//关闭连接
public static void closeResource(Connection con, PreparedStatement ps) throws SQLException {
if (null != con){
con.close();
}
if (null != ps){
ps.close();
}
}
}
//bean层
//User.java
public class User {
private int id;
private String userName;
private String password;
public User() {
}
public User(String userName, String password) {
this.userName = userName;
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", password='" + password + '\'' +
'}';
}
}
//service层
//UserService.java
public class UserService {
private UserDao userDao;
//自定义成员方法实现根据参数指定的User对象调用Dao层实现登录功能
public UserService(){
this.userDao = UserDaoFactory.getUserDao();
}
public User userLoginService(User user){
return userDao.userLogin(user);
}
}
//UserServiceTest.java
public class UserServiceTest {
public static void main(String[] args) {
UserDao userDao = new UserDaoImpl();
UserService userService = new UserService();
User admin = userService.userLoginService(new User("admin", "123456"));
System.out.println("找到的数据为" + admin);
}
}