JSP快速入门

一. JSP由来

根据用户请求动态生成网页源代码的时候,我们使用的是response对象,获取输出流输出网页源代码, 这种方式有几个问题: 1)有大量的字符串拼接操作,操作复杂。 2)前端工程师修改页面代码困难 为了解决以上问题sun公司给出了:Java Server Page——简称JSP技术 = HTML + Java JSP是为了同时满足动态生成网页和简化页面书写的需求诞生的。

二. JSP执行原理

3.JSP快速入门 - 图1

总结: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.JSP快速入门 - 图2

3.若想要将部署的项目,放至到tomcat的安装目录的webapps下,则需要进入Project Structure -> Artifacts -> 修改Output directory的路径为tomcat的安装目录/webapps/项目名;并且选中Avaliable Elements -> 右击选择Put into Output Root将项目放至输入路径里。然后重启服务器再生效。 3.JSP快速入门 - 图3

此时,项目部署在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. 需求分析

3.JSP快速入门 - 图4

2. 准备工作

导入相关jar包,创建c3p0-config.xml文件

3. login.jsp登录页面

  1. <html>
  2. <head><title>登录界面</title></head>
  3. <body>
  4. <form action="login" method="post">
  5. <table>
  6. <tr>
  7. <td>用户名</td>
  8. <td><input type="text" name="username"/></td>
  9. </tr>
  10. <tr>
  11. <td>密码</td>
  12. <td><input type="password" name="password"/></td>
  13. </tr>
  14. <tr>
  15. <td></td>
  16. <td><input type="submit" value="登录"/></td>
  17. </tr>
  18. </table>
  19. </form>
  20. </body>
  21. </html>

4. User类

  1. public class User {
  2. private Integer id;
  3. private String name;
  4. private String pwd;
  5. private Integer age;
  6. private String sex;
  7. public User() {
  8. }
  9. public User(String name, String pwd, Integer age, String sex) {
  10. this.name = name;
  11. this.pwd = pwd;
  12. this.age = age;
  13. this.sex = sex;
  14. }
  15. public User(Integer id, String name, String pwd, Integer age, String sex) {
  16. this.id = id;
  17. this.name = name;
  18. this.pwd = pwd;
  19. this.age = age;
  20. this.sex = sex;
  21. }
  22. public Integer getId() {
  23. return id;
  24. }
  25. public void setId(Integer id) {
  26. this.id = id;
  27. }
  28. public String getName() {
  29. return name;
  30. }
  31. public void setName(String name) {
  32. this.name = name;
  33. }
  34. public String getPwd() {
  35. return pwd;
  36. }
  37. public void setPwd(String pwd) {
  38. this.pwd = pwd;
  39. }
  40. public Integer getAge() {
  41. return age;
  42. }
  43. public void setAge(Integer age) {
  44. this.age = age;
  45. }
  46. public String getSex() {
  47. return sex;
  48. }
  49. public void setSex(String sex) {
  50. this.sex = sex;
  51. }
  52. @Override
  53. public String toString() {
  54. return "User{" +
  55. "id=" + id +
  56. ", name='" + name + '\'' +
  57. ", pwd='" + pwd + '\'' +
  58. ", age=" + age +
  59. ", sex='" + sex + '\'' +
  60. '}';
  61. }
  62. }

5. 控制层

  1. @WebServlet(name = "LoginServlet" , urlPatterns = "/login")
  2. public class LoginServlet extends HttpServlet {
  3. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  4. this.doGet(request, response);
  5. }
  6. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  7. //获取请求参数
  8. String username = request.getParameter("username");
  9. String password = request.getParameter("password");
  10. //执行查询操作
  11. UserService service = new UserService();
  12. User user = new User();
  13. user.setName(username);
  14. user.setPwd(password);
  15. User bean = service.login(user);
  16. System.out.println(bean);
  17. if(bean!=null){
  18. //请求属性:将数据传递至页面
  19. request.setAttribute("msg","成功访问,Hello Success");
  20. //请求转发:地址栏不会发生变化,会显示请求地址/first,延续之前的请求,携带数据的 request.getRequestDispatcher("success.jsp").forward(request,response);
  21. } else {
  22. request.setAttribute("msg","访问失败,Hello Error");
  23. request.getRequestDispatcher("fail.jsp").forward(request,response);
  24. }
  25. }
  26. }

6. 业务层

  1. public class UserService {
  2. private UserDao userDao = new UserDao();
  3. /*
  4. * 用户登陆的方法
  5. * @param user
  6. * @return
  7. */
  8. public User login(User user) {
  9. return userDao.getUser(user);
  10. }
  11. }
  12. <a name="ysIw0"></a>
  13. ## 7. 数据层
  14. BaseDao
  15. import com.igeek.javaee.utils.C3P0Connection;
  16. import org.apache.commons.dbutils.QueryRunner;
  17. import org.apache.commons.dbutils.handlers.BeanHandler;
  18. import org.apache.commons.dbutils.handlers.BeanListHandler;
  19. import org.apache.commons.dbutils.handlers.ScalarHandler;
  20. import java.sql.SQLException;
  21. import java.util.List;
  22. // 定义一个用来被继承的对数据库进行基本操作的Dao
  23. public class BaseDao<T> {
  24. private QueryRunner queryRunner = new QueryRunner(C3P0Connection.getDataSource());
  25. // 通用的增删改操作
  26. public int update(String sql , Object...params){
  27. int count = 0;
  28. try {
  29. count = queryRunner.update(sql, params);
  30. } catch (SQLException e) {
  31. e.printStackTrace();
  32. }
  33. return count;
  34. }
  35. // 查询一条记录
  36. public T getBean(Class<T> type , String sql , Object...params){
  37. T t = null;
  38. try {
  39. t = queryRunner.query(sql, new BeanHandler<T>(type) , params);
  40. } catch (SQLException e) {
  41. e.printStackTrace();
  42. }
  43. return t;
  44. }
  45. // 查询所有记录
  46. public List<T> getBeanList(Class<T> type , String sql , Object...params){
  47. List<T> list = null;
  48. try {
  49. list = queryRunner.query(sql, new BeanListHandler<T>(type), params);
  50. } catch (SQLException e) {
  51. e.printStackTrace();
  52. }
  53. return list;
  54. }
  55. // 获取单值的方法,专门用来执行像select count(*)这样的sql语句
  56. public Object getSingleValue(String sql , Object...params){
  57. Object value = null;
  58. try {
  59. value = queryRunner.query(sql, new ScalarHandler(), params);
  60. } catch (SQLException e) {
  61. e.printStackTrace();
  62. }
  63. return value;
  64. }
  65. }
  66. UserDaoImpl
  67. public class UserDaoImpl extends BaseDao<User> {
  68. public User getUser(User user) {
  69. String sql = "select * from t_user where name = ? and pwd = ?";
  70. User bean = this.getBean(User.class,sql,user.getName(),user.getPwd());
  71. return bean;
  72. }
  73. }

毕设须知 3.JSP快速入门 - 图5

第一次访问 :tomcat服务器将jsp解析成java的clas文件 (会有翻译和编译的过程) 第二次访问直接访问class文件 (如果在服务器进行修改代码,再次访问时会重新翻译) 翻译成的本质是Servlet文件

3.JSP快速入门 - 图6

3.JSP快速入门 - 图7

3.JSP快速入门 - 图8

3.JSP快速入门 - 图9

请求转发只有一次 在服务器内部跳转 3.JSP快速入门 - 图10

重定向有两次请求 两次响应 3.JSP快速入门 - 图11

3.JSP快速入门 - 图12

3.JSP快速入门 - 图13

3.JSP快速入门 - 图14