JSP快速入门
一. JSP由来
根据用户请求动态生成网页源代码的时候,我们使用的是response对象,获取输出流输出网页源代码, 这种方式有几个问题: 1)有大量的字符串拼接操作,操作复杂。 2)前端工程师修改页面代码困难 为了解决以上问题sun公司给出了:Java Server Page——简称JSP技术 = HTML + Java JSP是为了同时满足动态生成网页和简化页面书写的需求诞生的。
二. JSP执行原理
总结:jsp技术最终还是用java类,执行网页内容,jsp说到底还是一个Servlet.
1. JSP的运行过程
1.1 翻译:JSP文件—-》Java文件 访问JSP时,Tomcat首先会按照规范把JSP文件翻译成.java文件,存放在CATALINA_BASE目录下 CATALINA_BASE: “C:\Users\cp.IntelliJIdea2019.2\system\tomcat\Tomcat_8_0_30_javaee” 1.2 编译:Java文件—-》class文件 当成功访问时,Tomcat会将Java文件,编译生成class文件 1.3 实例化 Tomcat创建JSP类的对象 1.4 提供服务 Tomcat调用JSP对象的_jspService方法,生成响应,返回给客户端浏览器,浏览器进行显示 1.5 销毁
注意: 1.CATALINA_HOME即Tomcat的安装目录,CATALINA_BASE是Tomcat的工作目录。如果同时运行多个Tomcat实例,通常会配置多个工作目录。每个Tomcat实例独占一个工作目录,但是共享一个安装目录。 2.Tomcat每个运行实例需要使用自己的conf、logs、temp、webapps、work和shared目录,因此CATALINA_BASE就指向这些目录。 而其他目录主要包括了Tomcat的二进制文件和脚本,CATALINA_HOME就指向这些目录。intelliJ Idea在每次重新启动Tomcat的时候都会重新建立或者说更新Tomcat工作目录的内容。
3.若想要将部署的项目,放至到tomcat的安装目录的webapps下,则需要进入Project Structure -> Artifacts -> 修改Output directory的路径为tomcat的安装目录/webapps/项目名;并且选中Avaliable Elements -> 右击选择Put into Output Root将项目放至输入路径里。然后重启服务器再生效。
此时,项目部署在tomcat路径下的,webapps文件夹中;而jsp页面在CATALINA_BASE指定的目录下的work文件夹下,如:/IntelliJIdea2019.3/tomcat/Tomcat_8_0_50_javaee。
2. JSP内置对象
内置对象本质依然是对象,不需要定义,不需要创建,可以直接使用。名字是固定的,不能修改,可以直接调用方法。 HttpServletRequest request 请求 HttpServletResponse response 响应 PageContext pageContext jsp页面的上下文 HttpSession session 会话 ServletContext application 当前应用上下文 ServletConfig config JspWriter out Exception e Object page
三.传递数据
1. JSP提交数据到Servlet - 请求参数
1.1 表单提交时,表单的输入都被作为请求参数提交 1.2 使用URL提交时,可以通过URL?name1=value1&name2=value2形式传递请求参数 例如:getParameter(“name”)
2. Servlet传递数据到JSP - 请求属性
HttpServletRequest接口中两个方法
//存储此请求中的属性 void setAttribute(String,Object) //以 Object 形式返回指定属性的值 Object getAttribute(String)
3.请求参数与请求属性的区别
3.1 请求参数是自动封装到请求中的,直接使用请求的getParameter或者getParameterValues获取即可 3.2 请求属性是需要自行写代码保存,然后再取出使用,通过setAttribute保存属性,getAttribute获取属性 注意:由于保存属性时都以Object类型保存,所以获取后需要类型强制转换
四.Servlet开发应用 - 登录案例
1. 需求分析
2. 准备工作
导入相关jar包,创建c3p0-config.xml文件
3. login.jsp登录页面
<html>
<head><title>登录界面</title></head>
<body>
<form action="login" method="post">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password"/></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="登录"/></td>
</tr>
</table>
</form>
</body>
</html>
4. User类
public class User {
private Integer id;
private String name;
private String pwd;
private Integer age;
private String sex;
public User() {
}
public User(String name, String pwd, Integer age, String sex) {
this.name = name;
this.pwd = pwd;
this.age = age;
this.sex = sex;
}
public User(Integer id, String name, String pwd, Integer age, String sex) {
this.id = id;
this.name = name;
this.pwd = pwd;
this.age = age;
this.sex = sex;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
5. 控制层
@WebServlet(name = "LoginServlet" , urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求参数
String username = request.getParameter("username");
String password = request.getParameter("password");
//执行查询操作
UserService service = new UserService();
User user = new User();
user.setName(username);
user.setPwd(password);
User bean = service.login(user);
System.out.println(bean);
if(bean!=null){
//请求属性:将数据传递至页面
request.setAttribute("msg","成功访问,Hello Success");
//请求转发:地址栏不会发生变化,会显示请求地址/first,延续之前的请求,携带数据的 request.getRequestDispatcher("success.jsp").forward(request,response);
} else {
request.setAttribute("msg","访问失败,Hello Error");
request.getRequestDispatcher("fail.jsp").forward(request,response);
}
}
}
6. 业务层
public class UserService {
private UserDao userDao = new UserDao();
/*
* 用户登陆的方法
* @param user
* @return
*/
public User login(User user) {
return userDao.getUser(user);
}
}
<a name="ysIw0"></a>
## 7. 数据层
BaseDao类
import com.igeek.javaee.utils.C3P0Connection;
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.ScalarHandler;
import java.sql.SQLException;
import java.util.List;
// 定义一个用来被继承的对数据库进行基本操作的Dao
public class BaseDao<T> {
private QueryRunner queryRunner = new QueryRunner(C3P0Connection.getDataSource());
// 通用的增删改操作
public int update(String sql , Object...params){
int count = 0;
try {
count = queryRunner.update(sql, params);
} catch (SQLException e) {
e.printStackTrace();
}
return count;
}
// 查询一条记录
public T getBean(Class<T> type , String sql , Object...params){
T t = null;
try {
t = queryRunner.query(sql, new BeanHandler<T>(type) , params);
} catch (SQLException e) {
e.printStackTrace();
}
return t;
}
// 查询所有记录
public List<T> getBeanList(Class<T> type , String sql , Object...params){
List<T> list = null;
try {
list = queryRunner.query(sql, new BeanListHandler<T>(type), params);
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
// 获取单值的方法,专门用来执行像select count(*)这样的sql语句
public Object getSingleValue(String sql , Object...params){
Object value = null;
try {
value = queryRunner.query(sql, new ScalarHandler(), params);
} catch (SQLException e) {
e.printStackTrace();
}
return value;
}
}
UserDaoImpl 类
public class UserDaoImpl extends BaseDao<User> {
public User getUser(User user) {
String sql = "select * from t_user where name = ? and pwd = ?";
User bean = this.getBean(User.class,sql,user.getName(),user.getPwd());
return bean;
}
}
毕设须知
第一次访问 :tomcat服务器将jsp解析成java的clas文件 (会有翻译和编译的过程) 第二次访问直接访问class文件 (如果在服务器进行修改代码,再次访问时会重新翻译) 翻译成的本质是Servlet文件
请求转发只有一次 在服务器内部跳转
重定向有两次请求 两次响应