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;}@Overridepublic 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;// 定义一个用来被继承的对数据库进行基本操作的Daopublic 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文件




请求转发只有一次 在服务器内部跳转

重定向有两次请求 两次响应




