登錄功能_分析

登錄功能_實作_Service&Dao
生成UserService與測驗邏輯
com\wzx\service\TestUserService.java
//測驗
public class TestUserService {
@Test
public void test01() {
//將用戶輸入賬號與密碼發到后臺
UserService userService = new UserService();
//1:查找用戶資料
User user = userService.findUserByName("jackhello");
//2:根據資料, 正確,錯誤,不存在,
if (user == null) {
System.out.println("不存在");
} else {
//1:3種情況
System.out.println("存在");
}
}
@Test
public void test02() {
//將用戶輸入賬號與密碼發到后臺
UserService userService = new UserService();
//1:查找用戶資料
User user = new User();
user.setUsername("jackhello");
user.setPassword("123456");
int code = userService.login(user);
//2:根據資料, 正確,錯誤,不存在,
if (code == -1) {
System.out.println("未注冊");
} else if (code == -2) {
System.out.println("注冊,但是未激活");
} else if (code == -3) {
System.out.println("注冊,已激活,密碼不對");
} else if (code == 1) {
System.out.println("注冊,已激活,密碼對");
}
}
}
com\wzx\domain\User.java
//用戶資料
public class User {
private int uid;
private String username;
private String password;
private Date birthday;
private String name;
private String sex;
private String telephone;
private String email;
private char status;
private String code;
,,,,
撰寫UserDao方法與測驗
com\wzx\dao\UserDaoTest.java
public class UserDaoTest {
@Before
public void init() throws Exception {
}
@After
public void destory() throws Exception {
}
@Test
public void test01() {
UserDao userDao = MySessionUtils.getSession().getMapper(UserDao.class);
//查找物件
User user = userDao.findByName("jackhello");
//查看物件
System.out.println(user);
}
}
src\main\java\com\wzx\dao\UserDao.java
public interface UserDao {
//select * from tab_user where username = 'jackhello'
User findByName(String name);
}
com\wzx\dao\UserDao.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wzx.dao.UserDao">
<select id="findByName" parameterType="string" resultType="user">
select * from tab_user where username = #{username}
</select>
</mapper>
SqlMapConfig.xml
<!-- 一個mapper標簽可以指定一個映射檔案-->
<mappers>
<mapper resource="com/wzx/dao/UserDao.xml"/>
</mappers>
Junit的注解
public class UserDaoTest {
// @Before:用來初始化@Test方法要使用到的資源
// @After:用來釋放資源
// @Before ->@Test -> @After
private SqlSession session;
private UserDao userDao;
@Before
public void init() throws Exception {
System.out.println("Before");
//創建Session物件
session = MySessionUtils.getSession();
userDao = session.getMapper(UserDao.class);
}
@After
public void destory() throws Exception {
System.out.println("After");
//提交與關閉session
session.commit();
session.close();
}
@Test
public void test01() {
//查找物件
User user = userDao.findByName("jackhello");
//查看物件
System.out.println(user);
}
@Test
public void test02() {
User user = userDao.findByName("jackhello");
//查看物件
System.out.println(user);
}
}
撰寫UserService的login方法
public int login(User user) {
//賬號密碼
UserDao userDao = MySessionUtils.getSession().getMapper(UserDao.class);
User u = userDao.findByName(user.getUsername());
//比對資料庫的賬號密碼
if (u == null) {
return -1;//找不到jack
} else {
//判斷是否是激活的賬戶
if ('Y'== u.getStatus()) {
//是激活用戶
if (u.getUsername().equals(user.getUsername()) && u.getPassword().equals(user.getPassword())) {
return 1;//提示登錄成功
} else {
return -2;//賬號或者密碼出錯
}
} else {
return -3;//已激活
}
}
}
ThreadLocal介紹***
- (1)在實際開發中,SqlSession屬于Dao層代碼,不允許出現在Service層中
洗掉Mybastis依賴 - (2)ThreadLocal是什么?
java.lang.ThreadLocal 該類提供了執行緒區域 (thread-local) 變數,用于在當前執行緒中共享資料, - (3)有什么特點?
》1 ThreadLocal工具類底層就是一個Map,key存放的當前執行緒,value存放需要共享的資料,
》2 使用哪個執行緒存的,就只能使用哪個執行緒取

模擬ThreadLocal類
public class ThreadLocal{
private Map<Thread,Object> map = new HashMap<Thread,Object>();
public void set(Connection conn){
map.put(Thread.currentThread(),conn); //以當前執行緒物件作為key
}
public Object get(){
map.get(Thread.currentThread()); //只有當前執行緒才能取出value資料
}
}
- 在專案中總會碰到新的知識 , 不會可以寫個測驗
public class TestThreadLocal {
private ThreadLocal<String> map = new ThreadLocal<String>();
@Before
public void test00(){
System.out.println("Before");
System.out.println(Thread.currentThread());
map.set("hello");//map.put(Thread.currentThread(),"hello")
}
@Test
public void test01(){
System.out.println("Test");
System.out.println(Thread.currentThread());
System.out.println(map.get());map.get(Thread.currentThread())
}
}
ThreadLocal改造MySessionUtils

com\wzx\util\MySessionUtils2.java
//Session工具類
public class MySessionUtils2 {
private static SqlSessionFactory sessionFactory;
//static 靜態代碼,在類加載的時候執行一次,且只執行一次
static{
// 》1 創建SqlSessionFactoryBuilder物件
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 》2 創建SqlSessionFactory物件
InputStream inputStream = MySessionUtils2.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml");
sessionFactory = sqlSessionFactoryBuilder.build(inputStream);//加載核心組態檔 參1 輸入流
// 》3 加載SqlMapConfig.xml組態檔
}
//A: 定義一個ThreadLocal集合,本質是Map<Thread,Object> map
private static ThreadLocal<SqlSession> map = new ThreadLocal<SqlSession>();
public static SqlSession getSession() {
//查找在local中,是否有對應的SqlSession
SqlSession sqlSession = map.get(); //map.get(Thread.currentThread())
if (sqlSession != null) {
//有就直接回傳給呼叫者使用
return sqlSession;
} else {
//沒有就創建一個新的,并且保存在local
sqlSession = sessionFactory.openSession();
//保存
map.set(sqlSession);
return sqlSession;
}
}
public static void commitAndClose() {
//將來進行寫操作,之后需要提交,我們定義的方法
SqlSession session = map.get();
if (session != null) {
session.commit();//提交
session.close();//釋放
//已經關閉的session不能留在local
//所以要洗掉
map.remove();
}
}
public static void rollbackAndClose() {
//將來進行寫操作,之后需要提交,我們定義的方法
SqlSession session = map.get();
if (session != null) {
session.rollback();//回滾
session.close();//釋放
//已經關閉的session不能留在local
//所以要洗掉
map.remove();
}
}
}
登錄_前臺_表單校驗1
- (0)實際專案中資料的格式都是在瀏覽器校驗,why?
提升用戶體驗,并減輕服務器壓力, - (1)校驗用戶名 /^\w{8,20}$/ 單詞字符,長度8到20位
- (2)校驗密碼 /^\w{8,20}$/ 單詞字符,長度8到20位
- (3)校驗密碼郵箱 = /^\w+@\w+.\w+$/ 郵箱 xxx@qq.com
- 正則運算式
正則運算式.test(字串)
回傳一個布林值
true 格式正確
false 格式錯誤
login.html
<script type="text/javascript" >
function checkUserName(){
//獲取輸入框的值
var username = $("#username").val();
//正則運算式 定義一個規則,執行test方法,符合規則回傳true,否則回傳false
var reg = /^\w{8,20}$/ ;
var flag = reg.test(username); //判斷
//如果符合要求,設定輸入框邊框是正常,否則設定紅色
if(flag){
$("#username").css("border","");
}else{
$("#username").css("border","1px solid red");
}
//alert(flag)
return flag;
}
function checkPassword(){
//判斷密碼輸入框的值是否合法
var username = $("#password").val();
var reg = /^\w{8,20}$/ ;
var flag = reg.test(username); //判斷
if(flag){
$("#password").css("border","");//無色框
}else{
$("#password").css("border","1px solid red");//紅框
}
//alert(flag)
return flag;
}
$(function () {
// 判斷兩個輸入框架的是否格式正確
$("#username").blur(checkUserName);//輸入框失去焦點
// 如果正確,使用ajax發送請求到servlet
$("#password").blur(checkPassword);
//撰寫ajax請求
})
</script>
登錄_前臺_表單校驗2
- (1)submit函式
控制表單是否提交,函式回傳true,表單提交,回傳false表單不提交
此處
在ajax提交,則寫false
頁面是一個帶有submit按鈕的form表單 ,可以攔截
<form id="loginForm" action="" method="post" accept-charset="utf-8">
...
<input type="submit" value="登錄">
</form>
$("#loginForm").submit(function () {
alert("攔截下來")
//寫false,表示攔截
return false;
})
使用jquery撰寫 ajax請求
$("#btn_login").click(function () {
//要求兩個值正確,我們才做提交
if(checkUserName()&&checkPassword()){
var un = $("#username").val()
var pw = $("#password").val()
//alert(un+pw)
//寫提交
$.ajax({
url:"loginServlet",
async:true,
data:"username="+un+"&password="+pw,
type:"post",
dataType:"json",
success:function (data) {
alert(data)
},
error:function () {
alert("服務器發生了錯誤")
}
});
}
})
登錄后臺_Servlet代碼實作
- (1)Servlet只做三件事
》接收請求獲取引數
》處理引數
》將結果回應給瀏覽器
com\wzx\web\servlet\LoginServlet.java
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲取請求引數
Map<String, String[]> map = request.getParameterMap();
User u = new User();
try {
//參1 javaBean 參2 map
BeanUtils.populate(u,map);//將map里面所有的引數賦值給javaBean
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//處理引數
UserService userService = new UserService();
int code = userService.login(u);
//回應給瀏覽器 ajax 是回應json給瀏覽器就可以
ResponseInfo info = new ResponseInfo();
info.setCode(code);
if(code == - 1){
info.setData("用戶不存在");
}else if(code == 1){
info.setData("登錄成功");
}else if(code == -2){
info.setData("賬號密碼出錯");
}else if(code == -3){
info.setData("賬號未激活");
}
//轉成json
String json =new ObjectMapper().writeValueAsString(info);
response.getWriter().println(json);
}
}
中文亂碼使用過濾器
com\wzx\web\filter\CharchaterFilter.java
/**
* 解決全站亂碼問題,處理所有的請求
*/
@WebFilter("/*")
public class CharchaterFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse rep, FilterChain filterChain) throws IOException, ServletException {
req.setCharacterEncoding("utf-8");
// 處理回應亂碼
rep.setContentType("text/html;charset=utf-8");
// 放行請求
filterChain.doFilter(req,rep);
}
public void destroy() {
}
}
新建login.jsp
復制login.html的內容,jsp支持 el運算式與jstl 標簽庫
處理提示
$("#btn_login").click(function () {
//要求兩個值正確,我們才做提交
if(checkUserName()&&checkPassword()){
var un = $("#username").val()
var pw = $("#password").val()
//alert(un+pw)
//寫提交
$.ajax({
url:"loginServlet",
async:true,
data:"username="+un+"&password="+pw,
type:"post",
dataType:"json",
success:function (data) {
// alert(data) {"code":1,"data":"登錄成功"}
if(1 == data.code){
//跳轉到主頁 index.html
$("#errorMsg").html("");
window.location="index.html"
}else{
//顯示在界面上
$("#errorMsg").html(data.data);
}
},
error:function () {
alert("服務器發生了錯誤")
}
});
}
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/143300.html
標籤:其他
上一篇:stm32f030f4p6單片機,怎么能讓單片機收到串口資料后過濾掉另一種協議的資料
下一篇:又是沒有專業技術的一篇嘿嘿!
