Java Web是基础,JSP往里走。

一、什么是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”
contentTypeMIME类型和字符集“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:setPropertyjsp: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九大隐式对象(内置对象)

  1. request:HttpServletRequest对象,代表请求
  2. response:HttpServletResponse对象,代表响应
  3. out:JspWriter对象,代表输出
  4. session:HttpSession对象,代表每个会话
  5. application:ServletContext应用对象,代表整个应用程序
  6. config:ServletConfig配置对象,代表配置文件中的信息
  7. pageContext:PageContext对象页面上下文对象,包含页面信息
  8. page:当前页面对象(this)(基本不使用)
  9. 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>

数据库部分
在这里插入图片描述
在这里插入图片描述
结果:
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值