SSH和SSM專案用到的技術點
SSH
1.使用maven對專案的管理
Maven的生命週期:
clean(清理)--->compile(編譯)--->test(測試)--->package(打包)--->整合測試--->驗證--->部署
Maven的依賴範圍:
用於指定maven在哪個生命週期範圍內有效,我們平時開發專案,需要將jar匯入classpath中
maven為我們提供了三種classpath: 編譯 測試 執行
在scope標籤中通過<score></score>配置
score有6種:
1.compile:編譯 測試 執行都有效
2.provided:在編譯和測試有效,執行無效
3.runtime:在測試和執行有效,編譯期間無效 如:jdbc的驅動類
4.test:只在測試範圍有效 如: junit單元測試
5.system: 在編譯和測試有效,但與本機系統關聯,可移植性差
6.import:匯入的依賴範圍,它只使用在dependencyManagement中,表示從其它pom中匯入
2.使用SSH完成後端框架的整體搭建
Model: 模型,存放實體類(對應資料庫表中的實體類)
Dao: 資料訪問層,主要做資料庫的互動工作,把資料庫中的資料永久的儲存在硬碟中.
Service:管理具體的功能(做相應的業務邏輯處理),Action只負責管理,Service負責實施
Action: 控制器,管理業務排程和管理跳轉的.
從這裡可以跳轉到Service層,呼叫Service中的方法,可以對前端請求進行業務邏輯處理
Struts:控制介面和Action之間的關係
Hibernate: 連線資料庫操作,用的的Hibernate完成增刪改查
使用Hibernate註解,可以不用配置Hibernate.hbm.xml
@Entity
@Table(name = "manager")
@Id
@GeneratedValue(strategy = Generation.IDENTITY) //主鍵自動遞增
@Column(name = "mAccount")
四本一言:
dataSource.xml
<!-- 配置資料來源,資料庫連線池配置 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 資料庫驅動 -->
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<!-- 資料庫地址 -->
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/MHMS?useUnicode=true&characterEncoding=utf8&useSSL=false"/>
<!-- 資料庫使用者名稱 -->
<property name="user" value="root"/>
<!--資料庫密碼 -->
<property name="password" value="12345678"/>
</bean>
sessionFactory.xml
<!-- 配置hibernate session工廠類似於 cfg 配置 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 其它配置 -->
<property name="hibernateProperties">
<props>
<!-- 資料庫方言 -->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<!-- 自動建表 -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
<!-- 控制檯是否顯示sql語句 -->
<!--show_sql: 是否把hibernate執行的sql語句顯示到控制檯 -->
<prop key="hibernate.show_sql">true</prop>
<!-- format_sql:輸出到控制檯的sql語句是否進行排版,便於閱讀 -->
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<!-- 交由spring註解掃描實體類,省去了以前hibernate的配置檔案,自動生成資料表 -->
<property name="packagesToScan" value="com.xalo.model." />
</bean>
使用Spring註解進行依賴注入,不用配置beans.xml了
//在SpringIOC容器中指定一個Dao層的bean,如果value不指定預設該物件為id的類名,如果指定,id為value的值
@Repository(value = "userDao")
@Autowired //預設是byType
@Qualifier(value = "userDao") //配合上面的註解使用,byName
@Resource //javaEE提供的依賴注入的註解,1.6之後才可以使用
@Service(value = "userService")
@Controller(value = "userAction")
@Scope("prototype") //action是多例模式,需要經action設定為原型模式
使用Struts2註解,不需要配置struts.xml
//如果我們只是給前端返回資料,並不進行頁面的跳轉,package就繼承自json-default
@ParentPackage("json-default")
@nameSpace("/user")
@Action(value = "queryRoom", results = {
@Result(name = "success",type = "json", params = {"root", "result"})})
3.管理員登入介面的國際化
(1)前端:
三大指令: page include taglib
1)將html檔案轉化為jsp檔案
<% page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
2)匯入jsp標籤庫
<%@ taglib prefix="s" uri = "/struts-tags"%>
3)用 <s:text name = " "></s:text>標籤
<s:text name = "loginName"></s:text>
<input type = "text" id = "mAccount" placeholder = '<s:text name = "loginName"></s:text>'>
4)使用a標籤
<a href="aa.action?request_locale=zh_CN"><s:text name="chinese"></s:text></a>
<a href="aa.action?request_locale=en_US"><s:text name="english"></s:text></a>
(2)Action.java
public class CCAction extends ActionSupport {
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
(3)struts_loginAndRegister.xml
<package name = "login" extends="json-default">
<action name="aa" class="com.xalo.action.CCAction">
<result name="success">/loginAndRegisterForManager.jsp</result>
</action>
</package>
4.使用ajax進行前後端的資料互動
$.ajax({
type: "post" , //請求方式
url: "請求的路徑",
data: "向伺服器傳輸的資料" ,
success: function(data){ //data: 接收伺服器傳送過來的資料
var code = data["code"];
var msg = data["msg"];
alert(code + ":" + msg );
}
});
5.使用秒滴雲第三方簡訊驗證碼介面,實現員工忘記密碼之後修改密碼(根據使用者名稱修改密碼)
步驟:
1).部署好秒滴雲第三方簡訊驗證碼介面 類名: IndustrySMS.
2). 員工忘記密碼,通過賬戶名修改密碼
2.1將賬戶名儲存在session中
session.setAttribute("maccount",maccount);
2.2獲取隨機驗證碼並儲存在session中
String verifyCode = IndustrySMS.getRandomNum(6);
session.setAttribute("verifyCode", verifyCode);
// 獲取簡訊驗證碼
IndustrySMS.execute(manager.getMphone( ),verifyCode);
3)修改密碼
//獲取儲存在session中的maccount和verifyCode
String maccount = (String) session.getAttribute("maccount");
String verifyCode = (String) session.getAttribute("verifyCode ");
4)當前端輸入的驗證碼跟獲取到的驗證碼一致時,修改密碼
6.使用雙ajax在新增顧客的時候上傳圖片
1)將顧客資訊儲存在session中,以便在修改顧客頭像時使用.
session.setAttribute("custom",custom);
2)修改顧客頭像
2.1獲取前端傳遞過來的檔案的種類
String fileType = file.getContentType().substring(0,5);
2.2得到要儲存檔案的相對路徑
Strring path1 = session.getServletContext().getRealPath("/images");
2.3獲取前端傳遞過來的檔名稱
String path2 = file.getOriginalFilename();
2.4將相對路徑和檔名拼接
String path = path1 + path2;
2.5將檔案複製到目標路徑下(存入伺服器)
file.transferTo(new File(path));
2.6獲取儲存在session中的顧客資訊
Custom custom = (Custom) session.getAttribute("custom");
2.7獲取顧客賬號
String caccount = custom.getCaccount();
2.8根據顧客賬號修改顧客頭像
map = managerService.updatecImg("images/"+path2,caccount);
7.受用SSM完成後端框架的整體搭建
Entity: 模型,存放實體類(對應資料庫表中的實體類)
Dao: 資料訪問層,主要做資料庫的互動工作,把資料庫中的資料永久的儲存在硬碟中.
Service:管理具體的功能(做相應的業務邏輯處理),Controller只負責管理,Service負責實施
Controller: 控制器,管理業務排程和管理跳轉的.
從這裡可以跳轉到Service層,呼叫Service中的方法,可以對前端請求進行業務邏輯處理
Mybatis: @MapperScan指定要掃描mapper類的包的路徑
基於註解的對映方式,實現對資料的增刪改查,將sql語句寫下註解的括號中
@Update @Select
@Inser @Delete
<!-- 對映檔案的匯入 -->
<!--註解的使用:在mybatis的配置檔案中註冊這個對映介面(注意是class) -->
<mappers>
<mapper class="com.yangsheng.dao.ManagerDao"/>
</mappers>
8.使用Restful分風格開發整個專案
Restful:符合REST約束風格和原則的應用程式或設計
HTTP的請求動作一般分為四種:
1)GET: 獲取資源
2)POST: 新增資源
3)PUT: 修改資源
4) DELETE: 刪除資源
前端的請求只能是GET或POST,所以需要將POST請求轉化為PUT或者DELETE.
通過HiddenHTTPMethodFilter進行轉化.
在前端發起請求時,新增一個引數 _method,將此引數的值指定為請求路徑PUT/DELETE.
<form action = "testPut" method = "POST">
<input type = "hidden" name = "_method" value = "PUT">
<input type = "submit" value = "PUT">
</form>
9.使用Mybatis一對多進行關聯查詢
1)Entiry:
在各自的實體中分別寫和對方相關聯的屬性
2)在方表中增加一個欄位作為外來鍵,此外來鍵是和一方的主鍵關聯
3)Mybatis一方的配置檔案中resultMap中
<collecation property = "集合的屬性名" ofType = "集合元素的型別"></collecation>
多方的配置檔案中的resultMap中
<association property = "一方的屬性名" javaType = "屬性型別" ></association>
10.在管理員登入的時候設定攔截器
通過攔截器獲取客戶機資訊
(請求的URL地址, 請求的資源, 請求的URL地址中附帶的引數,來訪者的IP地址,來訪者的主機名
使用的埠號,請求使用的方法,獲取WEB伺服器的IP地址,獲取WEB伺服器的主機號)
public class LoginInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
11.通過junit對各個功能進行測試
SSH:
public class MyTest {
@org.junit.Test
public void test() {
ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
Manager manager = new Manager();
manager.setmAccount("zhoushuai");
manager.setmPassword("12345678");
manager.setmName("道玄真人");
manager.setmSex("男");
manager.setmAge(68);
manager.setmPhone("15022527037");
manager.setmEmail("[email protected]");
manager.setmAddress("青雲門");
ManagerAction action = context.getBean("managerAction",ManagerAction.class);
action.setManager(manager);
action.addManager();
SSM:
@Component
public class ServiceAndDaoTest {
@Resource
private ManagerServcieImpl service;
@Test
public void test() {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-mybatis.xml");
service = context.getBean(ManagerServcieImpl.class);
Custom custom = new Custom();
custom.setCaccount("dd123456");
custom.setCpassword("22222222");
custom.setCname("張三");
custom.setCage(20);
custom.setCphone("15022527037");
service.addCustom(custom);
}
檢視:
建立一張虛擬的表,本質上是對基表的一條select查詢語句
作用:
簡化複雜的查詢語句 限制資料訪問
例如:
create or replace view view_myemp_20 as select * from myemp where deptno = 20;
索引:
允許直接訪問資料表中某一行記錄的樹形結構,主要作用是為了提高查詢效率
索引一般是基於表中經常要查詢的某一列來建立
create unique index 索引名 on 表名(欄位名)
觸發器(可以看成是監聽器)
資料庫中於表相關的儲存的一段PL/SQL程式,主要作用是用於監聽表中的DML操作.
例如:
建立一個觸發器,每當向myemp中插入一個新員工時,控制檯會自動列印'成功插入員工'
create or replace trigger trigger_savenewemp
after insert on myemp
declare
begin
dbms_output.put_line('成功插入員工')
end;
/
觸發器的使用場景:
1.複雜的安全性檢查
2.資料的確認
3.資料庫的審計
4.資料庫的備份和同步
儲存過程:
資料庫中的一組提前編譯的PL/SQL語句程式語句集
其中可以對資料一些通用複雜操作進行封裝,只需要編譯一次,以後每次執行不需要重複編譯
可以反覆呼叫,減少工作量
建立儲存過程:列印helloword
create or replace procedure sayHello
AS
begin
dbms_output_line('helloworld')
end;
/
呼叫儲存過程
begin
begin sayHello();
end;
/