1. 程式人生 > >SSH和SSM專案用到的技術點

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&amp;characterEncoding=utf8&amp;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>&nbsp;
<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;

/