jsp及MVC的简单使用

一.基本的脚本代码

运行原理:
浏览器访问服务器,服务器找到jsp页面,服务器对jsp文件翻译成.java文件,再进行编译成.class文件,再放入服务器中执行。
简单来说:JSP文件翻译成Java文件,将这个Java文件编译生成class文件,运行class文件。

  1. JSP的脚本元素的分类
  • 声明标签
    语法:
    <%! 变量或方法声明 %>
    写在这个脚本中的代码,翻译成Servlet内部的成员变量或成员方法。

  • 表达式标签
    语法:
    <%= 表达式 %>
    写在这个脚本中的代码,翻译成方法内部的out.print();当中的内容。

  • 程序代码标签
    语法:
    <% 程序代码 %>
    写在这个脚本中的代码,翻译成方法内部的局部变量或方法内部代码片段。
    简单的示例:

 <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
      <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>Insert title here</title>
	  </head>
	  <body>
   			<!-- 成员变量 -->
			<%! int a = 10; %>
			<!-- 局部变量 -->
			<% int b = 20; %>
			<!-- 输出语句,相当于Out.print() -->
			<%=a+b %>
	  </body>
</html>

注意:jsp属于文件,访问时候需要加上文件夹名和后缀

二.MVC

  • M:model模型层 JavaBean
  • V:view视图层 Jsp
  • C:Control控制层 Servlet

三.路径问题

  1. 分类
    相对路径:相对路径不是以 / 开头的。

    绝对路径:通常以 / 开始的路径(常用
    注意:
    绝对路径分成服务器端路径和客户端路径
    客户端路径 需要带工程名
    服务器端路径 不需要带工程名

  2. 注意事项:
    在访问本机时,绝对路径可以省略http://localhost:8080,直接写/文件名/项目名
    这个路径问题,在后面的代码中会有对应的体现

四.域对象

定义:公共容器

  • request域对象范围:就是请求到回应

  • getServletContent域对象范围:就是整个web项目,从服务器开始到结束

  • 域对象的方法都一样:

    setAttribute(key,value);
    getAttribute(key, value);
    removeAttribute(key, value);

五.重定向和请求转发的区别

  1. 重定向:
    response.sendRedirect("/anli01/jsp/admin.jsp");
  2. 请求转发:
    request.getRequestDispatcher("/jsp/Zhuce.jsp").forward(request, response);
  3. 区别(借钱案例):
     请求转发是一次请求一次响应,而重定向是两次请求两次响应。
     请求转发地址栏不会变化的,重定向地址栏发生变化。
     请求转发路径不带工程名,重定向需要带工程名路径。
     请求转发只能在本网站内部,重定向可以定向到任何网站。
    跳转的外网:重定向
    带值转发:请求转发
  4. 注意:
    如果需要使用request进行值传递,需要通过请求转发完成。如果页面需要跳转到其他网站上必须使用重定向。

六.MVC的综合案例

下面面试主要代码:
步骤:
1.创建数据表:表明user,数据类型见UserBean类
2.配置项目环境:
3.实现jsp页面(View)Admin.jsp:

<body>

<%
String msg = (String)request.getAttribute("msg");
if(msg == null){
	msg = "";
}
%>
<h4><%=msg %></h4>
	<form class="form-horizontal" action="/anli01/AdminServlet" method="post">
		<div class="form-group">
			<label for="inputEmail3" class="col-sm-2 control-label">账号</label>
			<div class="col-sm-10">
				<input type="text" class="form-control" id="username" name = "username"
					placeholder="请输入账号">
			</div>
		</div>
		<div class="form-group">
			<label for="inputPassword3" class="col-sm-2 control-label">密码</label>
			<div class="col-sm-10">
				<input type="password" class="form-control" id="password" name="password"
					placeholder="请输入密码">
			</div>
		</div>
		<div class="form-group">
			<div class="col-sm-offset-2 col-sm-10">
				
				<input type="submit" class="btn btn-default" value="提交"/>
			</div>
		</div>
	</form>
</body>

4.使用Servlet进行控制(Control)包括数据的接受和转发:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	    
		try {
			//设置编码
			request.setCharacterEncoding("UTF-8");
			//获取页面的数据
			String username = request.getParameter("username");
			String password = request.getParameter("password");
			//利用Bean来封装数据
			User user = new User();
			user.setUsername(username);
			user.setPassword(password);
			//数据处理,利用AdminModel类来连接数据库并操作
			AdminModel am = new AdminModel();
			User reuser = am.login(user);
			
			//判断.跳转
			if (reuser == null) {
				//使用请求域来传递信息
				request.setAttribute("msg", "账号或密码错误");
				//请求转发
				request.getRequestDispatcher("/jsp/admin.jsp").forward(request, response);
			}else {
				//getServletContext()域对象是用来计数
				int num = (int) this.getServletContext().getAttribute("num");			
				num++;
				//把结果再放回域中
				this.getServletContext().setAttribute("num", num);
				//重定向				
				response.sendRedirect("/anli01/jsp/success.jsp");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

5.使用Bean,将请求的数据封装到Bean中:

public class User {
	private int uid;
	private String username;
	private String password;
	private String nickname;
	public int getUid() {
		return uid;
	}
	public void setUid(int uid) {
		this.uid = uid;
	}
	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;
	}
	public String getNickname() {
		return nickname;
	}
	public void setNickname(String nickname) {
		this.nickname = nickname;
	}
}

6.连接数据库,实现数据的操作,并将结果封装到Bean中:

	public User login(User user) throws SQLException {
		//QueryRunner这个类是DBUtils的方法,参数为连接池
		QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
		User user2 = qr.query("select * from user where username=? and password=?", new BeanHandler<User>(User.class), user.getUsername(),user.getPassword());
		System.out.println(user2);
		return user2;
	}

JDBCUtils工具类:

public class JDBCUtils {
	// 创建一个连接池:但是这个连接池只需要创建一次即可。
	private static final ComboPooledDataSource dataSource = new ComboPooledDataSource();	
    //获得连接的方法
	public static Connection getConnection() throws SQLException{
		return dataSource.getConnection();
	}
	//获得连接池:
	public static DataSource getDataSource(){
		return dataSource;
	}
	
}

注意:web项目不用build path

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值