一. 简单登录案例

流程图:

项目结构图

前端代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>哈哈登录页面</h1>
<form action="login" method="post">
用户名<input type="text" name="username" /></br></br>
密码<input type="password" name="pwd" /></br></br>
<input type="submit" value="登录"/>
</form>
</body

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>day13</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<description></description>
<display-name>login</display-name>
<servlet-name>login</servlet-name>
<servlet-class>com._51doit.admin.login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>

 login部分代码

public class login extends HttpServlet {
private static final long serialVersionUID = 1L;
UserService userService = new UserServiceImpl();
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
try {
// 获取前端数据
String username = request.getParameter("username");
String pwd = request.getParameter("pwd");
System.out.println("password:"+pwd);
// 登录处理
User user = userService.login(username, pwd);
if(user != null) {
response.sendRedirect("/day13/success.html");
}else {
System.out.println("失败");
response.sendRedirect("/day13/login.html");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

service层

UserService接口

public interface UserService {

    // 登录
public User login(String username,String pwd) throws Exception; }

UserService实现类(UserServiceImpl)

public class UserServiceImpl implements UserService{
UserDao userDao = new UserDaoImpl();
@Override
public User login(String username, String pwd) throws Exception {
User user = userDao.getUserFromdB(username, pwd);
return user;
}
}

dao层

UserDao接口

public interface UserDao {
// 从数据库获取信息
public User getUserFromdB(String username,String pwd) throws Exception;
}

UserDaoImpl(UserDao接口实现类)

public class UserDaoImpl  implements UserDao{
static QueryRunner runner;
static {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
runner = new QueryRunner(dataSource);
}
// 根据用户和密码名查询用户
@Override
public User getUserFromdB(String username, String pwd) throws Exception {
String sql = "select * from user where username = ? and password = ?";
User user = runner.query(sql, new BeanHandler<>(User.class),username,pwd);
return user;
}
}

pojo层

注意:此处一定要有无参构造方法

public class User {
private int uid;
private String username;
private String nickname;
private String password;
private String phonenumber;
private String email;
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 getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhonenumber() {
return phonenumber;
}
public void setPhonenumber(String phonenumber) {
this.phonenumber = phonenumber;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
} public User() {
super();
}
public User(int uid, String username, String nickname, String password, String phonenumber, String email) {
super();
this.uid = uid;
this.username = username;
this.nickname = nickname;
this.password = password;
this.phonenumber = phonenumber;
this.email = email;
}
@Override
public String toString() {
return "User [uid=" + uid + ", username=" + username + ", nickname=" + nickname + ", password=" + password
+ ", phonenumber=" + phonenumber + ", email=" + email + "]";
}
}

改进:后端传user对象至前端并在前端页面显示出来

思路:直观想法是直接将user传至前端,并显示出来,但html页面中并不能获取到user,解决方法:将user对象存入域中,使用jsp文件代替html文件并在jsp文件中使用EL表达式获取user对象的username属性。代码如下,此处只鞋跟上面的差别代码

前端部分(此处是jsp文件不是html文件):

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<h1>登录成功 欢迎${user.username} </h1>
</body>
</html>

login部分

二. 域

1. 概念:

  存储数据,并且有一定访问范围的对象[任意数据   object]

2.web四大域

(1)page(配置域),一个servlet或是一个页面(访问范围)

(2)request(请求域),一次请求(访问范围),由于存在转发,所以可以多个servlet进行数据共享

(3)session(session域):一个用户(访问范围)

(4)application:整个web项目(访问范围)

3. 域存储数据(此处以session域为例)

session.setAttribute(“key”, object);

4.EL(Expression Language)表达式:${}

  其可以获取java对象,调用java方法,执行算术运算

5.jsp页面从域中取数据

 ${key}

三. jsp(java server page):在页面上写java代码

为了防止java代码和html胶合,jsp文档只用EL展示数据,不写java代码,代码(获取请求参数,操作数据库,跳转页面)写在servlet中

四. 查询商品列表案例

大致思路和上诉登录案例相似

此案例涉及新的知识点:jsq页面上遍历数据(使用jstl标签)(不在jsp文档中使用java代码,但又要遍历数据,所以使用jstl标签)

代码结构图

 前端代码:涉及jstl标签的使用(不在jsp文档中使用java代码,但又要遍历数据,所以使用jstl标签)

p_list.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<button>
<a href="/day13/GetAllProducts">查詢商品列表</a>
</button>
<br />
<br />
<br />
<table border="1px" cellspacing="0" width="100%">
<tr>
<th>id</th>
<th>name</th>
<th>category</th>
<th>pnum</th>
<th>description</th>
<th>描述</th>
</tr>
<!-- 迭代获取数据,即遍历 -->
<c:forEach items="${p_list }" var="product">
<tr>
<td>${product.id}</td>
<td>${product.name}</td>
<td>${product.price}</td>
<td>${product.category}</td>
<td>${product.pnum}</td>
<td>${product.description}</td>
</c:forEach>
</table>
</body>
</html>

重要代码(使用jstl标签遍历列表部分)

 后端部分

GetAllProducts

public class GetAllProducts extends HttpServlet {
private static final long serialVersionUID = 1L; protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ProductsService productsService = new ProductsServiceImpl();
try {
List<Products> list = productsService.getAllProducts();
System.out.println(list);
HttpSession session = request.getSession();
session.setAttribute("p_list", list);
response.sendRedirect("/day13/p_list.jsp");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

 dao层

ProductsDao接口

public interface ProductsDao {
// 从数据库中获取product
public List<Products> getProductsFromDB() throws Exception;
}

实现类ProductsDaoImpl

public class ProductsDaoImpl implements ProductsDao {
// 数据库连接池的创建
static QueryRunner runner;
static {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
runner = new QueryRunner(dataSource);
}
// 从数据库中获取products
@Override
public List<Products> getProductsFromDB() throws Exception {
String sql = "select * from products";
List<Products> list = runner.query(sql, new BeanListHandler<>(Products.class));
return list;
}
}

service层

ProductsServices接口

public interface ProductsService {
public List<Products> getAllProducts() throws Exception;
}

实现类ProductsServicesImpl

public class ProductsServiceImpl implements ProductsService{
// 调用Dao层,获取数据
@Override
public List<Products> getAllProducts() throws Exception {
ProductsDao productsDao = new ProductsDaoImpl();
List<Products> list = productsDao.getProductsFromDB();
return list;
}
}

pojo层

Products

package com._51doit.pojo;

public class Products {
int id ;
String name ;
double price ;
String category ;
int pnum ;
String description ;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public int getPnum() {
return pnum;
}
public void setPnum(int pnum) {
this.pnum = pnum;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
} public Products() {
super();
}
public Products(int id, String name, double price, String category, int pnum, String description) {
super();
this.id = id;
this.name = name;
this.price = price;
this.category = category;
this.pnum = pnum;
this.description = description;
}
@Override
public String toString() {
return "Products [id=" + id + ", name=" + name + ", price=" + price + ", category=" + category + ", pnum="
+ pnum + ", description=" + description + "]";
}
}

运行结果:(点击查询商品列表按钮后)

以上GetAllProducts代码有不足之处,即数据存储在session域中,一个用户的多个页面都可以获取这些数据,若是只想让某个页面获取这个数据就做不到了。解决办法---->将数据存储在request域中去,此时数据只能被某次请求获取,代码如下

此处的url不需要加项目名,因为转发是服务器内部请求

 

零基础学习java------34---------登录案例,域,jsp(不太懂),查询商品列表案例(jstl标签)的更多相关文章

  1. 音乐出身的妹纸,零基础学习JAVA靠谱么

    问:表示音乐出身的妹纸一枚  某一天突然觉得身边认识的是一群程序员   突然想 要不要也去试试... 众好友都觉得我该去做个老师,可是我怕我会误人子弟,祸害祖国下一代..... 要不要 要不要 学Ja ...

  2. 总结了零基础学习Java编程语言的几个基础知识要点

    很多Java编程初学者在刚接触Java语言程序的时候,不知道该学习掌握哪些必要的基础知识.本文总结了零基础学习Java编程语言的几个基础知识要点. 1先了解什么是Java的四个方面   初学者先弄清这 ...

  3. salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件

    在classic环境中,salesforce提供了<apex:inputFile>标签用来实现附件的上传以及内容获取.salesforce 零基础学习(二十四)解析csv格式内容中有类似的 ...

  4. Android零基础入门第34节:Android中基于监听的事件处理

    原文:Android零基础入门第34节:Android中基于监听的事件处理 上一期我们学习了Android中的事件处理,也详细学习了Android中基于监听的事件处理,同时学会了匿名内部类形式,那么本 ...

  5. 零基础学Java第一节(语法格式、数据类型)

    本篇文章是<零基础学Java>专栏的第一篇文章,从本篇文章开始,将会连更本专栏,带领大家将Java基础知识彻底学懂,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! ...

  6. 零基础学习hadoop到上手工作线路指导(编程篇)

    问题导读: 1.hadoop编程需要哪些基础? 2.hadoop编程需要注意哪些问题? 3.如何创建mapreduce程序及其包含几部分? 4.如何远程连接eclipse,可能会遇到什么问题? 5.如 ...

  7. 零基础学习hadoop到上手工作线路指导(中级篇)

    此篇是在零基础学习hadoop到上手工作线路指导(初级篇)的基础,一个继续总结. 五一假期:在写点内容,也算是总结.上面我们会了基本的编程,我们需要对hadoop有一个更深的理解: hadoop分为h ...

  8. 零基础学习hadoop到上手工作线路指导初级篇:hive及mapreduce

      此篇是在零基础学习hadoop到上手工作线路指导(初级篇)的基础,一个继续总结.五一假期:在写点内容,也算是总结.上面我们会了基本的编程,我们需要对hadoop有一个更深的理解:hadoop分为h ...

  9. Salesforce 集成篇零基础学习(一)Connected App

    本篇参考: https://zhuanlan.zhihu.com/p/89020647 https://trailhead.salesforce.com/content/learn/modules/c ...

随机推荐

  1. simulate_click

    #!/bin/bashlet actual_x=104+144*$[$2-1]let actual_y=945+144*$[$1-1]adb shell input tap ${actual_x} $ ...

  2. si macro macro

    获取 buf 里的 symbol cbuf = BufListCount() msg(cbuf) ibuf = 0 while (ibuf < cbuf) { hbuf = BufListIte ...

  3. 这一次,解决Flutter Dialog的各种痛点!

    前言 Q:你一生中闻过最臭的东西,是什么? A:我那早已腐烂的梦. 兄弟萌!!!我又来了! 这次,我能自信的对大家说:我终于给大家带了一个,能真正帮助大家解决诸多坑比场景的pub包! 将之前的flut ...

  4. hash 哈希表 缓存表

    系统初始hash表为空,当外部命令执行时,默认会从 PATH路径下寻找该命令,找到后会将这条命令的路径记录到 hash表中,当再次使用该命令时,shell解释器首先会查看hash 表,存在将执行之,如 ...

  5. Java日期API

    JDK8之前日期时间API java.util.Date类 表示特定的瞬间,精确到毫秒 构造器: Date():使用无参构造器创建的对象可以获取本地当前时间. Date(long date) 常用方法 ...

  6. 事件消息生产消费中间件-OSS.DataFlow

    系统重构解耦的过程涉及不同领域服务分拆,或同一服务下实时响应部分和非响应部分分拆,分解后的各部分通过异步消息的流转传递,完成整体的业务逻辑,但是频繁的在业务层面直接调用不同消息队列的SDK,个人感觉不 ...

  7. 痞子衡嵌入式:实测i.MXRT1010上的普通GPIO与高速GPIO极限翻转频率

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1010上的普通GPIO与高速GPIO极限翻转频率. 上一篇文章 <聊聊i.MXRT1xxx上的普通GPIO与高速GP ...

  8. docker添加sudo权限

    sudo groupadd docker  # 添加group sudo gpasswd -a think docker  # 添加用户到组 sudo service docker restart n ...

  9. SpringCloud 2020.0.4 系列之 Stream 消息广播 与 消息分组 的实现

    1. 概述 老话说的好:事情太多,做不过来,就先把事情记在本子上,然后理清思路.排好优先级,一件一件的去完成. 言归正传,今天我们来聊一下 SpringCloud 的 Stream 组件,Spring ...

  10. 『学了就忘』Linux软件包管理 — 40、Linux系统软件包介绍

    目录 1.Linux系统软件包分类 2.源码包说明 3.二进制包说明 4.RPM包的优缺点 4.RPM包的两种安装方法 5.总结 1.Linux系统软件包分类 Linux系统下的软件包只有源码包和二进 ...