JSP是Java Server Pages的简称,跟Servlet一样可以动态生成HTML响应, JSP文件命名为xxx.jsp。
与Servlet不同,JSP文件以HTML标记为主,然后内嵌Java代码段,用于处理动态内容。
<%@ 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
● 声明区
● 程序代码区
● 表达式
● 注释
● 指令和动作
● 内置对象
● 基本语法:
<%! %>
● 说明:可以定义全局变量、方法、类。
<%! int i; public void show(){ System.out.println("show方法"); } %>
● 基本语法:
<%程序代码区%>
● 说明:可以定义局部变量以及放入任何的Java程序代码。
<% int ib = 20; for (int i = 0; i < 3; i++) { System.out.println(i); } %>
● 基本语法:
<%=… …%>
● 说明:可以输出一个变量或一个具体内容,但=后面必须是字符串变量或者可以被转换成字符串的表达式。
● 注意:不需要以;结束,只有一行
<%=“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>
格式: <!--… …--> HTML文件的注释,浏览器可以查看到 <%--… …--%> JSP文件的注释,浏览器看不到 <%//… …%> Java语言中的单行注释,浏览器看不到 <%/*… …*/%> Java语言中的多行注释,浏览器看不到 注释的内容不会被执行
● 指令格式:
<%@指令 属性=“属性值”%>
● 指令的属性可以设定多个。
● JSP常用指令有:page、taglib、include。
● page指令用于导包和设置一些页面属性,常用属性如下:
import 导入相应的包,惟一允许在同一文档中多次出现的属性 contentType 设置Content-Type响应报头,标明即将发送到浏览器的文档类型 pageEncoding 设置页面的编码 language 指定页面使用的语言 session 控制页面是否参与HTTP会话 errorPage 处理当前页面中抛出但未被捕获的任何异常 isErrorPage 当前页是否可以作为其他页面的错误处理页面
● taglib指令用来扩展JSP程序的标签元素,引入其他功能的标签库文件。
<!-- prefix属性用于指定库前缀 --> <!-- uri属性用于指定库的标识 --> <%@taglib uri=“tagLibary” prefix=“prefix”%>
● include指令用于引入另一个JSP程序或HTML文件等,格式如下:
<%@include file=“被包含的文件地址%>
● 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指令是在JSP程序的转换时期就将file属性所指定的程序内容嵌入再编译执行(静态包含)。
● include动作在转换时期是不会被编译的,只有在客户端请求时期被执行到才会被动态的编译载入(动态包含,推荐)。
● forward动作用于在JSP中实现转发,将请求转发到另一个指定的JSP程序或者Servlet中处理。
<jsp:forward page=“urlSpec” flush=“true”/> <jsp:forward page=“urlSpec”> <!-- 用于指定参数和其对应的值 --> <jsp:param name=“key” value=“value”/> </jsp:forward>
● 在JSP程序中有9个内置对象由容器为用户进行实例化,程序员可以不用定义就直接使用这些变量。
● 在JSP转换成Servlet后,会自动追加这些变量的定义,使用内置对象可以简化JSP的开发。
● out内置对象是一个缓冲的输出流,用来给客户端输出信息。
● 常用方法
● request对象封装的是调用JSP页面的请求信息,它是HttpServletRequest接口的一个实例。
● 该对象的属性值只在一个请求中保存。
● 常用方法
● response对象用于给客户端相应输出处理结果,它是HttpServletResponse接口的一个实例。
● 经常用于设置HTTP标题,添加cookie、设置响应内容的类型和状态、发送HTTP重定向和编码URL。
● 常用方法
● session对象表示浏览器和服务器之间的一次会话,一次会话可以包含多次请求,在多次请求之间可以借助session对象存储信息,它是HttpSession类型的一个实例。
● 该对象的属性值在一次会话范围中保存,保存在服务器端,只要不关闭浏览器,默认半个小时内都可以访问。
● 常用方法
● application对象是一个web程序的全局变量,它是ServletContext类型的一个实例。
● 在整个服务器上保存数据,所有用户共享。
● 常用方法
● pageContext对象是PageContext类型的对象,可以使用这个对象来管理其他的隐含对象。
● 只在一个页面中保存数据。
● 常用方法
● 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 是使用 Java 语言开发的一个可重用的组件,在 JSP 开发中可以使用 JavaBean 减少重复代码,使整个 JSP 代码的开发更加简洁。
● JavaBean本质上就是Java类,通常要求如下:
属性:全部私有化,通过get和set方法进行访问。
方法:必须是public关键字修饰。
构造器 :必须有无参构造方法。
● 使用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="属性名"/>
JavaBean的保存范围有page、request、session以及application,默认是page范围。
<% 内置对象.removeAttribute(“JavaBean的名字”); %>
● MVC是模型(Model)和视图(View)以及控制器(Controller)的简写,是一种将数据、界面显示和业务逻辑进行分离的组织方式,这样在改进界面及用户交互时,不需要重新编写业务逻辑,从而提高了代码的可维护性。
● M:主要用于封装业务数据的JavaBean(Bean) 和 业务逻辑的JavaBean(Service)及访问数据库的DAO对象。
● V:主要负责数据收集 和 数据展现,通常由JSP文件完成。
● C:主要负责流程控制 和 页面跳转,通常由Servlet完成。
<%-- 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); } }