Python yeild
1 | def myGenerator(max): |
带有yeild的函数就是generator。yeild每次被执行到,都会返回一个迭代值。下一次执行时从yeild所在的下一个语句继续执行。
CLIでVue.jsを作る
以下のコマンドを使って、バージョン確認する。1
2node -v
npm -v
バージョン古いときは以下のコマンドで更新できる。1
npm -g install npm
次のステップはvue-vli
のインストール。1
npm install -g @vue/cli
2.x バージョンのvueは
npm install -g vue-cli
でインストールする
次はプロジェクトの親フォルダーへ移動して、プロジェクトを作る。
Webページのプロジェクトを作るため、以下のコマンドを実行する。1
vue init webpack myVueProject
プロジェクト名などはディフォルで設定してくれるので、エンターキー連発でいい。router
test
などの機能も初期化したい場合は、該当の確認で Y
を入力すればいい。
これで、Vue.jsのプロジェクト作成完了。
最後は npm run build
でビルドして、 npm run dev
でサーバーを起動すればいい。
Vue.js プロジェクトの構造
Vue.jsプロジェクトの構造
- src
- components: 各モジュールはここで定義する
- main.js: 入り口のjs
- router
- index.js: ルーター設定
- App.vue
- assets: 画像などのリソース
- index.html: 画面入り口
- static: 静的リソース
- test
- config
- index.js: 各種設定
- build
- package.json
- node_modules
Vueファイルの構造
Vueファイルは以下3つの部分がある。
[1]HTML1
2
3
4
5
6<template>
<div id="app">
<img alt="Vue logo" src="./assets/logo.png">
<HelloWorld msg="Welcome to Your Vue.js App"/>
</div>
</template>
[2]JavaScript1
2
3
4
5
6
7
8
9
10<script>
import HelloWorld from './components/HelloWorld.vue'
export default {
name: 'App',
components: {
HelloWorld
}
}
</script>
[3]css1
2
3
4
5
6
7
8
9
10<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
JUnit5から使える @ParameterizedTest
@ParameterizedTest
は指定のテストメソッドに違う引数を順番に渡して処理することで、複数のテストを実現する方法。JUnit5の新しい機能として、使うとき以下のパッケージを依存関係に追加する必要がある。
1 | org.junit.jupiter:junit-jupiter-params |
使ってみる
@ParameterizedTest
でパラメーター指定のテストケースを声明する。そして@ValueSource
を利用してパラメーターを指定する(整数:1,2,3)。
1 |
|
これで1つのメソッドでテストを3回実行した。@ParameterizedTest
はorg.junit.jupiter.params.provider
パッケージ下のインタフェースと一緒に使う必要がある。
DisplayName of ParameterizedTest
@ParameterizedTest
はパラメーターごとにテストケースを命名できる。
1 | "input is {0} {1} {2}") (name = |
使えるplaceholderは以下となる。
{index}
テストケースの番号{0~n}
指定番号の引数の値(0から){arguments}
全ても引数{displayName}
@DisplayName
で指定する内容、@DisplayName
がない場合はテストメソッドの名前
InjectMocksのインジェクト方法
@InjectMocks
をつけると、対象インスタンスのフィルドに@Mock
されたインスタンスを差し込むことができる。
1 |
|
実現方法
InjectMocks
のJavadocを読むと、フィルドのinject方法は3つあります。
Constructor injection;
1つ目はコンストラクターを利用してモックインスタンスを設定する。この方法はデフォルトで引数の数が一番多いコンストラクターを利用する。
要注意なことは、必要なモックインスタンスが見つからない場合、その引数はnull
となる。
引数にモックできないタイプ(基本型)がある場合、デフォルトのコンストラクターでInjectMocks
のインスタンスを作って別の方法でInjectを実現する。Property setter injection;
2つ目はとてもわかりやすくて、フィルドのsetter
メソッドを利用して、モックインスタンスを差し込む。
該当のsetter
メソッドを探すとき、まずフィルドのタイプを利用する。同じタイプのフィルドが存在する場合、モックインスタンスの名前を利用する。
という理由で、モックインスタンスを定義するとき、できる限りInject
対象のフィルドと同じ名前にする方がいい。Constructor Injection
でデフォルトコンストラクターを利用する場合、モックインスタンスの差し込むはこの方法で実現される。
- Field injection;
フィルドのsetter
がない場合、直接設定でInject
を実現する。ルールはProperty setter injection
と同じ。
Mockito使い始めて見る
when().thenReturn()
を利用して、public
メソッドの戻る値を指定できます。1
2
3
4
5
6
public void add_with_when() {
List<String> mockedList = mock(List.class);
when(mockedList.size()).thenReturn(10);
assertThat(mockedList.size(), is(10));
}
ここは1つ注意しなければならないことがあります。モックで作成したオブジェクトの全てのメソッドが偽物になります。下記のadd()
はモックされたため、リストに追加する処理はありません。1
2
3
4
5
6
7
public void add_without_when() {
List<String> mockedList = mock(List.class);
mockedList.add("A");
mockedList.add("B");
mockedList.add("C");
assertThat(mockedList.size(), is(0));
Answers.CALL_REAL_METHODS
を利用すれば、本物のメソッドを呼べます。
1 |
|
web.xml 的Servlet配置
什么是 web.xml
web.xml是Java工程中用来设置初始化配置信息的文件。xml的书写规则是有Schema文件来定义的。
web.xml使用的schema一般是Sun定义的,标注在标签<web-app>
中。
web.xml中设置Servlet的常用标签
【1】servlet
1 | <!-- servlet的配置 --> |
配置servlet标签需要配置两个,一个是servlet本身,另一个servlet-mapping是servlet的映射信息。
servlet的servlet-name可以自定义,一般为servlet的类名,而servlet-class则是servlet类的全路径。
servlet-mapping的servlet-name是对应的servlet名,url-pattern则是我们输入到浏览器地址栏中的用来调用servlet的url。
url-pattern | |
---|---|
精确匹配 | /servlet |
模糊匹配 | /* |
模糊匹配 | /path/* |
模糊匹配 | *.后缀 |
url-pattern除了上面的基本写法之外,还要注意几点:
/
或者*
, url不能直接用servlet名开头。- 同时使用两种模糊匹配是非法路径
- 匹配优先级:精确匹配最优先,后缀匹配最后
【2】初始参数
可以设置两种参数用来初始化servlet,一种是init-param,一种时context-param。
关于两种参数的区别:init-param and context-param
init-param是给特定servlet设置的参数,所以写在<servlet>
下面
1 | <servlet> |
使用的时候通过getServletConfig().getInitParamter("userName")
来调用。
context-param是为webApp全局准备的参数,直接定义在<web-app>
标签下,通过getServletContext().getInitParamter("userName")
来调用
1 | <web-app> |
【3】特殊标签
- 错误处理
1
2
3
4
5
6
7
8
9
10
11<error-page>
<error-code>404</error-code>
<location>/error404.jsp</location>
</error-page>
...
<error-page>
<exception-type>java.lang.Exception<exception-type>
<location>/exception.jsp<location>
</error-page> 过滤器
1
2
3
4
5
6
7
8<filter>
<filter-name> </filter-name>
<filter-class> </filter-class>
</filter>
<filter-mapping>
<filter-name> </filter-name>
<url-pattern> </url-pattern>
</filter-mapping>监听器
1
2
3<listener>
<listener-class></listener-class>
</listener>会话
1
2
3
4<session-config>
<!-- 以分为单位 -->
<session-timeout> </session-timeout>
</session-config>欢迎页
找不到index1,就会加载index2
1 | <welcome-file-list> |
Servlet 基础
定义
Servlet(Server Applet) 可以翻译为Java小服务程序或者服务连接器。是用Java编写的服务器端程序,具有独立于平台和协议的特性。主要的功能是交互式地浏览和生成数据,生成动态Web内容。
狭义的Servlet是指Java的一个接口,广义的Servlet是指任何实现了这个接口的类。从原理上讲Servlet可以响应任何类型的请求,但绝大多数情况侠Servlet只用来扩展基于HTTP协议的Web服务器。
实现过程
Servlet交互式地浏览和生成数据的过程为:
- 客户端发送请求到服务器
- 服务器将请求信息发送至Servlet
- Servlet生成响应内容并传给服务器。
- 服务器将响应返回客户端
生命周期
- 客户端请求Servlet
- 加载Servlet到内存
- 生成Servlet实例,调用init()初始化
- server调用service()方法,将一个请求对象和一个响应对象传递给service()
- service()调用资源处理请求,使用响应对象的方法将响应传回server,再传回到客户端
- (一般是server关闭时)调用destroy()方法
Day 3 面向对象进阶
slots
Python是动态语言,我们可以随时为对象绑定新的属性和方法。但是如果我们想限制类型的对象所能绑定的属性,则需要用到__slots__
。
1 | class Person(object): |
特殊方法
- 静态方法使用
@staticmethod
修饰 - 类方法使用
@classmethod
来修饰, 类方法的第一个参数必须是cls
,表示当前类的对象