一.基本的脚本代码
运行原理:
浏览器访问服务器,服务器找到jsp页面,服务器对jsp文件翻译成.java文件,再进行编译成.class文件,再放入服务器中执行。
简单来说:JSP文件翻译成Java文件,将这个Java文件编译生成class文件,运行class文件。
- 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
三.路径问题
-
分类
相对路径:相对路径不是以 / 开头的。绝对路径:通常以 / 开始的路径(常用)
注意:
绝对路径分成服务器端路径和客户端路径
客户端路径 需要带工程名
服务器端路径 不需要带工程名 -
注意事项:
在访问本机时,绝对路径可以省略http://localhost:8080,直接写/文件名/项目名
这个路径问题,在后面的代码中会有对应的体现
四.域对象
定义:公共容器
-
request域对象范围:就是请求到回应
-
getServletContent域对象范围:就是整个web项目,从服务器开始到结束
-
域对象的方法都一样:
setAttribute(key,value);
getAttribute(key, value);
removeAttribute(key, value);
五.重定向和请求转发的区别
- 重定向:
response.sendRedirect("/anli01/jsp/admin.jsp"); - 请求转发:
request.getRequestDispatcher("/jsp/Zhuce.jsp").forward(request, response); - 区别(借钱案例):
请求转发是一次请求一次响应,而重定向是两次请求两次响应。
请求转发地址栏不会变化的,重定向地址栏发生变化。
请求转发路径不带工程名,重定向需要带工程名路径。
请求转发只能在本网站内部,重定向可以定向到任何网站。
跳转的外网:重定向
带值转发:请求转发 - 注意:
如果需要使用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