我们在下面写一个script块,js代码就全部写在这里。
给登陆按钮绑定一个点击事件:
登陆
登陆方法
function login(){
var username = $(‘#username’).val();
var password = $(‘#password’).val();
alert(username + “,” + password);
}
当成功alert出来数据后,说明到此为止的代码是正确的。
接下来,利用jQuery的ajax方法,将数据提交到controller层。
function login(){
var username = $(‘#username’).val();
var password = $(‘#password’).val();
$.ajax({
type:“post”,//请求方式
url:“${basePath}/controller/loginController.jsp”,//请求地址
data:{“username”:username,“password”:password},//传递给controller的json数据
error:function(){
alert(“登陆出错!”);
},
success:function(data){ //返回成功执行回调函数。
}
});
}
我已经都写好注释了,ajax方法在web开发过程中,是被普遍使用的。
新建一个loginController.jsp ,这就是所谓的服务器端。
<%@ page language=“java” import=“java.util.*” pageEncoding=“UTF-8”%>
<%
//设置请求的编码
//request.setCharacterEncoding(“UTF-8”);
//获取客户端传递过来参数
String username = request.getParameter(“username”);
String password = request.getParameter(“password”);
System.out.println(username);
System.out.println(password);
//如果用户名和密码不为空
%>
从JSP页面到controller,用户名和密码是被装在一个叫做request的变量中,它其实也就相当于一个json,一个map,都是差不多的东西,这里就不详细说明了。当然了,他也是JSP九大隐式对象中的一员。
我们来测试一下,点击登陆按钮。
成功了!可以看到数据已经成功传递到controller层了。
因为我们还没有数据表和JavaBean,所以我们先不急着写service层,先开始编写JavaBean吧。
5. 从JavaBean到数据库表。
我们在src目录下新建一个存放JavaBean的包
关于JavaBean,如果不是很了解的话,可以看看这篇文章:
http://www.cnblogs.com/skyblue-li/p/5900216.html
一个记录用户信息的JavaBean,我想了以下这些属性:
private String id; //主键,采用UUID
private String username; //用户名
private String password; //密码
private String headerPic; //头像
private String email; //电子邮箱
private Integer male; //性别 0男 1女 3保密
private String createTime;//创建时间
private String updateTime;//最后更新时间
private Integer isDelete; // 删除状态0未删除1删除
private String address; //地址
private String telephone; //电话
当你的JavaBean设计好了,差不多对应的数据库表也就出来了。
之前写过一篇关于注解的文章:
http://www.cnblogs.com/skyblue-li/p/5900228.html
现在可以用这个知识点做点有趣的事情了,比如将一个JavaBean转换成建表语句。
新建一个注解包,里面添加两个注解
column.java
package annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD) //注解的目标
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
public String field() ; //字段名称
public boolean primaryKey() default false;//是否为主键
public String type() default “VARCHAR(80)”;//字段类型
public boolean defaultNull() default true; //是否允许为空
}
Table.java
package annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE) //注解的目标是类
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
public String tableName();
}
我们创建了两个注解。
接下来,在util包(也就是工具包)中新建两个工具类
StringUtils 字符串工具类
package util;
public class StringUtils {
public static boolean isEmpty(String str) {
return null == str || str.equals(“”)
|| str.matches(“\s*”);
}
public static String defaultValue(String content,String defaultValue){
if(isEmpty(content)){
return defaultValue;
}
return content;
}
}
isEmpty的作用是判断字符串是否为空。
defaultValue表示给字符串设置默认值,有点类似于oracle数据库中的nvl语法。
TableUtils 数据表工具类
package util;
import java.lang.reflect.Field;
import annotation.Column;
import annotation.Table;
public class TableUtils {
public static String getCreateTableSQl(Class<?> clazz){
StringBuilder sb = new StringBuilder();
sb.append("create table ");
//获取表名
Table table = (Table) clazz.getAnnotation(Table.class);
String tableName = table.tableName();
sb.append(tableName).append(“(\n”);
Field[] fields = clazz.getDeclaredFields();
String primaryKey = “”;
//遍历所有字段
for (int i = 0; i < fields.length; i++) {
Column column = (Column) fields[i].getAnnotations()[0];
String field = column.field();
String type = column.type();
boolean defaultNull = column.defaultNull();
sb.append(“\t” + field).append(" ").append(type);
if(defaultNull){
if(type.toUpperCase().equals(“TIMESTAMP”)){
sb.append(“,\n”);
}else{
sb.append(" DEFAULT NULL,\n");
}
}else{
sb.append(" NOT NULL,\n");
if(column.primaryKey()){
primaryKey = “PRIMARY KEY (”+field+“)”;
}
}
}
if(!StringUtils.isEmpty(primaryKey)){
sb.append(“\t”).append(primaryKey);
}
sb.append(“\n) DEFAULT CHARSET=utf8”);
return sb.toString();
}
}
getCreateTableSQl方法是利用反射和注解有关的知识,给一个JavaBean自动生成建表语句,目前只支持MySQL,因为这方面的知识我也是刚开始学,写得不好的地方还请各位多多包涵。
接下来,给JavaBean添加注解。
@Table(tableName = “t_user”)
public class User{
//属性
}
属性如下:
@Column(type = “varchar(30)” ,field = “id” ,primaryKey = true ,defaultNull = false)
private String id; //主键,采用UUID
@Column(type = “VARCHAR(20)”, field = “username”)
private String username; //用户名
@Column(type = “VARCHAR(20)”, field = “password”)
private String password; //密码
@Column(type = “VARCHAR(60)”, field = “headerPic”)
private String headerPic; //头像
@Column(type = “VARCHAR(60)”, field = “email”)
private String email; //电子邮箱
@Column(type = “VARCHAR(2)”, field = “sex”)
private Integer sex; //性别 0男 1女 3保密
@Column(type = “datetime”, field = “create_time”)
private String createTime;//创建时间
@Column(type = “timestamp”, field = “update_time”)
private String updateTime;//最后更新时间
@Column(type = “int(1)”, field = “is_delete”)
private Integer isDelete; // 删除状态 0未删除 1删除
@Column(type = “VARCHAR(200)”, field = “address”)
private String address; //地址
@Column(type = “VARCHAR(15)”, field = “telephone”)
private String telephone; //电话
创建一个测试包和测试类:
技术学习总结
学习技术一定要制定一个明确的学习路线,这样才能高效的学习,不必要做无效功,既浪费时间又得不到什么效率,大家不妨按照我这份路线来学习。
最后面试分享
大家不妨直接在牛客和力扣上多刷题,同时,我也拿了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!
ddress")
private String address; //地址
@Column(type = “VARCHAR(15)”, field = “telephone”)
private String telephone; //电话
创建一个测试包和测试类:
技术学习总结
学习技术一定要制定一个明确的学习路线,这样才能高效的学习,不必要做无效功,既浪费时间又得不到什么效率,大家不妨按照我这份路线来学习。
[外链图片转存中…(img-SW1CEWch-1714527749949)]
[外链图片转存中…(img-THjgCZnX-1714527749949)]
[外链图片转存中…(img-LVeqbayn-1714527749949)]
最后面试分享
大家不妨直接在牛客和力扣上多刷题,同时,我也拿了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!
[外链图片转存中…(img-uLI570hl-1714527749950)]
[外链图片转存中…(img-z0UDrgHn-1714527749950)]