java web初步学习(servlet+jsp+mysql)

IDEA

快捷键使用

1、在java类中添加geter setter 方法,以及构造函数: Alt+insert

2、在函数前面输入 /** +enter

    /**
     * 
     * @param index
     * @param limit
     * @return
     */

3、快速添加try-catch Ctrl+alt+t 【ps:必须提前把idea的大小写敏感关掉】
在这里插入图片描述

4、代码对齐、格式化:选中—>代码—>重新格式化代码

Servlet

1、request:表示⼀次请求,HttpServletRequest。
2、response:表示⼀次响应,HttpServletResponse。
3、pageContext:⻚⾯上下⽂,获取⻚⾯信息,PageContext。
4、session:表示⼀次会话,保存⽤户信息,HttpSession。
5、application:表示当前 Web 应⽤,全局对象,保存所有⽤户共享信息,ServletContext。
6、config:当前 JSP 对应的 Servlet 的 ServletConfig 对象,获取当前 Servlet 的信息。
7、out:向浏览器输出数据,JspWriter。
8、page:当前 JSP 对应的 Servlet 对象,Servlet。
9、exception:表示 JSP ⻚⾯发⽣的异常,Exception。

常⽤的是 request、response、session、application、pageContext

request

1、String getParameter(String key) 获取客户端传来的参数。
2、void setAttribute(String key,Object value) 通过键值对的形式保存数据。
3、Object getAttribute(String key) 通过 key 取出 value。
4、RequestDispatcher getRequestDispatcher(String path) 返回⼀个 RequestDispatcher 对象,该对象的 forward ⽅法⽤于请求转发。
5、String[] getParameterValues() 获取客户端传来的多个同名参数。
6、void setCharacterEncoding(String charset) 指定每个请求的编码。

注意getParameter与getAttribute的区别:

​ getParameter是从客户端提取参数;而getAttribute是从服务器端提取参数。

此外,如果set/getAttribute是跨请求的,则保存在session中

乱码问题

​ 还有一个重要的地方:如果输入的请求中有中文,必须在第一行设置req.setCharacterEncoding(“UTF-8”);不然会乱码!

response

1、sendRedirect(String path) 重定向,⻚⾯之间的跳转。
转发 getRequestDispatcher 和重定向 sendRedirect 的区别:
转发是将同⼀个请求传给下⼀个⻚⾯,重定向是创建⼀个新的请求传给下⼀个页面,之前的请求结束生命周期。
转发:同⼀个请求在服务器之间传递,地址栏不变,也叫服务器跳转。
重定向:由客户端发送⼀次新的请求来访问跳转后的⽬标资源,地址栏改变,也叫客户端跳转。
如果两个⻚⾯之间需要通过 request 来传值,则必须使⽤转发,不能使⽤重定向。
⽤户登录,如果⽤户名和密码正确,则跳转到⾸⻚(转发),并且展示⽤户名,否则重新回到登陆页面
(重定向)。
转发重定向
req.getRequestDispatcherresp.senRedirect
将同⼀个请求传给下⼀个页面创建⼀个新的请求传给下⼀个页面,之前的请求结束生命周期
同⼀个请求在服务器之间传递,地址栏不变由客户端发送⼀次新的请求来访问跳转后的⽬标资源,地址栏改变
如果两个⻚⾯之间需要通过 request 来传值,则必须使⽤转发⽤户登录,如果⽤户名和密码正确,则跳转到⾸⻚(转发),并且展示⽤户名,否则重新回到登陆⻚⾯(重定向)。

Session

常用方法:

String getId() 获取 sessionID
void setMaxInactiveInterval(int interval) 设置 session 的失效时间,单位为秒
int getMaxInactiveInterval() 获取当前 session 的失效时间
void invalidate() 设置 session ⽴即失效
void setAttribute(String key,Object value) 通过键值对的形式来存储数据
Object getAttribute(String key) 通过键获取对应的数据
void removeAttribute(String key) 通过键删除对应的数据

操作:

//存入session
HttpSession session = req.getSession();
session.setAttribute("reader",reader);
//取出session
HttpSession session = req.getSession();
Reader reader = (Reader)session.getAttribute("reader");

session:保存在服务器 保存的数据是 Object 会随着会话的结束而销毁 保存重要信息

生命周期:服务端:只要 WEB 应⽤重启就销毁,客户端:只要浏览器关闭就销毁。

EL & JSTL

EL表达式

前提是⼀定要先 setAttribute, EL 就相当于在简化 getAttribute;

<%
	User user = new User(1,"张三",86.5,new Address(1,"小寨"));
	pageContext.setAttribute("user",user);
%>
<table>
    <tr>
        <th>编号</th>
        <th>姓名</th>
        <th>成绩</th>
        <th>地址</th>
    </tr>
    <tr>
        <td>${user.id}</td>
        <td>${user.name}</td>
        <td>${user.score}</td>
        <td>${user.address}</td>
    </tr>
</table>
${num1&&num2}
&& || ! < > <= <= ==
&& and
|| or
! not
== eq
!= ne
< lt
> gt
<= le
>= ge
empty 变量为 null,⻓度为0的String,size为0的集合

JSTL表达式

首先导入包:

1、需要导⼊ jar 包(两个 jstl.jar standard.jar)存放的位置 web/WEB-INF

2、在 JSP ⻚⾯开始的地⽅导⼊ JSTL 标签库

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

3、在需要的地⽅使⽤

<c:forEach items="${list}" var="user">   	<!--list是传回来的集合,用user遍历-->
 <tr>
 <td>${user.id}</td>
 <td>${user.name}</td>
 <td>${user.score}</td>
 <td>${user.address.value}</td>
 </tr>
</c:forEach>

核心标签库常用标签:

  • set、out、remove、catch

    set:向域对象中添加数据

    <%
     requset.setAttribute(key,value)
    %>
    <c:set var="name" value="tom" scope="request"></c:set>
    ${requestScope.name}
    <%
    User user = new User(1,"张三",66.6,new Address(1,"科技路"));
    request.setAttribute("user",user);
    %>
    ${user.name}
    <hr/>
    <c:set target="${user}" property="name" value="李四"></c:set>
    ${user.name}
    

    out:输出域对象中的数据

    <c:set var="name" value="tom"></c:set>
    <c:out value="${name}" default="未定义"></c:out>
    

    remove:删除域对象中的数据

    <c:remove var="name" scope="page"></c:remove>
    <c:out value="${name}" default="未定义"></c:out>
    

    catch:捕获异常

    <c:catch var="error">
     <%
     int a = 10/0;
     %>
    </c:catch>
    ${error}
    
  • 条件标签:if choose

    <c:set var="num1" value="1"></c:set>
    <c:set var="num2" value="2"></c:set>
    <c:if test="${num1>num2}">ok</c:if>
    <c:if test="${num1<num2}">fail</c:if>
    <hr/>
    <c:choose>
     <c:when test="${num1>num2}">ok</c:when>
     <c:otherwise>fail</c:otherwise>
    </c:choose>
    
  • 迭代标签:forEach

    <c:forEach items="${list}" var="str" begin="2" end="6" step="2"
    varStatus="sta">
     ${sta.count}、${str}<br/>
    </c:forEach>
    

AJAX

JDBC

此处我们直接用JDBC连接池

JDBC 的数据库连接池使⽤ javax.sql.DataSource 接⼝来完成的,DataSource 是 Java 官⽅提供的接 ⼝,使⽤的时候开发者并不需要⾃⼰来实现该接⼝,可以使⽤第三⽅的⼯具,C3P0 是⼀个常⽤的第三 ⽅实现,实际开发中直接使⽤ C3P0 即可完成数据库连接池的操作。

步骤:

1、把c3p0-xxx.jar 放到web-inf/lib下;

2、在src目录下创建一个c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
     <named-config name="testc3p0">
         <!-- 指定连接数据源的基本属性 -->
         <property name="user">root</property>
         <property name="password">root</property>
         <property name="driverClass">com.mysql.jdbc.Driver</property>
         <property name="jdbcUrl">jdbc:mysql://localhost:3306/library?
        useUnicode=true&amp;characterEncoding=UTF-8</property>
         <!-- 若数据库中连接数不⾜时, ⼀次向数据库服务器申请多少个连接 -->
         <property name="acquireIncrement">5</property>
         <!-- 初始化数据库连接池时连接的数量 -->
         <property name="initialPoolSize">20</property>
         <!-- 数据库连接池中的最⼩的数据库连接数 -->
         <property name="minPoolSize">2</property>
         <!-- 数据库连接池中的最⼤的数据库连接数 -->
         <property name="maxPoolSize">40</property>
     </named-config>
</c3p0-config>

详细操作在MVC中

MVC

是一种开发模式,将程序分层的一种思想

MVC
ModelViewControaller
业务数据(service repository entity)视图(jsp html app客户端)控制(servlet handler action)

请求进入Java web应用后,controller接收该请求,进行业务逻辑处理,最终将处理的结果再返回给用户(view+model)

entity:

controller(业务请求) ->service(是登录还是注册还是退出)->repository(连接数据库)[一个表对应一个repository]

controller
service
repository
DB

项目结构

在这里插入图片描述

utils层

这一层较为固定

public class JDBCTools {
    private static DataSource dataSource;
    static{
        dataSource = new ComboPooledDataSource("testc3p0");  //加载连接池中的配置
    }
    public static Connection getconnection(){
        Connection connection = null;
        try {
            connection = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }
    public static void release(Connection connection, Statement statement, ResultSet resultSet){
        try {
            if(connection !=null){
                connection.close();
            }
            if(statement !=null){
                statement.close();
            }
            if(resultSet !=null){
                resultSet.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

repository层

  • 对数据库增删查改
public List<Book> findAll(int index,int limit) {
    //step1:连接数据库
    Connection connection = JDBCTools.getconnection();
    String sql = "SELECT * FROM book,bookcase where book.bookCase =bookcase.id limit ?,?";   
    //step2:初始化参数
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;
    List<Book> list =new ArrayList<>();
    try {
        //step3:把sql语言传入
        preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1,index);
        preparedStatement.setInt(2,limit);
        //step4:把查询结果传到内存
        resultSet = preparedStatement.executeQuery();
        while (resultSet.next()){
            list.add(new Book(resultSet.getInt(1),resultSet.getString(2),resultSet.getString(3)
                              ,new BookCase(resultSet.getInt(5),resultSet.getString(6))));
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return list;
}
  • 统计个数
public int count() {
    Connection connection = JDBCTools.getconnection();
    String sql = "SELECT count(*) FROM book,bookcase where book.bookCase =bookcase.id ";
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;
    int count = 0;
    try {
        preparedStatement = connection.prepareStatement(sql);
        resultSet = preparedStatement.executeQuery();
        while (resultSet.next()){
            count = resultSet.getInt(1);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return count;
}

service层

比较灵活,将controller与repository连接

示例为视频中的例子:分页展示数据

public class BookServiceImpl implements BookService {
    private BookRepository bookRepository = new BookRepositoryImpl();
    private BorrowRepository borrowRepository = new BorrowRepositoryImpl();
    private final Integer LIMIT = 6;//常量
    @Override
    public List<Book> findAll(int page) {
        int index = (page-1)*LIMIT;
        return bookRepository.findAll(index,LIMIT);
    }
    @Override
    public int getPages() {
        int count = bookRepository.count();
        int page = 0;
        if(count % LIMIT == 0){
            page = count/LIMIT;
        }else{
            page = count/LIMIT+1;
        }
        return page;
    }

controller层

public class BookServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String pageStr = req.getParameter("page");
        Integer page = Integer.parseInt(pageStr);
        List<Book> list = bookService.findAll(page);
        req.setAttribute("list",list);
        req.setAttribute("dataPrePage",6);
        req.setAttribute("currentPage",page);
        req.setAttribute("pages",bookService.getPages());
        req.getRequestDispatcher("index.jsp").forward(req,resp);
    }
}

之后会把ajax更新。

参考:
学习的视频资源:Java Web从入门到实战【完整版】

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值